diff --git a/.vpython3 b/.vpython3
index 5390a9c..83879a4 100644
--- a/.vpython3
+++ b/.vpython3
@@ -394,3 +394,10 @@
     platform: "linux_aarch64"
   >
 >
+
+# Used by:
+#   testing/script/run_variations_smoke_tests.py
+wheel: <
+  name: "infra/python/wheels/selenium-py3"
+  version: "version:3.14.0"
+>
diff --git a/DEPS b/DEPS
index 323a086..518473a4 100644
--- a/DEPS
+++ b/DEPS
@@ -213,7 +213,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:d46a9c7ad4e38935bbacb01602fc1d09a162884b',
+  'luci_go': 'git_revision:462d0a9cdbe947cd652fcd0c54f64ebc712858a5',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -245,23 +245,23 @@
   # 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': '80428f7c2e96bca869c5edfb50b0a83d9addcd7a',
+  'skia_revision': '3518875c21ea43cb1d7c35f3d023b172a6426aa2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '91adad8c70e7817eada893e4b9457dbc5812fca3',
+  'v8_revision': 'ddf3c0a3f5b701ff55ea61be84bed5a9a6a63e35',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '57933493dd3bc21214ba351ad4e44b60efffe711',
+  'angle_revision': 'b756b2c2744aeff7a8207a44fe8772b1c5c97c9d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '75d79f219033459c749f203557656d31fceff6b1',
+  'swiftshader_revision': '6014f10de5542e5f2727583b43dd35b737643d0c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': 'ffeb67faf715475f6e463d65c368f556780adf19',
+  'pdfium_revision': 'c16450720558d1ae6eb3bcd3a3695ae4192c8a2b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -292,7 +292,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': '946e1353eaa34872d0b138a13820fc03a782c545',
+  'freetype_revision': '56d182a74d90cde8753d5ec28d37f748f909c729',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -320,7 +320,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '1f74767043f4410f24ddcc7cf65e067c91e89265',
+  'devtools_frontend_revision': '6abfe068bb1e3e203462fdf4d25825ee1287c84c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -356,11 +356,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'shaderc_revision': '7ca718f1a21bd917ab71315a037f1727abf5e41a',
+  'shaderc_revision': '96b1dd72a827304817470274a470c4d3b2293451',
   # 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': '6c905ed70556480d1d497182e50f1f329710c4e4',
+  'dawn_revision': '012840b75229c32924ed1dfcd643be4104fae155',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -663,7 +663,7 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '9abc50d426dee6f3052498a8eb05fe8bc26ddfcd',
+    'url': Var('chromium_git') + '/website.git' + '@' + '1458c7dec61fcadb57f9cebb556a218dadd7a4ba',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -687,7 +687,7 @@
   },
 
   'src/ios/third_party/material_components_ios/src': {
-      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'e4df9e3aa8ff0fa7c2170a8e23f308406a483230',
+      'url': Var('chromium_git') + '/external/github.com/material-components/material-components-ios.git' + '@' + 'd9120b2bdec5cd9cb52822ab0b4caa1d360b5dab',
       'condition': 'checkout_ios',
   },
 
@@ -779,7 +779,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'dXXn-xiY_r8w06KhMCRC-G6jEXqoXCOoQTVekmpvktcC',
+          'version': 'lm1hYgyIhU0Sj0zojQpmEwmjsEV9NNrsfq7uyb8WWEYC',
         },
       ],
       'dep_type': 'cipd',
@@ -851,7 +851,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': '3RcBXDFZuIJBL1I-gTWwvfRXm6fCwxFkV3tY3ZodF1YC',
+          'version': '-qxJHfqWawBjacl9Uo4Q7C8p8kibjIFWMiQMm4jg9swC',
       },
     ],
     'condition': 'checkout_android',
@@ -1090,7 +1090,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '60206c40077637a03cae6e6edbc641f702cf5ec9',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'f537138fb7019fc321cbda339c8ce4599499af8e',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
@@ -1121,7 +1121,7 @@
     Var('chromium_git') + '/external/github.com/google/farmhash.git' + '@' + '816a4ae622e964763ca0862d9dbd19324a1eaf45',
 
   'src/third_party/ffmpeg':
-    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '1edb3eb4914e0545e9775939ead4a5795746f993',
+    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '574c39cce3231c69bc9a02ac475c27d944bdb113',
 
   'src/third_party/flac':
     Var('chromium_git') + '/chromium/deps/flac.git' + '@' + 'af862024c8c8fa0ae07ced05e89013d881b00596',
@@ -1301,7 +1301,7 @@
     Var('chromium_git') + '/external/libaddressinput.git' + '@' + '3b8ee157a8f3536bbf5ad2448e9e3370463c1e40',
 
   'src/third_party/libaom/source/libaom':
-    Var('aomedia_git') + '/aom.git' + '@' +  'fae44ad0475640af761691a06b5fbeb5c147b84e',
+    Var('aomedia_git') + '/aom.git' + '@' +  'c9feb209a41343981c215072583d385bdda2bab1',
 
   'src/third_party/libavif/src':
     Var('chromium_git') + '/external/github.com/AOMediaCodec/libavif.git' + '@' + Var('libavif_revision'),
@@ -1473,7 +1473,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f9bc537f0f667d6959481e5beb5b4bd4cdbac53b',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '8d95cd174a866457acd2ef57eae1ee43c6799d96',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1655,7 +1655,7 @@
   'src/third_party/usrsctp/usrsctplib':
     Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + '62d7d0c928c9a040dce96aa2f16c00e7e67d59cb',
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@fe093f4789c21b9d5efa2c65c00df4ac5ea53234',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@5b6cf1b845ca80985d0806e1622c03690c02ea51',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1694,7 +1694,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ed042183cddff326234a692cad0de93c1eb8e81f',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'd5f98ce8cfcd561b4ee0023ad5a33e88822be78b',
+    Var('webrtc_git') + '/src.git' + '@' + 'e4836121649400b78407a5237bb2a1f8458ee9c6',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1721,7 +1721,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/linux-amd64',
-          'version': 'LgeCXIY3gi1Rfj7pynL3hYsQs5y8tNdlFMIszyRTLZEC',
+          'version': 'x5DuM_cFqeCFMlXDtBAVjbyWLSGKdFH2UEf-w1ZKrJAC',
         },
       ],
       'dep_type': 'cipd',
@@ -1731,7 +1731,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': 'nhTKac3KbxoylERKghU9jdu1eGQS6PbB9eyujt39ZrEC',
+          'version': 'rL1WCW55dVVbB31YPyHoH7cdor3y_GdjUbUiAGRpScgC',
         },
       ],
       'dep_type': 'cipd',
@@ -1742,7 +1742,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'b-tLSYN9b31qZ1zBD9eXJEh8J0yogVLXg2EFmGUmOiMC',
+          'version': 'D9f-ltgviMq1P9HlpfREM3YKpCL6XVLKFuBQw9qO7SIC',
         },
       ],
       'dep_type': 'cipd',
@@ -1753,7 +1753,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-arm64',
-          'version': 'JmAZJuBerZSzNig9T_OyBs4oVmJQ1cjqgC3F_CA37yYC',
+          'version': 'XlO5MLseLPLIFzjP_ZqyzC_mL0jxKtTHw6hSvu2ZfqMC',
         },
       ],
       'dep_type': 'cipd',
@@ -1764,7 +1764,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@314b06c676d9138d97ca91feaa3d3264d324e0a0',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@81bfd691d57c4c8e6fd302799bc5e6a03570a0d0',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 590d617..58487bb4 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -3569,13 +3569,9 @@
   """Checks if a .pydeps file needs to be regenerated."""
   # This check is for Python dependency lists (.pydeps files), and involves
   # paths not only in the PRESUBMIT.py, but also in the .pydeps files. It
-  # doesn't work on Windows and Mac, so skip it on other platforms and skip if
-  # no pydeps files are affected.
+  # doesn't work on Windows and Mac, so skip it on other platforms.
   if not input_api.platform.startswith('linux'):
     return []
-  if not any(f.LocalPath().endswith('.pydeps') for f in input_api.AffectedFiles(
-             include_deletes=True)):
-    return []
 
   is_android = _ParseGclientArgs().get('checkout_android', 'false') == 'true'
   pydeps_to_check = _ALL_PYDEPS_FILES if is_android else _GENERIC_PYDEPS_FILES
@@ -3587,8 +3583,8 @@
     # os_path.exists is relative to src repo.
     # Therefore if os_path.exists is true, it means f.LocalPath is relative
     # to src and we can conclude that the pydeps is in src.
-    if input_api.os_path.exists(f.LocalPath()):
-      if f.LocalPath().endswith('.pydeps'):
+    if f.LocalPath().endswith('.pydeps'):
+      if input_api.os_path.exists(f.LocalPath()):
         if f.Action() == 'D' and f.LocalPath() in _ALL_PYDEPS_FILES:
           results.append(output_api.PresubmitError(
               'Please update _ALL_PYDEPS_FILES within //PRESUBMIT.py to '
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py
index 8eabe9b..f3d929b8 100755
--- a/PRESUBMIT_test.py
+++ b/PRESUBMIT_test.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -604,7 +604,7 @@
       MockAffectedFile('A.py', []),
     ]
 
-    def mock_check_output(cmd, shell=False, env=None):
+    def mock_check_output(cmd, shell=False, env=None, encoding=None):
       self.assertEqual('CMD --output A.pydeps A --output ""', cmd)
       return self.checker._file_cache['A.pydeps']
 
@@ -613,7 +613,6 @@
     results = self._RunCheck()
     self.assertEqual(0, len(results), 'Unexpected results: %r' % results)
 
-  @unittest.skip("Disabled, see crbug.com/1289871")
   def testRelevantPyOneChange(self):
     # PRESUBMIT.CheckPydepsNeedsUpdating is only implemented for Linux.
     if not self.mock_input_api.platform.startswith('linux'):
@@ -623,7 +622,7 @@
       MockAffectedFile('A.py', []),
     ]
 
-    def mock_check_output(cmd, shell=False, env=None):
+    def mock_check_output(cmd, shell=False, env=None, encoding=None):
       self.assertEqual('CMD --output A.pydeps A --output ""', cmd)
       return 'changed data'
 
@@ -633,7 +632,6 @@
     self.assertEqual(1, len(results))
     self.assertIn('File is stale', str(results[0]))
 
-  @unittest.skip("Disabled, see crbug.com/1289871")
   def testRelevantPyTwoChanges(self):
     # PRESUBMIT.CheckPydepsNeedsUpdating is only implemented for Linux.
     if not self.mock_input_api.platform.startswith('linux'):
@@ -643,7 +641,7 @@
       MockAffectedFile('C.py', []),
     ]
 
-    def mock_check_output(cmd, shell=False, env=None):
+    def mock_check_output(cmd, shell=False, env=None, encoding=None):
       return 'changed data'
 
     self.mock_input_api.subprocess.check_output = mock_check_output
@@ -653,7 +651,6 @@
     self.assertIn('File is stale', str(results[0]))
     self.assertIn('File is stale', str(results[1]))
 
-  @unittest.skip("Disabled, see crbug.com/1289871")
   def testRelevantAndroidPyInNonAndroidCheckout(self):
     # PRESUBMIT.CheckPydepsNeedsUpdating is only implemented for Linux.
     if not self.mock_input_api.platform.startswith('linux'):
@@ -663,7 +660,7 @@
       MockAffectedFile('D.py', []),
     ]
 
-    def mock_check_output(cmd, shell=False, env=None):
+    def mock_check_output(cmd, shell=False, env=None, encoding=None):
       self.assertEqual('CMD --output D.pydeps D --output ""', cmd)
       return 'changed data'
 
@@ -675,7 +672,6 @@
     self.assertIn('Android', str(results[0]))
     self.assertIn('D.pydeps', str(results[0]))
 
-  @unittest.skip("Disabled, see crbug.com/1289871")
   def testGnPathsAndMissingOutputFlag(self):
     # PRESUBMIT.CheckPydepsNeedsUpdating is only implemented for Linux.
     if not self.mock_input_api.platform.startswith('linux'):
@@ -691,7 +687,7 @@
       MockAffectedFile('A.py', []),
     ]
 
-    def mock_check_output(cmd, shell=False, env=None):
+    def mock_check_output(cmd, shell=False, env=None, encoding=None):
       self.assertEqual('CMD --gn-paths A --output A.pydeps --output ""', cmd)
       return 'changed data'
 
diff --git a/WATCHLISTS b/WATCHLISTS
index 21dc9b0..2487ebcf 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -671,7 +671,8 @@
       'filepath': 'cc/scheduler'
     },
     'certificate_transparency': {
-      'filepath': 'components/certificate_transparency/'\
+      'filepath': 'chrome/browser/ssl/sct_'\
+                  '|components/certificate_transparency/'\
                   '|net/cert/ct_'\
                   '|net/cert/multi_log_ct_verifier'\
                   '|net/cert/sct_status_flags.h'\
@@ -679,7 +680,8 @@
                   '|net/cert/signed_tree_head'\
                   '|net/services/network/sct_auditing/'\
                   '|net/services/network/ct_'\
-                  '|net/test/ct_'
+                  '|net/test/ct_'\
+                  '|services/network/sct_auditing/'
     },
     'chrome_camera_app': {
       'filepath': # Exclude string translation .xtb files.
diff --git a/android_webview/browser/gfx/aw_vulkan_context_provider.cc b/android_webview/browser/gfx/aw_vulkan_context_provider.cc
index 5d1c5fd8..9cbbabec 100644
--- a/android_webview/browser/gfx/aw_vulkan_context_provider.cc
+++ b/android_webview/browser/gfx/aw_vulkan_context_provider.cc
@@ -40,12 +40,20 @@
 
   // If we are re-initing, we don't need to re-load the shared library or
   // re-bind unassociated pointers. These shouldn't change.
-  if (!vulkan_function_pointers->vulkan_loader_library) {
-    base::NativeLibraryLoadError native_library_load_error;
-    vulkan_function_pointers->vulkan_loader_library = base::LoadNativeLibrary(
-        base::FilePath("libvulkan.so"), &native_library_load_error);
-    if (!vulkan_function_pointers->vulkan_loader_library)
-      return false;
+  bool need_bind_unassigned = false;
+  {
+    base::AutoLock lock(vulkan_function_pointers->write_lock);
+    if (!vulkan_function_pointers->vulkan_loader_library) {
+      base::NativeLibraryLoadError native_library_load_error;
+      vulkan_function_pointers->vulkan_loader_library = base::LoadNativeLibrary(
+          base::FilePath("libvulkan.so"), &native_library_load_error);
+      if (!vulkan_function_pointers->vulkan_loader_library)
+        return false;
+    }
+    need_bind_unassigned = !vulkan_function_pointers->vkGetInstanceProcAddr;
+  }
+
+  if (need_bind_unassigned) {
     if (!vulkan_function_pointers->BindUnassociatedFunctionPointers())
       return false;
   }
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc
index ffa22166..75cbba62a 100644
--- a/android_webview/lib/aw_main_delegate.cc
+++ b/android_webview/lib/aw_main_delegate.cc
@@ -267,6 +267,9 @@
 
     // TODO(crbug.com/1100993): Web Bluetooth is not yet supported on WebView.
     features.DisableIfNotSet(::features::kWebBluetooth);
+
+    // TODO(crbug.com/933055): WebUSB is not yet supported on WebView.
+    features.DisableIfNotSet(::features::kWebUsb);
   }
 
   android_webview::RegisterPathProvider();
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn
index 02bf56f..9c4b3d73 100644
--- a/android_webview/nonembedded/BUILD.gn
+++ b/android_webview/nonembedded/BUILD.gn
@@ -21,6 +21,7 @@
   sources = [
     "java/src/org/chromium/android_webview/nonembedded/AwComponentUpdateService.java",
     "java/src/org/chromium/android_webview/nonembedded/AwNonembeddedUmaRecorder.java",
+    "java/src/org/chromium/android_webview/nonembedded/AwPureJavaExceptionReporter.java",
     "java/src/org/chromium/android_webview/nonembedded/ComponentUpdaterResetSafeModeAction.java",
     "java/src/org/chromium/android_webview/nonembedded/LicenseActivity.java",
     "java/src/org/chromium/android_webview/nonembedded/LicenseContentProvider.java",
@@ -33,12 +34,15 @@
     ":services_java",
     "//android_webview:android_webview_product_config_java",
     "//android_webview:common_aidl_java",
+    "//android_webview:common_crash_java",
     "//android_webview:common_java",
     "//android_webview/glue:glue_java",
     "//android_webview/proto:metrics_bridge_records_proto_java",
     "//base:base_java",
     "//components/about_ui/android:aboutui_java",
+    "//components/crash/android:java",
     "//components/embedder_support/android:application_java",
+    "//components/minidump_uploader:minidump_uploader_java",
     "//components/version_info/android:version_constants_java",
     "//third_party/android_deps:com_google_code_findbugs_jsr305_java",
     "//third_party/android_deps:protobuf_lite_runtime_java",
diff --git a/android_webview/nonembedded/DEPS b/android_webview/nonembedded/DEPS
index 4d52d458..e187d375 100644
--- a/android_webview/nonembedded/DEPS
+++ b/android_webview/nonembedded/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
   "+components/component_updater",
+  "+components/crash/android",
   "+components/update_client",
 ]
diff --git a/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc b/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc
index e8021e38..c5539b2 100644
--- a/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc
+++ b/android_webview/nonembedded/component_updater/aw_component_update_service_test.cc
@@ -69,7 +69,7 @@
   ASSERT_TRUE(root);
   const auto* request = root->FindKey("request");
   ASSERT_TRUE(request);
-  const auto& app = request->FindKey("app")->GetList()[0];
+  const auto& app = request->FindKey("app")->GetListDeprecated()[0];
   if (on_demand) {
     EXPECT_EQ("ondemand", app.FindKey("installsource")->GetString());
   } else {
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwPureJavaExceptionReporter.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwPureJavaExceptionReporter.java
new file mode 100644
index 0000000..8010b07
--- /dev/null
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/AwPureJavaExceptionReporter.java
@@ -0,0 +1,45 @@
+
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+package org.chromium.android_webview.nonembedded;
+
+import org.chromium.android_webview.common.crash.CrashUploadUtil;
+import org.chromium.android_webview.common.crash.SystemWideCrashDirectories;
+import org.chromium.base.ContextUtils;
+import org.chromium.components.crash.PureJavaExceptionReporter;
+import org.chromium.components.minidump_uploader.CrashFileManager;
+
+import java.io.File;
+
+/* package */ class AwPureJavaExceptionReporter extends PureJavaExceptionReporter {
+    private static final String WEBVIEW_CRASH_PRODUCT_NAME = "AndroidWebView";
+    private static final String NONEMBEDDED_WEBVIEW_MINIDUMP_FILE_PREFIX =
+            "nonembeded-webview-minidump-";
+
+    public AwPureJavaExceptionReporter() {
+        super(SystemWideCrashDirectories.getOrCreateWebViewCrashDir());
+        // The reporter doesn't create a minidump if the crash dump directory doesn't exist, so make
+        // sure to create it.
+        // TODO(https://crbug.com/1293108): this should be shared with chrome as well and removed
+        // from here.
+        new File(SystemWideCrashDirectories.getOrCreateWebViewCrashDir(),
+                CrashFileManager.CRASH_DUMP_DIR)
+                .mkdirs();
+    }
+
+    @Override
+    protected String getProductName() {
+        return WEBVIEW_CRASH_PRODUCT_NAME;
+    }
+
+    @Override
+    protected void uploadMinidump(File minidump) {
+        CrashUploadUtil.scheduleNewJob(ContextUtils.getApplicationContext());
+    }
+
+    @Override
+    protected String getMinidumpPrefix() {
+        return NONEMBEDDED_WEBVIEW_MINIDUMP_FILE_PREFIX;
+    }
+}
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
index baec92e..0e7e3f09 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
@@ -29,6 +29,7 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.task.TaskTraits;
 import org.chromium.build.BuildConfig;
+import org.chromium.components.crash.PureJavaExceptionHandler;
 import org.chromium.components.embedder_support.application.FontPreloadingWorkaround;
 import org.chromium.components.version_info.VersionConstants;
 import org.chromium.ui.base.ResourceBundle;
@@ -87,6 +88,8 @@
             PathUtils.setPrivateDataDirectorySuffix("webview", "WebView");
             CommandLineUtil.initCommandLine();
 
+            PureJavaExceptionHandler.installHandler(() -> new AwPureJavaExceptionReporter());
+
             // TODO(crbug.com/1182693): Do set up a native UMA recorder once we support recording
             // metrics from native nonembedded code.
             UmaRecorderHolder.setUpNativeUmaRecorder(false);
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
index ec4adbf5..671c49c 100644
--- a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
+++ b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
@@ -65,8 +65,9 @@
 # permissions API (crbug.com/490120), presentation API (crbug.com/521319),
 # share API (crbug.com/765923), custom scheme handlers (crbug.com/589502),
 # media session API (crbug.com/925997), Web Serial API (crbug.com/1164036),
-# WebXr API (crbug.com/1012899), WebHID API (crbug.com/1164125), and Web
-# Bluetooth API (crbug.com/1100993) are not supported in webview.
+# WebXr API (crbug.com/1012899), WebHID API (crbug.com/1164125), Web
+# Bluetooth API (crbug.com/1100993), and WebUSB API (crbug.com/933055) are
+# not supported in webview.
 interface Navigator
     getter bluetooth                   # crbug.com/1100993
     getter hid                         # crbug.com/1164125
@@ -74,6 +75,7 @@
     getter permissions                 # crbug.com/490120
     getter presentation                # crbug.com/521319
     getter serial                      # crbug.com/1164036
+    getter usb                         # crbug.com/1012899
     getter xr                          # crbug.com/1012899
     method registerProtocolHandler     # crbug.com/589502
     method unregisterProtocolHandler   # crbug.com/589502
@@ -225,6 +227,21 @@
 interface BluetoothRemoteGATTService : EventTarget
 interface BluetoothUUID
 
+# WebUSB is not implemented on WebView. crbug.com/933055
+interface USB : EventTarget
+interface USBConnectionEvent : Event
+interface USBDevice
+interface USBInTransferResult
+interface USBOutTransferResult
+interface USBIsochronousInTransferPacket
+interface USBIsochronousInTransferResult
+interface USBIsochronousOutTransferPacket
+interface USBIsochronousOutTransferResult
+interface USBConfiguration
+interface USBInterface
+interface USBAlternateInterface
+interface USBEndpoint
+
 [GLOBAL OBJECT]
     method openDatabase
     attribute eventSender                    # test only
diff --git a/ash/ambient/ambient_controller.h b/ash/ambient/ambient_controller.h
index 5c1e3cc..6b344ad 100644
--- a/ash/ambient/ambient_controller.h
+++ b/ash/ambient/ambient_controller.h
@@ -140,10 +140,9 @@
  private:
   friend class AmbientAshTestBase;
   friend class AmbientControllerTest;
-  FRIEND_TEST_ALL_PREFIXES(AmbientControllerTestForAnyTheme,
+  FRIEND_TEST_ALL_PREFIXES(AmbientControllerTest,
                            BindsObserversWhenAmbientEnabled);
-  FRIEND_TEST_ALL_PREFIXES(AmbientControllerTestForAnyTheme,
-                           BindsObserversWhenAmbientOn);
+  FRIEND_TEST_ALL_PREFIXES(AmbientControllerTest, BindsObserversWhenAmbientOn);
 
   // Hide or close Ambient mode UI.
   void DismissUI();
diff --git a/ash/ambient/ambient_controller_unittest.cc b/ash/ambient/ambient_controller_unittest.cc
index 4fd8038..b30cfa20 100644
--- a/ash/ambient/ambient_controller_unittest.cc
+++ b/ash/ambient/ambient_controller_unittest.cc
@@ -90,6 +90,11 @@
 
 // Tests for behavior that are agnostic to the AmbientAnimationTheme selected by
 // the user should use this test harness.
+//
+// Currently there are test cases that actually fall under this category but
+// do not use this test fixture. This is done purely for time constraint reasons
+// (it takes a lot of compute time to repeat every single one of these test
+// cases).
 class AmbientControllerTestForAnyTheme
     : public AmbientControllerTest,
       public ::testing::WithParamInterface<AmbientAnimationTheme> {
@@ -107,11 +112,6 @@
     // to make sure that fundamental behavior holds for both the slideshow and
     // lottie-animated codepaths.
     testing::Values(AmbientAnimationTheme::kSlideshow
-// TODO(esum): Fully enable this AmbientAnimationTheme once:
-// * The |include_ash_ambient_animation_resources| GN arg is true by default
-//   (the resources' size is currently being reduced to fit in the image).
-// * The ash ambient resources are publishable (they are currently WIP).
-// The tests will crash/fail without these resources available.
 #if BUILDFLAG(HAS_ASH_AMBIENT_ANIMATION_RESOURCES)
                     ,
                     AmbientAnimationTheme::kFeelTheBreeze
@@ -236,7 +236,7 @@
   EXPECT_TRUE(GetContainerViews().empty());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme, NotShowAmbientWhenLockSecondaryUser) {
+TEST_F(AmbientControllerTest, NotShowAmbientWhenLockSecondaryUser) {
   // Simulate the login screen.
   ClearLogin();
   SimulateUserLogin(kUser1);
@@ -289,8 +289,7 @@
   EXPECT_FALSE(IsAccessTokenRequestPending());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
-       ShouldNotRequestAccessTokenWhenPrefNotEnabled) {
+TEST_F(AmbientControllerTest, ShouldNotRequestAccessTokenWhenPrefNotEnabled) {
   SetAmbientModeEnabled(false);
   EXPECT_FALSE(IsAccessTokenRequestPending());
 
@@ -328,7 +327,7 @@
   CloseAmbientScreen();
 }
 
-TEST_P(AmbientControllerTestForAnyTheme, ShouldReturnEmptyAccessToken) {
+TEST_F(AmbientControllerTest, ShouldReturnEmptyAccessToken) {
   EXPECT_FALSE(IsAccessTokenRequestPending());
 
   // Lock the screen will request a token.
@@ -370,8 +369,7 @@
   CloseAmbientScreen();
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
-       ShouldRetryRefreshAccessTokenAfterFailure) {
+TEST_F(AmbientControllerTest, ShouldRetryRefreshAccessTokenAfterFailure) {
   EXPECT_FALSE(IsAccessTokenRequestPending());
 
   // Lock the screen will request a token.
@@ -388,8 +386,7 @@
   CloseAmbientScreen();
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
-       ShouldRetryRefreshAccessTokenWithBackoffPolicy) {
+TEST_F(AmbientControllerTest, ShouldRetryRefreshAccessTokenWithBackoffPolicy) {
   EXPECT_FALSE(IsAccessTokenRequestPending());
 
   // Lock the screen will request a token.
@@ -414,8 +411,7 @@
   CloseAmbientScreen();
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
-       ShouldRetryRefreshAccessTokenOnlyThreeTimes) {
+TEST_F(AmbientControllerTest, ShouldRetryRefreshAccessTokenOnlyThreeTimes) {
   EXPECT_FALSE(IsAccessTokenRequestPending());
 
   // Lock the screen will request a token.
@@ -449,7 +445,7 @@
   CloseAmbientScreen();
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        CheckAcquireAndReleaseWakeLockWhenBatteryIsCharging) {
   // Simulate a device being connected to a charger initially.
   SetPowerStateCharging();
@@ -483,7 +479,7 @@
                    device::mojom::WakeLockType::kPreventDisplaySleep));
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        CheckAcquireAndReleaseWakeLockWhenBatteryBatteryIsFullAndDischarging) {
   SetPowerStateDischarging();
   SetBatteryPercent(100.f);
@@ -518,7 +514,7 @@
                    device::mojom::WakeLockType::kPreventDisplaySleep));
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        CheckAcquireAndReleaseWakeLockWhenBatteryStateChanged) {
   SetPowerStateDischarging();
   SetExternalPowerConnected();
@@ -660,7 +656,7 @@
   EXPECT_FALSE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        ShouldDismissContainerViewOnKeyEventWhenLockScreenInBackground) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(true);
   SetPowerStateCharging();
@@ -683,7 +679,7 @@
   EXPECT_FALSE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        ShouldShowAmbientScreenWithLockscreenWhenScreenIsDimmed) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(true);
   SetPowerStateCharging();
@@ -704,7 +700,7 @@
   EXPECT_FALSE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        ShouldShowAmbientScreenWithLockscreenWithNoisyPowerEvents) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(true);
   SetPowerStateCharging();
@@ -732,7 +728,7 @@
   EXPECT_FALSE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        ShouldShowAmbientScreenWithoutLockscreenWhenScreenIsDimmed) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(true);
   // When power is discharging, we do not lock the screen with ambient
@@ -758,8 +754,7 @@
   CloseAmbientScreen();
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
-       ShouldShowAmbientScreenWhenScreenIsDimmed) {
+TEST_F(AmbientControllerTest, ShouldShowAmbientScreenWhenScreenIsDimmed) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(false);
   SetPowerStateCharging();
   EXPECT_FALSE(ambient_controller()->IsShown());
@@ -779,8 +774,7 @@
   CloseAmbientScreen();
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
-       ShouldHideAmbientScreenWhenDisplayIsOff) {
+TEST_F(AmbientControllerTest, ShouldHideAmbientScreenWhenDisplayIsOff) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(false);
   EXPECT_FALSE(ambient_controller()->IsShown());
 
@@ -803,7 +797,7 @@
   EXPECT_FALSE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        ShouldHideAmbientScreenWhenDisplayIsOffThenComesBackWithLockScreen) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(true);
   SetPowerStateCharging();
@@ -837,7 +831,7 @@
   EXPECT_TRUE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
+TEST_F(AmbientControllerTest,
        ShouldHideAmbientScreenWhenDisplayIsOffAndNotStartWhenLockScreen) {
   GetSessionControllerClient()->SetShouldLockScreenAutomatically(true);
   SetPowerStateDischarging();
@@ -905,7 +899,6 @@
   FastForwardTiny();
 
   ShowAmbientScreen();
-  FastForwardToNextImage();
 
   auto* screen = display::Screen::GetScreen();
   EXPECT_EQ(screen->GetNumDisplays(), 2);
@@ -928,7 +921,6 @@
 
   UpdateDisplay("800x600");
   ShowAmbientScreen();
-  FastForwardToNextImage();
 
   auto* screen = display::Screen::GetScreen();
   EXPECT_EQ(screen->GetNumDisplays(), 1);
@@ -953,7 +945,6 @@
   FastForwardTiny();
 
   ShowAmbientScreen();
-  FastForwardToNextImage();
 
   auto* screen = display::Screen::GetScreen();
   EXPECT_EQ(screen->GetNumDisplays(), 2);
@@ -969,7 +960,7 @@
   EXPECT_TRUE(WidgetsVisible());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme, ClosesAmbientBeforeSuspend) {
+TEST_F(AmbientControllerTest, ClosesAmbientBeforeSuspend) {
   LockScreen();
   FastForwardToLockScreenTimeout();
 
@@ -984,7 +975,7 @@
   EXPECT_FALSE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme, RestartsAmbientAfterSuspend) {
+TEST_F(AmbientControllerTest, RestartsAmbientAfterSuspend) {
   LockScreen();
   FastForwardToLockScreenTimeout();
 
@@ -1006,7 +997,7 @@
   EXPECT_TRUE(ambient_controller()->IsShown());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme, ObservesPrefsWhenAmbientEnabled) {
+TEST_F(AmbientControllerTest, ObservesPrefsWhenAmbientEnabled) {
   SetAmbientModeEnabled(false);
 
   // This pref is always observed.
@@ -1028,7 +1019,7 @@
     EXPECT_TRUE(IsPrefObserved(pref_name));
 }
 
-TEST_P(AmbientControllerTestForAnyTheme, BindsObserversWhenAmbientEnabled) {
+TEST_F(AmbientControllerTest, BindsObserversWhenAmbientEnabled) {
   auto* ctrl = ambient_controller();
 
   SetAmbientModeEnabled(false);
@@ -1047,8 +1038,7 @@
   EXPECT_TRUE(AreSessionSpecificObserversBound());
 }
 
-TEST_P(AmbientControllerTestForAnyTheme,
-       SwitchActiveUsersDoesNotDoubleBindObservers) {
+TEST_F(AmbientControllerTest, SwitchActiveUsersDoesNotDoubleBindObservers) {
   ClearLogin();
   SimulateUserLogin(kUser1);
   SetAmbientModeEnabled(true);
@@ -1073,7 +1063,7 @@
   session->SwitchActiveUser(AccountId::FromUserEmail(kUser2));
 }
 
-TEST_P(AmbientControllerTestForAnyTheme, BindsObserversWhenAmbientOn) {
+TEST_F(AmbientControllerTest, BindsObserversWhenAmbientOn) {
   auto* ctrl = ambient_controller();
 
   LockScreen();
@@ -1111,11 +1101,6 @@
   EXPECT_FALSE(ambient_controller()->IsShown());
 }
 
-// TODO(esum): Fully enable this test once:
-// * The |include_ash_ambient_animation_resources| GN arg is true by default
-//   (the resources' size is currently being reduced to fit in the image).
-// * The ash ambient resources are publishable (they are currently WIP).
-// This test will crash/fail without these resources available.
 #if BUILDFLAG(HAS_ASH_AMBIENT_ANIMATION_RESOURCES)
 #define MAYBE_RendersCorrectView RendersCorrectView
 #else
diff --git a/ash/ambient/resources/BUILD.gn b/ash/ambient/resources/BUILD.gn
index d40e86d..5def896 100644
--- a/ash/ambient/resources/BUILD.gn
+++ b/ash/ambient/resources/BUILD.gn
@@ -2,15 +2,14 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//ash/ambient/resources/resources.gni")
 import("//build/cipd/cipd.gni")
-import("//build/config/chrome_build.gni")
 import("//build/config/chromeos/ui_mode.gni")
 import("//tools/grit/grit_rule.gni")
 import("//ui/webui/resources/tools/generate_grd.gni")
 
-# See DEPS file. Both of these are prerequisites for downloading Lottie
-# ambient mode resources from CIPD.
-assert(is_chromeos_ash && is_chrome_branded)
+assert(is_chromeos_ash)
+assert(include_ash_ambient_animation_resources)
 
 lottie_resources_grd_file = "$target_gen_dir/lottie_resources.grd"
 
diff --git a/ash/ambient/resources/resources.gni b/ash/ambient/resources/resources.gni
index 28e5435..9dd6214 100644
--- a/ash/ambient/resources/resources.gni
+++ b/ash/ambient/resources/resources.gni
@@ -2,12 +2,16 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/chrome_build.gni")
+import("//build/config/chromeos/ui_mode.gni")
+
 declare_args() {
-  # Temporary build flag to include resources for the animated screensaver in
-  # ash builds. The resources are still under development and there are plans to
-  # reduce their size since a few are pretty big. This flag prevents the main
-  # resource pak at HEAD from being impacted until the size issues are
-  # addressed, while still allowing developers to test this feature by
-  # overriding this flag to true.
-  include_ash_ambient_animation_resources = false
+  # Build flag to include resources for the animated screensaver in ash builds.
+  #
+  # Currently, these resources are included by default for internal ChromeOS
+  # builds as both conditions below are prerequisites for downloading Lottie
+  # ambient mode resources from CIPD in the DEPS file.
+  #
+  # May be overridden locally to false for testing purposes if desired.
+  include_ash_ambient_animation_resources = is_chromeos_ash && is_chrome_branded
 }
diff --git a/ash/ambient/test/ambient_ash_test_base.cc b/ash/ambient/test/ambient_ash_test_base.cc
index bf45459..0edac98 100644
--- a/ash/ambient/test/ambient_ash_test_base.cc
+++ b/ash/ambient/test/ambient_ash_test_base.cc
@@ -28,10 +28,13 @@
 #include "ash/shell.h"
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/task/sequenced_task_runner.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_run_loop_timeout.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
@@ -204,10 +207,29 @@
 void AmbientAshTestBase::ShowAmbientScreen() {
   // The widget will be destroyed in |AshTestBase::TearDown()|.
   ambient_controller()->ShowUi();
-  // The UI only shows when images are downloaded to avoid showing blank screen.
-  FastForwardToNextImage();
-  // Flush the message loop to finish all async calls.
-  base::RunLoop().RunUntilIdle();
+
+  static constexpr base::TimeDelta kTimeout = base::Seconds(10);
+  base::test::ScopedRunLoopTimeout loop_timeout(FROM_HERE, kTimeout);
+  base::RunLoop run_loop;
+  task_environment()->GetMainThreadTaskRunner()->PostTask(
+      FROM_HERE,
+      base::BindOnce(&AmbientAshTestBase::SpinWaitForAmbientViewAvailable,
+                     base::Unretained(this), run_loop.QuitClosure()));
+  run_loop.Run();
+}
+
+void AmbientAshTestBase::SpinWaitForAmbientViewAvailable(
+    const base::RepeatingClosure& quit_closure) {
+  if (GetContainerView()) {
+    quit_closure.Run();
+  } else {
+    static constexpr base::TimeDelta kPollingPeriod = base::Milliseconds(250);
+    task_environment()->GetMainThreadTaskRunner()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&AmbientAshTestBase::SpinWaitForAmbientViewAvailable,
+                       base::Unretained(this), quit_closure),
+        kPollingPeriod);
+  }
 }
 
 void AmbientAshTestBase::HideAmbientScreen() {
diff --git a/ash/ambient/test/ambient_ash_test_base.h b/ash/ambient/test/ambient_ash_test_base.h
index acf0227..4bb1a43b 100644
--- a/ash/ambient/test/ambient_ash_test_base.h
+++ b/ash/ambient/test/ambient_ash_test_base.h
@@ -17,6 +17,7 @@
 #include "ash/public/cpp/ambient/proto/photo_cache_entry.pb.h"
 #include "ash/public/cpp/test/test_image_downloader.h"
 #include "ash/test/ash_test_base.h"
+#include "base/callback.h"
 #include "services/media_session/public/mojom/media_session.mojom.h"
 #include "ui/views/view.h"
 #include "ui/views/widget/widget.h"
@@ -189,6 +190,9 @@
   void SetDecodePhotoImage(const gfx::ImageSkia& image);
 
  private:
+  void SpinWaitForAmbientViewAvailable(
+      const base::RepeatingClosure& quit_closure);
+
   std::unique_ptr<views::Widget> widget_;
   power_manager::PowerSupplyProperties proto_;
   TestImageDownloader image_downloader_;
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc
index adee406..5c17ea1 100644
--- a/ash/app_list/views/app_list_item_view.cc
+++ b/ash/app_list/views/app_list_item_view.cc
@@ -690,7 +690,7 @@
     grid_delegate_->ClearSelectedView();
 
   int run_types = views::MenuRunner::HAS_MNEMONICS |
-                  views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+                  views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                   views::MenuRunner::FIXED_ANCHOR |
                   views::MenuRunner::CONTEXT_MENU;
 
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc
index 93ee734..b64ef2e3 100644
--- a/ash/app_list/views/apps_container_view.cc
+++ b/ash/app_list/views/apps_container_view.cc
@@ -600,7 +600,8 @@
 void AppsContainerView::MaybeCreateGradientMask() {
   if (features::IsBackgroundBlurEnabled()) {
     if (!layer()->layer_mask_layer() && !gradient_layer_delegate_) {
-      gradient_layer_delegate_ = std::make_unique<GradientLayerDelegate>();
+      gradient_layer_delegate_ =
+          std::make_unique<GradientLayerDelegate>(/*animate_in=*/false);
       UpdateGradientMaskBounds();
     }
     if (gradient_layer_delegate_) {
diff --git a/ash/app_list/views/apps_grid_context_menu.cc b/ash/app_list/views/apps_grid_context_menu.cc
index 714d3c3..1d26f2b3 100644
--- a/ash/app_list/views/apps_grid_context_menu.cc
+++ b/ash/app_list/views/apps_grid_context_menu.cc
@@ -55,7 +55,7 @@
                           base::Unretained(this)));
   root_menu_item_view_ = menu_model_adapter_->CreateMenu();
 
-  int run_types = views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+  int run_types = views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                   views::MenuRunner::CONTEXT_MENU |
                   views::MenuRunner::FIXED_ANCHOR;
   menu_runner_ =
diff --git a/ash/app_list/views/continue_task_view.cc b/ash/app_list/views/continue_task_view.cc
index 6afdbb3..88fb32e3 100644
--- a/ash/app_list/views/continue_task_view.cc
+++ b/ash/app_list/views/continue_task_view.cc
@@ -218,7 +218,7 @@
   if (!result())
     return;
 
-  int run_types = views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+  int run_types = views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                   views::MenuRunner::CONTEXT_MENU |
                   views::MenuRunner::FIXED_ANCHOR;
 
diff --git a/ash/app_list/views/search_result_list_view_unittest.cc b/ash/app_list/views/search_result_list_view_unittest.cc
index 0565c81..be5f08a 100644
--- a/ash/app_list/views/search_result_list_view_unittest.cc
+++ b/ash/app_list/views/search_result_list_view_unittest.cc
@@ -270,15 +270,15 @@
 
   EXPECT_EQ(gfx::Size(kPreferredWidth, kClassicViewHeight),
             GetUnifiedResultViewAt(0)->size());
-  EXPECT_EQ(GetUnifiedResultViewAt(0)->GetLayoutOrientationForTest(),
+  EXPECT_EQ(GetUnifiedResultViewAt(0)->TitleAndDetailsOrientationForTest(),
             views::LayoutOrientation::kVertical);
   EXPECT_EQ(gfx::Size(kPreferredWidth, kInlineAnswerViewHeight),
             GetUnifiedResultViewAt(1)->size());
-  EXPECT_EQ(GetUnifiedResultViewAt(1)->GetLayoutOrientationForTest(),
+  EXPECT_EQ(GetUnifiedResultViewAt(1)->TitleAndDetailsOrientationForTest(),
             views::LayoutOrientation::kVertical);
   EXPECT_EQ(gfx::Size(kPreferredWidth, kDefaultViewHeight),
             GetUnifiedResultViewAt(2)->size());
-  EXPECT_EQ(GetUnifiedResultViewAt(2)->GetLayoutOrientationForTest(),
+  EXPECT_EQ(GetUnifiedResultViewAt(2)->TitleAndDetailsOrientationForTest(),
             views::LayoutOrientation::kHorizontal);
 }
 
diff --git a/ash/app_list/views/search_result_tile_item_view.cc b/ash/app_list/views/search_result_tile_item_view.cc
index a371045..742e0b115 100644
--- a/ash/app_list/views/search_result_tile_item_view.cc
+++ b/ash/app_list/views/search_result_tile_item_view.cc
@@ -365,7 +365,7 @@
       view_delegate_->IsInTabletMode());
   context_menu_->Run(anchor_rect, views::MenuAnchorPosition::kBubbleRight,
                      views::MenuRunner::HAS_MNEMONICS |
-                         views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+                         views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                          views::MenuRunner::CONTEXT_MENU |
                          views::MenuRunner::FIXED_ANCHOR);
   if (!selected()) {
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc
index f68c956..9d3901e 100644
--- a/ash/app_list/views/search_result_view.cc
+++ b/ash/app_list/views/search_result_view.cc
@@ -76,6 +76,7 @@
 constexpr int kSearchRatingStarPadding = 4;
 constexpr int kSearchRatingStarSize = 16;
 constexpr gfx::Insets kAnswerCardBorder(12, 12, 12, 12);
+constexpr gfx::Insets kBigTitleBorder(0, 14, 0, 12);
 
 views::ImageView* SetupChildImageView(views::FlexLayoutView* parent) {
   views::ImageView* image_view =
@@ -88,7 +89,8 @@
 
 views::Label* SetupChildLabelView(
     views::FlexLayoutView* parent,
-    SearchResultView::SearchResultViewType view_type) {
+    SearchResultView::SearchResultViewType view_type,
+    SearchResultView::LabelType label_type) {
   // Create and setup label.
   views::Label* label = parent->AddChildView(std::make_unique<views::Label>());
   label->SetBackgroundColor(SK_ColorTRANSPARENT);
@@ -100,7 +102,9 @@
                                views::MaximumFlexSizeRule::kScaleToMaximum));
 
   // Apply label text styling.
-  label->SetTextContext(CONTEXT_SEARCH_RESULT_VIEW);
+  label->SetTextContext(label_type == SearchResultView::LabelType::kBigTitle
+                            ? CONTEXT_SEARCH_RESULT_BIG_TITLE
+                            : CONTEXT_SEARCH_RESULT_VIEW);
   switch (view_type) {
     case SearchResultView::SearchResultViewType::kClassic:
       label->SetTextStyle(STYLE_CLASSIC_LAUNCHER);
@@ -173,13 +177,7 @@
 
   LabelAndTag(const LabelAndTag& other) = default;
 
-  LabelAndTag& operator=(const LabelAndTag& other) {
-    if (this == &other)
-      return *this;
-    label_ = other.label_;
-    tags_ = other.tags_;
-    return *this;
-  }
+  LabelAndTag& operator=(const LabelAndTag& other) = default;
 
   ~LabelAndTag() = default;
 
@@ -225,33 +223,46 @@
 
   SetNotifyEnterExitOnChild(true);
 
-  // TODO(crbug/1316079): Add BigTitle support for weather answer card.
-
   text_container_ = AddChildView(std::make_unique<views::FlexLayoutView>());
   text_container_->GetViewAccessibility().OverrideIsIgnored(true);
   text_container_->SetCrossAxisAlignment(views::LayoutAlignment::kStretch);
+  text_container_->SetOrientation(views::LayoutOrientation::kHorizontal);
+
+  big_title_container_ =
+      text_container_->AddChildView(std::make_unique<views::FlexLayoutView>());
+  big_title_container_->GetViewAccessibility().OverrideIsIgnored(true);
+  big_title_container_->SetCrossAxisAlignment(views::LayoutAlignment::kStretch);
+  big_title_container_->SetBorder(views::CreateEmptyBorder(kBigTitleBorder));
+
+  title_and_details_container_ =
+      text_container_->AddChildView(std::make_unique<views::FlexLayoutView>());
+  title_and_details_container_->GetViewAccessibility().OverrideIsIgnored(true);
+  title_and_details_container_->SetCrossAxisAlignment(
+      views::LayoutAlignment::kStretch);
 
   SetSearchResultViewType(view_type_);
 
-  title_container_ =
-      text_container_->AddChildView(std::make_unique<views::FlexLayoutView>());
+  title_container_ = title_and_details_container_->AddChildView(
+      std::make_unique<views::FlexLayoutView>());
   title_container_->GetViewAccessibility().OverrideIsIgnored(true);
   title_container_->SetCrossAxisAlignment(views::LayoutAlignment::kStretch);
   title_container_->SetOrientation(views::LayoutOrientation::kHorizontal);
 
-  separator_label_ = SetupChildLabelView(text_container_, view_type_);
+  separator_label_ = SetupChildLabelView(title_and_details_container_,
+                                         view_type_, LabelType::kDetails);
   separator_label_->SetText(
       l10n_util::GetStringUTF16(IDS_ASH_SEARCH_RESULT_SEPARATOR));
 
-  details_container_ =
-      text_container_->AddChildView(std::make_unique<views::FlexLayoutView>());
+  details_container_ = title_and_details_container_->AddChildView(
+      std::make_unique<views::FlexLayoutView>());
   details_container_->GetViewAccessibility().OverrideIsIgnored(true);
   details_container_->SetCrossAxisAlignment(views::LayoutAlignment::kStretch);
   details_container_->SetOrientation(views::LayoutOrientation::kHorizontal);
 
-  rating_ = SetupChildLabelView(text_container_, view_type_);
+  rating_ = SetupChildLabelView(title_and_details_container_, view_type_,
+                                LabelType::kDetails);
 
-  rating_star_ = SetupChildImageView(text_container_);
+  rating_star_ = SetupChildImageView(title_and_details_container_);
   rating_star_->SetImage(gfx::CreateVectorIcon(
       kBadgeRatingIcon, kSearchRatingStarSize,
       AppListColorProvider::Get()->GetSearchBoxSecondaryTextColor(
@@ -275,6 +286,8 @@
 void SearchResultView::OnResultChanged() {
   OnMetadataChanged();
   // Update tile, separator, and details text visibility.
+  if (view_type_ == SearchResultViewType::kAnswerCard)
+    UpdateBigTitleText();
   UpdateTitleText();
   UpdateDetailsText();
   UpdateRating();
@@ -287,22 +300,33 @@
 
   switch (view_type_) {
     case SearchResultViewType::kDefault:
-      text_container_->SetOrientation(views::LayoutOrientation::kHorizontal);
+      title_and_details_container_->SetOrientation(
+          views::LayoutOrientation::kHorizontal);
       SetBorder(views::CreateEmptyBorder(gfx::Insets()));
+      big_title_container_->RemoveAllChildViews();
+      big_title_label_tags_.clear();
+      big_title_container_->SetVisible(false);
+
       break;
     case SearchResultViewType::kClassic:
-      text_container_->SetOrientation(views::LayoutOrientation::kVertical);
+      title_and_details_container_->SetOrientation(
+          views::LayoutOrientation::kVertical);
       SetBorder(views::CreateEmptyBorder(gfx::Insets()));
+      big_title_container_->RemoveAllChildViews();
+      big_title_label_tags_.clear();
+      big_title_container_->SetVisible(false);
+
       break;
     case SearchResultViewType::kAnswerCard:
-      text_container_->SetOrientation(views::LayoutOrientation::kVertical);
+      title_and_details_container_->SetOrientation(
+          views::LayoutOrientation::kVertical);
       SetBorder(views::CreateEmptyBorder(kAnswerCardBorder));
       break;
   }
 }
 
-views::LayoutOrientation SearchResultView::GetLayoutOrientationForTest() {
-  return text_container_->GetOrientation();
+views::LayoutOrientation SearchResultView::TitleAndDetailsOrientationForTest() {
+  return title_and_details_container_->GetOrientation();
 }
 
 int SearchResultView::PreferredHeight() const {
@@ -333,17 +357,24 @@
   }
 }
 
+bool SearchResultView::GetAndResetResultChanged() {
+  bool result_changed = result_changed_;
+  result_changed_ = false;
+  return result_changed;
+}
+
 std::vector<SearchResultView::LabelAndTag>
 SearchResultView::SetupContainerViewForTextVector(
     views::FlexLayoutView* parent,
     const std::vector<SearchResult::TextItem>& text_vector,
-    bool details_label) {
+    LabelType label_type) {
   std::vector<LabelAndTag> label_tags;
   for (auto& span : text_vector) {
     switch (span.GetType()) {
       case SearchResultTextItemType::kString: {
-        views::Label* label = SetupChildLabelView(parent, view_type_);
-        if (details_label) {
+        views::Label* label =
+            SetupChildLabelView(parent, view_type_, label_type);
+        if (label_type == LabelType::kDetails) {
           // We should only show a separator label when the details container
           // has valid contents.
           should_show_separator_label_ =
@@ -362,28 +393,40 @@
   return label_tags;
 }
 
+void SearchResultView::UpdateBigTitleText() {
+  DCHECK_EQ(view_type_, SearchResultViewType::kAnswerCard);
+  // Big title is only shown for answer card views.
+  big_title_container_->RemoveAllChildViews();
+  big_title_label_tags_.clear();
+  if (!result() || result()->big_title_text_vector().empty()) {
+    big_title_container_->SetVisible(false);
+  } else {
+    // Create title labels from text vector metadata.
+    big_title_label_tags_ = SetupContainerViewForTextVector(
+        big_title_container_, result()->big_title_text_vector(),
+        LabelType::kBigTitle);
+    StyleBigTitleLabel();
+    big_title_container_->SetVisible(true);
+  }
+}
+
 void SearchResultView::UpdateTitleText() {
   title_container_->RemoveAllChildViews();
   title_label_tags_.clear();
   if (!result() || result()->title_text_vector().empty()) {
     // The entire text container should be hidden when there is no title.
     text_container_->SetVisible(false);
+    title_and_details_container_->SetVisible(false);
     title_container_->SetVisible(false);
   } else {
     // Create title labels from text vector metadata.
     title_label_tags_ = SetupContainerViewForTextVector(
-        title_container_, result()->title_text_vector(),
-        false /*details_label*/);
-  }
+        title_container_, result()->title_text_vector(), LabelType::kTitle);
     StyleTitleLabel();
     text_container_->SetVisible(true);
+    title_and_details_container_->SetVisible(true);
     title_container_->SetVisible(true);
-}
-
-bool SearchResultView::GetAndResetResultChanged() {
-  bool result_changed = result_changed_;
-  result_changed_ = false;
-  return result_changed;
+  }
 }
 
 void SearchResultView::UpdateDetailsText() {
@@ -397,7 +440,7 @@
     // Create details labels from text vector metadata.
     details_label_tags_ = SetupContainerViewForTextVector(
         details_container_, result()->details_text_vector(),
-        true /*details_label*/);
+        LabelType::kDetails);
     StyleDetailsLabel();
     details_container_->SetVisible(true);
     switch (view_type_) {
@@ -480,6 +523,12 @@
   }
 }
 
+void SearchResultView::StyleBigTitleLabel() {
+  for (auto& span : big_title_label_tags_) {
+    StyleLabel(span.GetLabel(), true /*is_title_label*/, span.GetTags());
+  }
+}
+
 void SearchResultView::StyleTitleLabel() {
   for (auto& span : title_label_tags_) {
     StyleLabel(span.GetLabel(), false /*is_title_label*/, span.GetTags());
@@ -723,6 +772,8 @@
 }
 
 void SearchResultView::OnMetadataChanged() {
+  if (view_type_ == SearchResultViewType::kAnswerCard)
+    UpdateBigTitleText();
   UpdateTitleText();
   UpdateDetailsText();
   // Updates |icon_|.
diff --git a/ash/app_list/views/search_result_view.h b/ash/app_list/views/search_result_view.h
index 2a5e1c021..fd7369df 100644
--- a/ash/app_list/views/search_result_view.h
+++ b/ash/app_list/views/search_result_view.h
@@ -49,6 +49,12 @@
     kAnswerCard,
   };
 
+  enum class LabelType {
+    kBigTitle,
+    kTitle,
+    kDetails,
+  };
+
   // Internal class name.
   static const char kViewClassName[];
 
@@ -69,7 +75,7 @@
   void SetSearchResultViewType(SearchResultViewType type);
   SearchResultViewType view_type() { return view_type_; }
 
-  views::LayoutOrientation GetLayoutOrientationForTest();
+  views::LayoutOrientation TitleAndDetailsOrientationForTest();
 
   // Returns whether the result has changed since this method was last called.
   // Used to determine whether the result should be animated when the result
@@ -87,7 +93,8 @@
   std::vector<LabelAndTag> SetupContainerViewForTextVector(
       views::FlexLayoutView* parent,
       const std::vector<SearchResult::TextItem>& text_vector,
-      bool details_label);
+      LabelType label_type);
+  void UpdateBigTitleText();
   void UpdateTitleText();
   void UpdateDetailsText();
   void UpdateRating();
@@ -95,6 +102,7 @@
   void StyleLabel(views::Label* label,
                   bool is_title_label,
                   const SearchResult::Tags& tags);
+  void StyleBigTitleLabel();
   void StyleTitleLabel();
   void StyleDetailsLabel();
 
@@ -140,10 +148,15 @@
   views::ImageView* badge_icon_ = nullptr;  // Owned by views hierarchy.
   views::FlexLayoutView* text_container_ =
       nullptr;  // Owned by views hierarchy.
+  views::FlexLayoutView* big_title_container_ =
+      nullptr;  // Owned by views hierarchy.
+  views::FlexLayoutView* title_and_details_container_ =
+      nullptr;  // Owned by views hierarchy.
   views::FlexLayoutView* title_container_ =
       nullptr;  // Owned by views hierarchy.
   views::FlexLayoutView* details_container_ =
       nullptr;  // Owned by views hierarchy.
+  std::vector<LabelAndTag> big_title_label_tags_;  // Owned by views hierarchy.
   std::vector<LabelAndTag> title_label_tags_;    // Owned by views hierarchy.
   std::vector<LabelAndTag> details_label_tags_;  // Owned by views hierarchy.
   views::Label* separator_label_ = nullptr;  // Owned by views hierarchy.
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index bad1c93..662512d 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -4633,6 +4633,29 @@
       <message name="IDS_ASH_FIRMWARE_UPDATE_NOTIFICATION_UPDATE_BUTTON_TEXT" desc="Notification button text, if the user clicks on the button it will redirect them to the Firmware Update app.">
         Update
       </message>
+
+      <!-- USB-C cable notifications -->
+      <message name="IDS_ASH_USB_NOTIFICATION_LEARN_MORE" desc="Notification button text. If the user clicks on it, it will send them to a relevant webpage." translateable="false">
+        Learn More
+      </message>
+      <message name="IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_TITLE" desc="Notification title text for when a user connects a display to a Chromebook's USB-C port with a cable that cannot support driving display signals." translateable="false">
+        Cable may not support displays
+      </message>
+      <message name="IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_BODY" desc="Notification body text for when a user connects a display to a Chromebook's USB-C port with a cable that cannot support driving display signals." translateable="false">
+        Your USB-C cable may not connect to diplays properly
+      </message>
+      <message name="IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE" desc="Notification title text for when a user connects something to the USB-C port on their Chromebook and performance is in some way limited by the cable." translateable="false">
+        Cable may impact performance
+      </message>
+      <message name="IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_USB4_SUPPORT_BODY" desc="Notification body text for when a user connects a USB4 device to their Chromebook with a cable that does not support USB4." translateable="false">
+        Your USB-C cable does not support USB4. Device performance may be limited.
+      </message>
+      <message name="IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_TBT_SUPPORT_BODY" desc="Notification body text for when a user connects a Thunderbolt device to their Chromebook with a cable that does not support Thunderbolt." translateable="false">
+        Your USB-C cable does not support Thunderbolt. Device performance may be limited.
+      </message>
+      <message name="IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_SPEED_LIMITED_BODY" desc="Notification body text for when a user connects a device to their Chromebook with a cable that has a lower maximum data rate than the device." translateable="false">
+        Your device supports a higher data rate than your cable. Device performance may be limited.
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_BODY.png.sha1 b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_BODY.png.sha1
new file mode 100644
index 0000000..60d8dab
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_BODY.png.sha1
@@ -0,0 +1 @@
+aac41ca3dc368f2cdca31e8eb53ffbb047945536
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_TITLE.png.sha1
new file mode 100644
index 0000000..60d8dab
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_TITLE.png.sha1
@@ -0,0 +1 @@
+aac41ca3dc368f2cdca31e8eb53ffbb047945536
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_TBT_SUPPORT_BODY.png.sha1 b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_TBT_SUPPORT_BODY.png.sha1
new file mode 100644
index 0000000..ff917fa7
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_TBT_SUPPORT_BODY.png.sha1
@@ -0,0 +1 @@
+a42751b61b0b2ffc90fb301abdb71e1037d7e2e9
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_USB4_SUPPORT_BODY.png.sha1 b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_USB4_SUPPORT_BODY.png.sha1
new file mode 100644
index 0000000..56accfa
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_USB4_SUPPORT_BODY.png.sha1
@@ -0,0 +1 @@
+d7a77bc7611ad540136b7890434c393c28e541b2
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE.png.sha1
new file mode 100644
index 0000000..56accfa
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE.png.sha1
@@ -0,0 +1 @@
+d7a77bc7611ad540136b7890434c393c28e541b2
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_SPEED_LIMITED_BODY.png.sha1 b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_SPEED_LIMITED_BODY.png.sha1
new file mode 100644
index 0000000..1ec16a89
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_SPEED_LIMITED_BODY.png.sha1
@@ -0,0 +1 @@
+30c9dfae5fb2b40f5f447101a1beaaa6865b7a45
\ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_LEARN_MORE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_LEARN_MORE.png.sha1
new file mode 100644
index 0000000..60d8dab
--- /dev/null
+++ b/ash/ash_strings_grd/IDS_ASH_USB_NOTIFICATION_LEARN_MORE.png.sha1
@@ -0,0 +1 @@
+aac41ca3dc368f2cdca31e8eb53ffbb047945536
\ No newline at end of file
diff --git a/ash/capture_mode/capture_mode_camera_controller.cc b/ash/capture_mode/capture_mode_camera_controller.cc
index 71ebd02..6c81e1c 100644
--- a/ash/capture_mode/capture_mode_camera_controller.cc
+++ b/ash/capture_mode/capture_mode_camera_controller.cc
@@ -9,6 +9,7 @@
 
 #include "ash/public/cpp/capture_mode/capture_mode_delegate.h"
 #include "base/bind.h"
+#include "base/callback_helpers.h"
 #include "base/check.h"
 #include "base/strings/stringprintf.h"
 #include "media/capture/video/video_capture_device_descriptor.h"
@@ -17,15 +18,24 @@
 
 namespace {
 
-// Defines a map type to map a camera model ID to the number of cameras of that
-// model that are currently connected.
+// Defines a map type to map a camera model ID (or display name) to the number
+// of cameras of that model that are currently connected.
 using ModelIdToCountMap = std::map<std::string, int>;
 
 // Using the given `cam_models_map` which tracks the number of cameras connected
-// of each model, returns the next `CameraId::number` for the given `model_id`.
-int GetNextCameraNumber(const std::string& model_id,
+// of each model, returns the next `CameraId::number` for the given
+// `model_id_or_display_name`.
+int GetNextCameraNumber(const std::string& model_id_or_display_name,
                         ModelIdToCountMap* cam_models_map) {
-  return ++(*cam_models_map)[model_id];
+  return ++(*cam_models_map)[model_id_or_display_name];
+}
+
+// Returns a reference to either the model ID (if available) or the display name
+// from the given `descriptor`.
+const std::string& PickModelIdOrDisplayName(
+    const media::VideoCaptureDeviceDescriptor& descriptor) {
+  return descriptor.model_id.empty() ? descriptor.display_name()
+                                     : descriptor.model_id;
 }
 
 // Returns true if the `incoming_list` (supplied by the video source provider)
@@ -47,13 +57,15 @@
     if (iter == current_list.end())
       return true;
 
-    const auto& incoming_model_id = incoming_camera.descriptor.model_id;
+    const auto& model_id_or_display_name =
+        PickModelIdOrDisplayName(incoming_camera.descriptor);
     const int cam_number =
-        GetNextCameraNumber(incoming_model_id, &cam_models_map);
+        GetNextCameraNumber(model_id_or_display_name, &cam_models_map);
 
     const CameraInfo& found_info = *iter;
     if (found_info.display_name != incoming_camera.descriptor.display_name() ||
-        found_info.camera_id.model_id() != incoming_model_id ||
+        found_info.camera_id.model_id_or_display_name() !=
+            model_id_or_display_name ||
         found_info.camera_id.number() != cam_number) {
       return true;
     }
@@ -72,32 +84,27 @@
   return iter == list.end() ? nullptr : &(*iter);
 }
 
-// Returns a reference to either the model ID (if available) or the display name
-// from the given `descriptor`.
-const std::string& PickModelIdOrDisplayName(
-    const media::VideoCaptureDeviceDescriptor& descriptor) {
-  return descriptor.model_id.empty() ? descriptor.display_name()
-                                     : descriptor.model_id;
-}
-
 }  // namespace
 
 // -----------------------------------------------------------------------------
 // CameraId:
 
-CameraId::CameraId(std::string model_id, int number)
-    : model_id_(std::move(model_id)), number_(number) {
-  DCHECK(!model_id_.empty());
+CameraId::CameraId(std::string model_id_or_display_name, int number)
+    : model_id_or_display_name_(std::move(model_id_or_display_name)),
+      number_(number) {
+  DCHECK(!model_id_or_display_name_.empty());
   DCHECK_GE(number, 1);
 }
 
 bool CameraId::operator<(const CameraId& rhs) const {
-  const int result = std::strcmp(model_id_.c_str(), rhs.model_id_.c_str());
+  const int result = std::strcmp(model_id_or_display_name_.c_str(),
+                                 rhs.model_id_or_display_name_.c_str());
   return result != 0 ? result : (number_ < rhs.number_);
 }
 
 std::string CameraId::ToString() const {
-  return base::StringPrintf("%s:%0d", model_id_.c_str(), number_);
+  return base::StringPrintf("%s:%0d", model_id_or_display_name_.c_str(),
+                            number_);
 }
 
 // -----------------------------------------------------------------------------
@@ -178,6 +185,13 @@
 
 void CaptureModeCameraController::OnCameraDevicesReceived(
     const std::vector<media::VideoCaptureDeviceInfo>& devices) {
+  // Run the optional for-test closure at the exit of this function's scope.
+  base::ScopedClosureRunner deferred_runner;
+  if (on_camera_list_received_for_test_) {
+    deferred_runner.ReplaceClosure(
+        std::move(on_camera_list_received_for_test_));
+  }
+
   DCHECK(waiting_for_camera_devices_);
   waiting_for_camera_devices_ = false;
 
diff --git a/ash/capture_mode/capture_mode_camera_controller.h b/ash/capture_mode/capture_mode_camera_controller.h
index b2352a2..8d59019 100644
--- a/ash/capture_mode/capture_mode_camera_controller.h
+++ b/ash/capture_mode/capture_mode_camera_controller.h
@@ -9,6 +9,7 @@
 #include <vector>
 
 #include "ash/ash_export.h"
+#include "base/callback_forward.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/observer_list_types.h"
@@ -26,16 +27,21 @@
  public:
   CameraId() = default;
   CameraId(std::string model_id, int number);
+  CameraId(const CameraId&) = default;
   CameraId(CameraId&&) = default;
+  CameraId& operator=(const CameraId&) = default;
   CameraId& operator=(CameraId&&) = default;
   ~CameraId() = default;
 
-  bool is_valid() const { return !model_id_.empty(); }
-  const std::string& model_id() const { return model_id_; }
+  bool is_valid() const { return !model_id_or_display_name_.empty(); }
+  const std::string& model_id_or_display_name() const {
+    return model_id_or_display_name_;
+  }
   int number() const { return number_; }
 
   bool operator==(const CameraId& rhs) const {
-    return model_id_ == rhs.model_id_ && number_ == rhs.number_;
+    return model_id_or_display_name_ == rhs.model_id_or_display_name_ &&
+           number_ == rhs.number_;
   }
   bool operator!=(const CameraId& rhs) const { return !(*this == rhs); }
 
@@ -51,7 +57,7 @@
   // Note that in some cases, `media::VideoCaptureDeviceDescriptor::model_id`
   // may not be present. In this case, this will be filled by the camera's
   // display name.
-  std::string model_id_;
+  std::string model_id_or_display_name_;
 
   // A number that disambiguates cameras of the same type. For example if we
   // have two connected cameras of the same type, the first one will have
@@ -127,6 +133,10 @@
   // base::SystemMonitor::DevicesChangedObserver:
   void OnDevicesChanged(base::SystemMonitor::DeviceType device_type) override;
 
+  void SetOnCameraListReceivedForTesting(base::OnceClosure callback) {
+    on_camera_list_received_for_test_ = std::move(callback);
+  }
+
  private:
   // Called to connect to the video capture services's video source provider for
   // the first time, or when the connection to it is lost. It also queries the
@@ -168,6 +178,13 @@
 
   base::ObserverList<Observer> observers_;
 
+  // If bound, will be invoked at the end of the scope of
+  // `OnCameraDevicesReceived()` regardless of whether there was a change in the
+  // available cameras or not, which is different from the behavior of
+  // `Observer::OnAvailableCamerasChanged()` which is called only when there is
+  // a change.
+  base::OnceClosure on_camera_list_received_for_test_;
+
   // TODO(https://crbug.com/1290883): Remove this and replace it by the actual
   // preview widget. This was added temporarily for testing purposes.
   bool camera_preview_widget_ = false;
diff --git a/ash/capture_mode/capture_mode_camera_unittests.cc b/ash/capture_mode/capture_mode_camera_unittests.cc
index d6a74d5..fc4a44a 100644
--- a/ash/capture_mode/capture_mode_camera_unittests.cc
+++ b/ash/capture_mode/capture_mode_camera_unittests.cc
@@ -40,15 +40,22 @@
     GetCameraController()->RemoveObserver(this);
   }
 
+  int camera_change_event_count() const { return camera_change_event_count_; }
+
   void Wait() { loop_.Run(); }
 
   // CaptureModeCameraController::Observer:
   void OnAvailableCamerasChanged(const CameraInfoList& cameras) override {
+    ++camera_change_event_count_;
     loop_.Quit();
   }
 
  private:
   base::RunLoop loop_;
+
+  // Tracks the number of times the observer call `OnAvailableCamerasChanged()`
+  // was triggered.
+  int camera_change_event_count_ = 0;
 };
 
 }  // namespace
@@ -109,8 +116,8 @@
 
   EXPECT_EQ(1u, camera_controller->available_cameras().size());
   EXPECT_TRUE(camera_controller->available_cameras()[0].camera_id.is_valid());
-  EXPECT_EQ(model_id,
-            camera_controller->available_cameras()[0].camera_id.model_id());
+  EXPECT_EQ(model_id, camera_controller->available_cameras()[0]
+                          .camera_id.model_id_or_display_name());
   EXPECT_EQ(1, camera_controller->available_cameras()[0].camera_id.number());
   EXPECT_EQ(device_id, camera_controller->available_cameras()[0].device_id);
   EXPECT_EQ(display_name,
@@ -198,7 +205,8 @@
   const auto& available_cameras = camera_controller->available_cameras();
   EXPECT_EQ(1u, available_cameras.size());
   EXPECT_EQ(1, available_cameras[0].camera_id.number());
-  EXPECT_EQ(model_id, available_cameras[0].camera_id.model_id());
+  EXPECT_EQ(model_id,
+            available_cameras[0].camera_id.model_id_or_display_name());
 
   // Adding a new camera of the same model should be correctly tracked with a
   // different ID.
@@ -211,7 +219,8 @@
 
   EXPECT_EQ(2u, available_cameras.size());
   EXPECT_EQ(2, available_cameras[1].camera_id.number());
-  EXPECT_EQ(model_id, available_cameras[1].camera_id.model_id());
+  EXPECT_EQ(model_id,
+            available_cameras[1].camera_id.model_id_or_display_name());
   EXPECT_NE(available_cameras[0].camera_id, available_cameras[1].camera_id);
 }
 
@@ -232,7 +241,21 @@
   EXPECT_EQ(1u, available_cameras.size());
   EXPECT_TRUE(available_cameras[0].camera_id.is_valid());
   EXPECT_EQ(1, available_cameras[0].camera_id.number());
-  EXPECT_EQ(display_name, available_cameras[0].camera_id.model_id());
+  EXPECT_EQ(display_name,
+            available_cameras[0].camera_id.model_id_or_display_name());
+
+  // If the SystemMonitor triggered a device change alert for some reason, but
+  // the actual list of cameras didn't change, observers should never be
+  // notified again.
+  {
+    base::RunLoop loop;
+    camera_controller->SetOnCameraListReceivedForTesting(loop.QuitClosure());
+    CameraDevicesChangeWaiter observer;
+    base::SystemMonitor::Get()->ProcessDevicesChanged(
+        base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE);
+    loop.Run();
+    EXPECT_EQ(0, observer.camera_change_event_count());
+  }
 }
 
 }  // namespace ash
diff --git a/ash/clipboard/clipboard_history_menu_model_adapter.cc b/ash/clipboard/clipboard_history_menu_model_adapter.cc
index 605caa9b..47c56a5e 100644
--- a/ash/clipboard/clipboard_history_menu_model_adapter.cc
+++ b/ash/clipboard/clipboard_history_menu_model_adapter.cc
@@ -103,7 +103,7 @@
       l10n_util::GetStringUTF16(IDS_CLIPBOARD_HISTORY_MENU_TITLE));
   menu_runner_ = std::make_unique<views::MenuRunner>(
       root_view_, views::MenuRunner::CONTEXT_MENU |
-                      views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+                      views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                       views::MenuRunner::FIXED_ANCHOR);
   menu_runner_->RunMenuAt(
       /*widget_owner=*/nullptr, /*menu_button_controller=*/nullptr, anchor_rect,
diff --git a/ash/components/arc/arc_features_parser.cc b/ash/components/arc/arc_features_parser.cc
index faeb040..8dac975 100644
--- a/ash/components/arc/arc_features_parser.cc
+++ b/ash/components/arc/arc_features_parser.cc
@@ -46,7 +46,7 @@
     LOG(ERROR) << "No feature list in JSON.";
     return absl::nullopt;
   }
-  for (auto& feature_item : feature_list->GetList()) {
+  for (auto& feature_item : feature_list->GetListDeprecated()) {
     const base::Value* feature_name =
         feature_item.FindKeyOfType("name", base::Value::Type::STRING);
     const base::Value* feature_version =
@@ -71,7 +71,7 @@
     LOG(ERROR) << "No unavailable feature list in JSON.";
     return absl::nullopt;
   }
-  for (auto& feature_item : unavailable_feature_list->GetList()) {
+  for (auto& feature_item : unavailable_feature_list->GetListDeprecated()) {
     if (!feature_item.is_string()) {
       LOG(ERROR) << "Item in the unavailable feature list is not a string.";
       return absl::nullopt;
diff --git a/ash/components/arc/arc_util.cc b/ash/components/arc/arc_util.cc
index bb3c49a8..1f65d7d 100644
--- a/ash/components/arc/arc_util.cc
+++ b/ash/components/arc/arc_util.cc
@@ -256,15 +256,15 @@
 absl::optional<int> GetWindowTaskId(const aura::Window* window) {
   if (!window)
     return absl::nullopt;
-  const std::string* arc_app_id = exo::GetShellApplicationId(window);
-  if (!arc_app_id)
+  const std::string* window_app_id = exo::GetShellApplicationId(window);
+  if (!window_app_id)
     return absl::nullopt;
-  return GetTaskIdFromWindowAppId(*arc_app_id);
+  return GetTaskIdFromWindowAppId(*window_app_id);
 }
 
-absl::optional<int> GetTaskIdFromWindowAppId(const std::string& app_id) {
+absl::optional<int> GetTaskIdFromWindowAppId(const std::string& window_app_id) {
   int task_id;
-  if (std::sscanf(app_id.c_str(), "org.chromium.arc.%d", &task_id) != 1)
+  if (std::sscanf(window_app_id.c_str(), "org.chromium.arc.%d", &task_id) != 1)
     return absl::nullopt;
   return task_id;
 }
@@ -272,29 +272,27 @@
 absl::optional<int> GetWindowSessionId(const aura::Window* window) {
   if (!window)
     return absl::nullopt;
-  const std::string* arc_app_id = exo::GetShellApplicationId(window);
-  if (!arc_app_id)
+  const std::string* window_app_id = exo::GetShellApplicationId(window);
+  if (!window_app_id)
     return absl::nullopt;
-  return GetSessionIdFromWindowAppId(*arc_app_id);
+  return GetSessionIdFromWindowAppId(*window_app_id);
 }
 
-absl::optional<int> GetSessionIdFromWindowAppId(const std::string& app_id) {
+absl::optional<int> GetSessionIdFromWindowAppId(
+    const std::string& window_app_id) {
   int session_id;
-  if (std::sscanf(app_id.c_str(), "org.chromium.arc.session.%d", &session_id) !=
-      1) {
+  if (std::sscanf(window_app_id.c_str(), "org.chromium.arc.session.%d",
+                  &session_id) != 1) {
     return absl::nullopt;
   }
   return session_id;
 }
 
 absl::optional<int> GetWindowTaskOrSessionId(const aura::Window* window) {
-  if (!window)
-    return absl::nullopt;
-  const std::string* arc_app_id = exo::GetShellApplicationId(window);
-  if (!arc_app_id)
-    return absl::nullopt;
-  auto task_id = GetTaskIdFromWindowAppId(*arc_app_id);
-  return task_id ? *task_id : GetSessionIdFromWindowAppId(*arc_app_id);
+  auto result = GetWindowTaskId(window);
+  if (result)
+    return result;
+  return GetWindowSessionId(window);
 }
 
 bool IsArcForceCacheAppIcon() {
diff --git a/ash/components/arc/arc_util.h b/ash/components/arc/arc_util.h
index b09c4c5..16d9110d 100644
--- a/ash/components/arc/arc_util.h
+++ b/ash/components/arc/arc_util.h
@@ -174,9 +174,10 @@
 // Returns the task id given by the exo shell's application id, or
 // absl::nullopt if not an ARC window.
 absl::optional<int> GetWindowTaskId(const aura::Window* window);
-absl::optional<int> GetTaskIdFromWindowAppId(const std::string& app_id);
+absl::optional<int> GetTaskIdFromWindowAppId(const std::string& window_app_id);
 absl::optional<int> GetWindowSessionId(const aura::Window* window);
-absl::optional<int> GetSessionIdFromWindowAppId(const std::string& app_id);
+absl::optional<int> GetSessionIdFromWindowAppId(
+    const std::string& window_app_id);
 absl::optional<int> GetWindowTaskOrSessionId(const aura::Window* window);
 
 // Returns true if ARC app icons are forced to cache.
diff --git a/ash/components/arc/enterprise/snapshot_hours_policy_service.cc b/ash/components/arc/enterprise/snapshot_hours_policy_service.cc
index e561cf5..5d95260 100644
--- a/ash/components/arc/enterprise/snapshot_hours_policy_service.cc
+++ b/ash/components/arc/enterprise/snapshot_hours_policy_service.cc
@@ -115,7 +115,7 @@
   if (!intervals)
     return;
 
-  for (const auto& entry : intervals->GetList()) {
+  for (const auto& entry : intervals->GetListDeprecated()) {
     if (!entry.is_dict())
       continue;
     auto interval =
diff --git a/ash/components/arc/mojom/BUILD.gn b/ash/components/arc/mojom/BUILD.gn
index 6339249..e317a4af 100644
--- a/ash/components/arc/mojom/BUILD.gn
+++ b/ash/components/arc/mojom/BUILD.gn
@@ -415,6 +415,7 @@
   sources = [
     "ime_mojom_traits_unittest.cc",
     "video_accelerator_mojom_traits_unittest.cc",
+    "video_encode_accelerator_mojom_traits_unittest.cc",
   ]
 
   deps = [
diff --git a/ash/components/arc/mojom/video_encode_accelerator_mojom_traits_unittest.cc b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits_unittest.cc
new file mode 100644
index 0000000..0d9dc90
--- /dev/null
+++ b/ash/components/arc/mojom/video_encode_accelerator_mojom_traits_unittest.cc
@@ -0,0 +1,123 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/components/arc/mojom/video_encode_accelerator_mojom_traits.h"
+
+#include <limits>
+
+#include "ash/components/arc/mojom/video_common.mojom.h"
+#include "media/base/bitrate.h"
+#include "media/video/video_encode_accelerator.h"
+#include "mojo/public/cpp/test_support/test_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace mojo {
+
+TEST(BitrateDataViewUnionTraitsTest, ConstantBitrateRoundTrip) {
+  media::Bitrate input_bitrate = media::Bitrate::ConstantBitrate(1234u);
+
+  media::Bitrate output_bitrate;
+  mojo::test::SerializeAndDeserialize<arc::mojom::Bitrate>(input_bitrate,
+                                                           output_bitrate);
+
+  EXPECT_EQ(input_bitrate, output_bitrate);
+}
+
+TEST(BitrateDataViewUnionTraitsTest, VariableBitrateRoundTrip) {
+  media::Bitrate input_bitrate = media::Bitrate::VariableBitrate(1000u, 2000u);
+
+  media::Bitrate output_bitrate;
+  mojo::test::SerializeAndDeserialize<arc::mojom::Bitrate>(input_bitrate,
+                                                           output_bitrate);
+
+  EXPECT_EQ(input_bitrate, output_bitrate);
+}
+
+TEST(BitrateDataViewUnionTraitsTest, ConstantBitrateMaximumTarget) {
+  media::Bitrate input_bitrate =
+      media::Bitrate::ConstantBitrate(std::numeric_limits<uint32_t>::max());
+
+  media::Bitrate output_bitrate;
+  mojo::test::SerializeAndDeserialize<arc::mojom::Bitrate>(input_bitrate,
+                                                           output_bitrate);
+
+  EXPECT_EQ(input_bitrate, output_bitrate);
+  EXPECT_EQ(output_bitrate.target(), std::numeric_limits<uint32_t>::max());
+}
+
+TEST(BitrateDataViewUnionTraitsTest, VariableBitrateMaximumTargetAndPeak) {
+  media::Bitrate input_bitrate =
+      media::Bitrate::VariableBitrate(std::numeric_limits<uint32_t>::max(),
+                                      std::numeric_limits<uint32_t>::max());
+
+  media::Bitrate output_bitrate;
+  mojo::test::SerializeAndDeserialize<arc::mojom::Bitrate>(input_bitrate,
+                                                           output_bitrate);
+
+  EXPECT_EQ(input_bitrate, output_bitrate);
+  EXPECT_EQ(output_bitrate.target(), std::numeric_limits<uint32_t>::max());
+  EXPECT_EQ(output_bitrate.peak(), std::numeric_limits<uint32_t>::max());
+}
+
+TEST(VideoEncodeAcceleratorConfigStructTraitTest, RoundTrip) {
+  // Spatial layers are needed for construction of the
+  // VideoEncodeAccelerator::Config but not used in the final check because they
+  // are not transported
+  std::vector<::media::VideoEncodeAccelerator::Config::SpatialLayer>
+      input_spatial_layers;
+  constexpr gfx::Size kBaseSize(320, 180);
+  constexpr uint32_t kBaseBitrateBps = 123456u;
+  constexpr uint32_t kBaseFramerate = 24u;
+  const ::media::Bitrate kBitrate =
+      ::media::Bitrate::ConstantBitrate(kBaseBitrateBps);
+
+  ::media::VideoEncodeAccelerator::Config input_config(
+      ::media::PIXEL_FORMAT_NV12, kBaseSize, ::media::VP9PROFILE_PROFILE0,
+      kBitrate, kBaseFramerate, absl::nullopt, absl::nullopt, false,
+      ::media::VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer,
+      ::media::VideoEncodeAccelerator::Config::ContentType::kCamera,
+      input_spatial_layers,
+      ::media::VideoEncodeAccelerator::Config::InterLayerPredMode::kOnKeyPic);
+
+  ::media::VideoEncodeAccelerator::Config output_config{};
+  ASSERT_TRUE(mojo::test::SerializeAndDeserialize<
+              arc::mojom::VideoEncodeAcceleratorConfig>(input_config,
+                                                        output_config));
+  // Arc does not transport the fields:
+  //  |is_constrained_h264|
+  //  |gop_length|
+  //  |content_type|
+  //  |spatial_layers|
+  //  |inter_layer_pred|
+  //  |require_low_delay|
+  // so we check fields individually rather than checking overall equality of
+  // the configs
+  EXPECT_EQ(input_config.input_format, output_config.input_format);
+  EXPECT_EQ(input_config.input_visible_size, output_config.input_visible_size);
+  EXPECT_EQ(input_config.output_profile, output_config.output_profile);
+  EXPECT_EQ(input_config.initial_framerate, output_config.initial_framerate);
+  EXPECT_EQ(input_config.h264_output_level, output_config.h264_output_level);
+  EXPECT_EQ(input_config.storage_type, output_config.storage_type);
+  EXPECT_EQ(input_config.bitrate, output_config.bitrate);
+}
+
+TEST(VideoEncodeAcceleratorConfigStructTraitTest, RoundTripVariableBitrate) {
+  constexpr gfx::Size kBaseSize(320, 180);
+  constexpr uint32_t kBaseBitrateBps = 123456u;
+  constexpr uint32_t kMaximumBitrate = 999999u;
+  const ::media::Bitrate kBitrate =
+      ::media::Bitrate::VariableBitrate(kBaseBitrateBps, kMaximumBitrate);
+  ::media::VideoEncodeAccelerator::Config input_config(
+      ::media::PIXEL_FORMAT_NV12, kBaseSize, ::media::VP9PROFILE_PROFILE0,
+      kBitrate);
+
+  ::media::VideoEncodeAccelerator::Config output_config{};
+  ASSERT_TRUE(mojo::test::SerializeAndDeserialize<
+              arc::mojom::VideoEncodeAcceleratorConfig>(input_config,
+                                                        output_config));
+
+  EXPECT_EQ(input_config.bitrate, output_config.bitrate);
+}
+
+}  // namespace mojo
diff --git a/ash/components/arc/net/arc_net_host_impl.cc b/ash/components/arc/net/arc_net_host_impl.cc
index d96a5ea..881dfe65 100644
--- a/ash/components/arc/net/arc_net_host_impl.cc
+++ b/ash/components/arc/net/arc_net_host_impl.cc
@@ -247,7 +247,7 @@
   // the kStaticIPConfigProperty object will be empty except for DNS addresses.
   if (const auto* dns_list =
           shill_ipconfig->FindListKey(shill::kNameServersProperty)) {
-    for (const auto& dns_value : dns_list->GetList()) {
+    for (const auto& dns_value : dns_list->GetListDeprecated()) {
       const std::string& dns = dns_value.GetString();
       if (dns.empty())
         continue;
@@ -264,7 +264,7 @@
   if (const auto* domains =
           shill_ipconfig->FindKey(shill::kSearchDomainsProperty)) {
     if (domains->is_list()) {
-      for (const auto& domain : domains->GetList())
+      for (const auto& domain : domains->GetListDeprecated())
         network->host_search_domains->push_back(domain.GetString());
     }
   }
diff --git a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
index c43075b..1e9b0b94 100644
--- a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
+++ b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
@@ -155,7 +155,7 @@
     const std::string& uuid) const {
   const base::Value* uuid_list =
       pref_service_->GetList(prefs::kArcVisibleExternalStorages);
-  for (auto& value : uuid_list->GetList()) {
+  for (auto& value : uuid_list->GetListDeprecated()) {
     if (value.is_string() && value.GetString() == uuid)
       return true;
   }
diff --git a/ash/components/login/auth/sync_trusted_vault_keys.cc b/ash/components/login/auth/sync_trusted_vault_keys.cc
index 68bfdb5..e8f8bef 100644
--- a/ash/components/login/auth/sync_trusted_vault_keys.cc
+++ b/ash/components/login/auth/sync_trusted_vault_keys.cc
@@ -63,7 +63,7 @@
   }
 
   std::vector<T> parsed_list;
-  for (const base::Value& list_entry : list->GetList()) {
+  for (const base::Value& list_entry : list->GetListDeprecated()) {
     absl::optional<T> parsed_entry = entry_parser.Run(list_entry);
     if (parsed_entry.has_value()) {
       parsed_list.push_back(std::move(*parsed_entry));
diff --git a/ash/components/peripheral_notification/peripheral_notification_manager.cc b/ash/components/peripheral_notification/peripheral_notification_manager.cc
index 0354a1c..24a47d3f 100644
--- a/ash/components/peripheral_notification/peripheral_notification_manager.cc
+++ b/ash/components/peripheral_notification/peripheral_notification_manager.cc
@@ -134,9 +134,32 @@
     return;
 
   // Decode cable warnging signal.
-  if (cable_warning_type == typecd::CableWarningType::kInvalidDpCable) {
-    NotifyInvalidDpCable();
-    RecordConnectivityMetric(PeripheralConnectivityResults::kInvalidDpCable);
+  switch (cable_warning_type) {
+    case typecd::CableWarningType::kInvalidDpCable:
+      NotifyInvalidDpCable();
+      RecordConnectivityMetric(PeripheralConnectivityResults::kInvalidDpCable);
+      break;
+    case typecd::CableWarningType::kInvalidUSB4ValidTBTCable:
+      NotifyInvalidUSB4ValidTBTCableWarning();
+      RecordConnectivityMetric(
+          PeripheralConnectivityResults::kInvalidUSB4ValidTBTCable);
+      break;
+    case typecd::CableWarningType::kInvalidUSB4Cable:
+      NotifyInvalidUSB4CableWarning();
+      RecordConnectivityMetric(
+          PeripheralConnectivityResults::kInvalidUSB4Cable);
+      break;
+    case typecd::CableWarningType::kInvalidTBTCable:
+      NotifyInvalidTBTCableWarning();
+      RecordConnectivityMetric(PeripheralConnectivityResults::kInvalidTBTCable);
+      break;
+    case typecd::CableWarningType::kSpeedLimitingCable:
+      NotifySpeedLimitingCableWarning();
+      RecordConnectivityMetric(
+          PeripheralConnectivityResults::kSpeedLimitingCable);
+      break;
+    default:
+      break;
   }
 }
 
@@ -145,6 +168,26 @@
     observer.OnInvalidDpCableWarning();
 }
 
+void PeripheralNotificationManager::NotifyInvalidUSB4ValidTBTCableWarning() {
+  for (auto& observer : observer_list_)
+    observer.OnInvalidUSB4ValidTBTCableWarning();
+}
+
+void PeripheralNotificationManager::NotifyInvalidUSB4CableWarning() {
+  for (auto& observer : observer_list_)
+    observer.OnInvalidUSB4CableWarning();
+}
+
+void PeripheralNotificationManager::NotifyInvalidTBTCableWarning() {
+  for (auto& observer : observer_list_)
+    observer.OnInvalidTBTCableWarning();
+}
+
+void PeripheralNotificationManager::NotifySpeedLimitingCableWarning() {
+  for (auto& observer : observer_list_)
+    observer.OnSpeedLimitingCableWarning();
+}
+
 void PeripheralNotificationManager::OnDeviceConnected(
     device::mojom::UsbDeviceInfo* device) {
   if (device->class_code == kBillboardDeviceClassCode) {
diff --git a/ash/components/peripheral_notification/peripheral_notification_manager.h b/ash/components/peripheral_notification/peripheral_notification_manager.h
index 17cce368..ed23c36 100644
--- a/ash/components/peripheral_notification/peripheral_notification_manager.h
+++ b/ash/components/peripheral_notification/peripheral_notification_manager.h
@@ -59,6 +59,27 @@
     // sent by typecd when the partner meets the conditions for DP alternate
     // mode, but the cable does not.
     virtual void OnInvalidDpCableWarning() = 0;
+
+    // Called to notify the user that their USB4 device is unable to establish a
+    // USB4 connection because of the cable. In this case, the connection will
+    // fall back to Thunderbolt.
+    virtual void OnInvalidUSB4ValidTBTCableWarning() = 0;
+
+    // Called to notify the user that their USB4 device is unable to establish a
+    // USB4 connection because of the cable. It is similar to
+    // OnUSB4ToThundeboltCableWarning, but in this case the connection will
+    // fall back to DisplayPort, USB 3.2 or USB 2.0.
+    virtual void OnInvalidUSB4CableWarning() = 0;
+
+    // Called to notify the user that their Thubderbolt device is unable to
+    // establish a Thunderbolt connection, and will instead use DisplayPort,
+    // USB 3.2 or USB 2.0.
+    virtual void OnInvalidTBTCableWarning() = 0;
+
+    // Called to notify the user when their 40 Gbps USB4 device is unable to use
+    // 40 Gbps data transmission because of the cable. Transmissions speeds will
+    // decrease to 20 Gbps, 10 Gbps or 5 Gbps.
+    virtual void OnSpeedLimitingCableWarning() = 0;
   };
 
   // These values are persisted to logs. Entries should not be renumbered and
@@ -72,7 +93,11 @@
     kPeripheralBlocked = 5,
     kBillboardDevice = 6,
     kInvalidDpCable = 7,
-    kMaxValue = kInvalidDpCable,
+    kInvalidUSB4ValidTBTCable = 8,
+    kInvalidUSB4Cable = 9,
+    kInvalidTBTCable = 10,
+    kSpeedLimitingCable = 11,
+    kMaxValue = kSpeedLimitingCable,
   };
 
   // Sets the global instance. Must be called before any calls to Get().
@@ -118,6 +143,10 @@
   void NotifyPeripheralBlockedReceived();
   void OnBillboardDeviceConnected(bool billboard_is_supported);
   void NotifyInvalidDpCable();
+  void NotifyInvalidUSB4ValidTBTCableWarning();
+  void NotifyInvalidUSB4CableWarning();
+  void NotifyInvalidTBTCableWarning();
+  void NotifySpeedLimitingCableWarning();
 
   // Called by unit tests to set up root_prefix_ for simulating the existence
   // of a system folder.
diff --git a/ash/components/peripheral_notification/peripheral_notification_manager_unittest.cc b/ash/components/peripheral_notification/peripheral_notification_manager_unittest.cc
index 8d23229..938acb9 100644
--- a/ash/components/peripheral_notification/peripheral_notification_manager_unittest.cc
+++ b/ash/components/peripheral_notification/peripheral_notification_manager_unittest.cc
@@ -56,6 +56,22 @@
     return num_invalid_dp_cable_notification_calls_;
   }
 
+  size_t num_invalid_usb4_valid_tbt_cable_notification_calls() const {
+    return num_invalid_usb4_valid_tbt_cable_notification_calls_;
+  }
+
+  size_t num_invalid_usb4_cable_notification_calls() const {
+    return num_invalid_usb4_cable_notification_calls_;
+  }
+
+  size_t num_invalid_tbt_cable_notification_calls() const {
+    return num_invalid_tbt_cable_notification_calls_;
+  }
+
+  size_t num_speed_limiting_cable_notification_calls() const {
+    return num_speed_limiting_cable_notification_calls_;
+  }
+
   bool is_current_guest_device_tbt_only() const {
     return is_current_guest_device_tbt_only_;
   }
@@ -82,12 +98,32 @@
     ++num_invalid_dp_cable_notification_calls_;
   }
 
+  void OnInvalidUSB4ValidTBTCableWarning() override {
+    ++num_invalid_usb4_valid_tbt_cable_notification_calls_;
+  }
+
+  void OnInvalidUSB4CableWarning() override {
+    ++num_invalid_usb4_cable_notification_calls_;
+  }
+
+  void OnInvalidTBTCableWarning() override {
+    ++num_invalid_tbt_cable_notification_calls_;
+  }
+
+  void OnSpeedLimitingCableWarning() override {
+    ++num_speed_limiting_cable_notification_calls_;
+  }
+
  private:
   size_t num_limited_performance_notification_calls_ = 0u;
   size_t num_guest_notification_calls_ = 0u;
   size_t num_peripheral_blocked_notification_calls_ = 0u;
   size_t num_billboard_notification_calls_ = 0u;
   size_t num_invalid_dp_cable_notification_calls_ = 0u;
+  size_t num_invalid_usb4_valid_tbt_cable_notification_calls_ = 0u;
+  size_t num_invalid_usb4_cable_notification_calls_ = 0u;
+  size_t num_invalid_tbt_cable_notification_calls_ = 0u;
+  size_t num_speed_limiting_cable_notification_calls_ = 0u;
   bool is_current_guest_device_tbt_only_ = false;
 };
 
@@ -163,6 +199,22 @@
     return fake_observer_.num_invalid_dp_cable_notification_calls();
   }
 
+  size_t GetInvalidUSB4ValidTBTCableNotificationObserverCalls() {
+    return fake_observer_.num_invalid_usb4_valid_tbt_cable_notification_calls();
+  }
+
+  size_t GetInvalidUSB4CableNotificationObserverCalls() {
+    return fake_observer_.num_invalid_usb4_cable_notification_calls();
+  }
+
+  size_t GetInvalidTBTCableNotificationObserverCalls() {
+    return fake_observer_.num_invalid_tbt_cable_notification_calls();
+  }
+
+  size_t GetSpeedLimitingCableNotificationObserverCalls() {
+    return fake_observer_.num_speed_limiting_cable_notification_calls();
+  }
+
   bool GetIsCurrentGuestDeviceTbtOnly() {
     return fake_observer_.is_current_guest_device_tbt_only();
   }
@@ -477,4 +529,96 @@
       1);
 }
 
+TEST_F(PeripheralNotificationManagerTest, InvalidUSB4ValidTBTCableWarning) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kUsbNotificationController);
+  InitializeManager(/*is_guest_profile=*/false,
+                    /*is_pcie_tunneling_allowed=*/false);
+  EXPECT_EQ(0u, GetInvalidUSB4ValidTBTCableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kInvalidUSB4ValidTBTCable,
+      0);
+
+  typecd::CableWarningType cable_warning_type =
+      typecd::CableWarningType::kInvalidUSB4ValidTBTCable;
+  fake_typecd_client()->EmitCableWarningSignal(cable_warning_type);
+  EXPECT_EQ(1u, GetInvalidUSB4ValidTBTCableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kInvalidUSB4ValidTBTCable,
+      1);
+}
+
+TEST_F(PeripheralNotificationManagerTest, InvalidUSB4CableWarning) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kUsbNotificationController);
+  InitializeManager(/*is_guest_profile=*/false,
+                    /*is_pcie_tunneling_allowed=*/false);
+  EXPECT_EQ(0u, GetInvalidUSB4CableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kInvalidUSB4Cable,
+      0);
+
+  typecd::CableWarningType cable_warning_type =
+      typecd::CableWarningType::kInvalidUSB4Cable;
+  fake_typecd_client()->EmitCableWarningSignal(cable_warning_type);
+  EXPECT_EQ(1u, GetInvalidUSB4CableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kInvalidUSB4Cable,
+      1);
+}
+
+TEST_F(PeripheralNotificationManagerTest, InvalidTBTCableWarning) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kUsbNotificationController);
+  InitializeManager(/*is_guest_profile=*/false,
+                    /*is_pcie_tunneling_allowed=*/false);
+  EXPECT_EQ(0u, GetInvalidTBTCableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kInvalidTBTCable,
+      0);
+
+  typecd::CableWarningType cable_warning_type =
+      typecd::CableWarningType::kInvalidTBTCable;
+  fake_typecd_client()->EmitCableWarningSignal(cable_warning_type);
+  EXPECT_EQ(1u, GetInvalidTBTCableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kInvalidTBTCable,
+      1);
+}
+
+TEST_F(PeripheralNotificationManagerTest, SpeedLimitingCableWarning) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(features::kUsbNotificationController);
+  InitializeManager(/*is_guest_profile=*/false,
+                    /*is_pcie_tunneling_allowed=*/false);
+  EXPECT_EQ(0u, GetSpeedLimitingCableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kSpeedLimitingCable,
+      0);
+
+  typecd::CableWarningType cable_warning_type =
+      typecd::CableWarningType::kSpeedLimitingCable;
+  fake_typecd_client()->EmitCableWarningSignal(cable_warning_type);
+  EXPECT_EQ(1u, GetSpeedLimitingCableNotificationObserverCalls());
+  histogram_tester_.ExpectBucketCount(
+      "Ash.Peripheral.ConnectivityResults",
+      PeripheralNotificationManager::PeripheralConnectivityResults::
+          kSpeedLimitingCable,
+      1);
+}
+
 }  // namespace ash
diff --git a/ash/components/phonehub/recent_apps_interaction_handler_impl.cc b/ash/components/phonehub/recent_apps_interaction_handler_impl.cc
index 52e1572d..3697868a 100644
--- a/ash/components/phonehub/recent_apps_interaction_handler_impl.cc
+++ b/ash/components/phonehub/recent_apps_interaction_handler_impl.cc
@@ -118,7 +118,7 @@
     PA_LOG(INFO) << "LoadRecentAppMetadataListFromPref";
     const base::Value* recent_apps_history_pref =
         pref_service_->GetList(prefs::kRecentAppsHistory);
-    for (const auto& value : recent_apps_history_pref->GetList()) {
+    for (const auto& value : recent_apps_history_pref->GetListDeprecated()) {
       DCHECK(value.is_dict());
       recent_app_metadata_list_.emplace_back(
           Notification::AppMetadata::FromValue(value),
diff --git a/ash/components/settings/cros_settings_names.cc b/ash/components/settings/cros_settings_names.cc
index e2aa9b1..eac9b085 100644
--- a/ash/components/settings/cros_settings_names.cc
+++ b/ash/components/settings/cros_settings_names.cc
@@ -160,6 +160,10 @@
 const char kReportDeviceNetworkStatus[] =
     "cros.device_status.report_network_status";
 
+// A boolean pref that determines whether the device peripherals should be
+// included in reports to the telemetry API.
+const char kReportDevicePeripherals[] = "cros.device_status.report_peripherals";
+
 // A boolean pref that determines whether the device power status should be
 // included in status reports to the device management server.
 const char kReportDevicePowerStatus[] =
diff --git a/ash/components/settings/cros_settings_names.h b/ash/components/settings/cros_settings_names.h
index a457c285..81e2faa 100644
--- a/ash/components/settings/cros_settings_names.h
+++ b/ash/components/settings/cros_settings_names.h
@@ -106,6 +106,8 @@
 COMPONENT_EXPORT(ASH_SETTINGS)
 extern const char kReportDeviceNetworkStatus[];
 COMPONENT_EXPORT(ASH_SETTINGS)
+extern const char kReportDevicePeripherals[];
+COMPONENT_EXPORT(ASH_SETTINGS)
 extern const char kReportDevicePowerStatus[];
 COMPONENT_EXPORT(ASH_SETTINGS)
 extern const char kReportDeviceStorageStatus[];
diff --git a/ash/components/tether/persistent_host_scan_cache_impl.cc b/ash/components/tether/persistent_host_scan_cache_impl.cc
index d5152202..2fa945e 100644
--- a/ash/components/tether/persistent_host_scan_cache_impl.cc
+++ b/ash/components/tether/persistent_host_scan_cache_impl.cc
@@ -107,7 +107,7 @@
 
   std::unordered_map<std::string, HostScanCacheEntry> entries;
   std::unordered_set<std::string> ids_processed_so_far;
-  for (auto& cache_entry_value : cache_entry_list->GetList()) {
+  for (auto& cache_entry_value : cache_entry_list->GetListDeprecated()) {
     const base::DictionaryValue* cache_entry_dict;
 
     if (!cache_entry_value.GetAsDictionary(&cache_entry_dict)) {
diff --git a/ash/components/tether/tether_host_response_recorder.cc b/ash/components/tether/tether_host_response_recorder.cc
index 793f8e0e..abad158 100644
--- a/ash/components/tether/tether_host_response_recorder.cc
+++ b/ash/components/tether/tether_host_response_recorder.cc
@@ -78,7 +78,7 @@
     const std::string& device_id,
     const std::string& pref_name) {
   const base::Value* ids = pref_service_->GetList(pref_name);
-  base::Value::ConstListView ids_list = ids->GetList();
+  base::Value::ConstListView ids_list = ids->GetListDeprecated();
 
   std::string first_device_id_in_list;
   if (!ids_list.empty() && ids_list[0].is_string())
@@ -116,7 +116,7 @@
   if (!ids)
     return device_ids;
 
-  for (const auto& entry : ids->GetList()) {
+  for (const auto& entry : ids->GetListDeprecated()) {
     if (entry.is_string())
       device_ids.push_back(entry.GetString());
   }
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 63186dc..d261b14 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -339,6 +339,10 @@
 const base::Feature kCrostiniVirtualKeyboardSupport{
     "CrostiniVirtualKeyboardSupport", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables or disables support for third party VMs.
+const base::Feature kBruschetta{"Bruschetta",
+                                base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables or disables always using device-activity-status data to filter
 // eligible host phones.
 const base::Feature kCryptAuthV2AlwaysUseActiveEligibleHosts{
@@ -635,6 +639,10 @@
 const base::Feature kFilesTrash{"FilesTrash",
                                 base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables opening Office files located in Files app Drive in Web Drive.
+const base::Feature kFilesWebDriveOffice{"FilesWebDriveOffice",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables filters in Files app Recents view.
 const base::Feature kFiltersInRecents{"FiltersInRecents",
                                       base::FEATURE_DISABLED_BY_DEFAULT};
@@ -1570,6 +1578,10 @@
   return base::FeatureList::IsEnabled(kFilesSWA);
 }
 
+bool IsFilesWebDriveOfficeEnabled() {
+  return base::FeatureList::IsEnabled(kFilesWebDriveOffice);
+}
+
 bool IsFirmwareUpdaterAppEnabled() {
   return base::FeatureList::IsEnabled(kFirmwareUpdaterApp);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index 61bc290..fd2e5f0 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -140,6 +140,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kCrostiniImeSupport;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kCrostiniVirtualKeyboardSupport;
+COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kBruschetta;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kCryptAuthV2AlwaysUseActiveEligibleHosts;
 COMPONENT_EXPORT(ASH_CONSTANTS)
@@ -245,6 +246,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kFilesSinglePartitionFormat;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kFilesTrash;
+COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kFilesWebDriveOffice;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kFiltersInRecents;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kFirmwareUpdaterApp;
 COMPONENT_EXPORT(ASH_CONSTANTS)
diff --git a/ash/controls/scroll_view_gradient_helper.cc b/ash/controls/scroll_view_gradient_helper.cc
index 9d64aa8..62832cda 100644
--- a/ash/controls/scroll_view_gradient_helper.cc
+++ b/ash/controls/scroll_view_gradient_helper.cc
@@ -75,7 +75,10 @@
   // If a gradient is needed, lazily create the GradientLayerDelegate.
   if (!gradient_layer_) {
     DVLOG(1) << "Adding gradient mask layer";
-    gradient_layer_ = std::make_unique<GradientLayerDelegate>();
+    // Animate showing the gradient to avoid a visual "pop" at the end of the
+    // clamshell launcher open animation.
+    gradient_layer_ =
+        std::make_unique<GradientLayerDelegate>(/*animate_in=*/true);
     scroll_view_->layer()->SetMaskLayer(gradient_layer_->layer());
   }
 
diff --git a/ash/display/display_prefs.cc b/ash/display/display_prefs.cc
index b7f93f37..625e95f 100644
--- a/ash/display/display_prefs.cc
+++ b/ash/display/display_prefs.cc
@@ -409,7 +409,7 @@
   const base::Value* pref_data =
       local_state->Get(prefs::kExternalDisplayMirrorInfo);
   std::set<int64_t> external_display_mirror_info;
-  for (const auto& it : pref_data->GetList()) {
+  for (const auto& it : pref_data->GetListDeprecated()) {
     const std::string* display_id_str = it.GetIfString();
     if (!display_id_str)
       continue;
@@ -452,7 +452,8 @@
 
   DCHECK(mirroring_destination_ids_value->is_list());
   display::DisplayIdList mirroring_destination_ids;
-  for (const auto& entry : mirroring_destination_ids_value->GetList()) {
+  for (const auto& entry :
+       mirroring_destination_ids_value->GetListDeprecated()) {
     DCHECK(entry.is_string());
     int64_t id;
     if (!base::StringToInt64(entry.GetString(), &id))
diff --git a/ash/display/display_prefs_unittest.cc b/ash/display/display_prefs_unittest.cc
index 33dc930..e73ae72 100644
--- a/ash/display/display_prefs_unittest.cc
+++ b/ash/display/display_prefs_unittest.cc
@@ -266,7 +266,7 @@
     const auto* mirror_ids = prefs->FindListKey("mirroring_destination_ids");
     ASSERT_TRUE(mirror_ids);
     display::DisplayIdList pref_dest_ids;
-    for (const auto& value : mirror_ids->GetList()) {
+    for (const auto& value : mirror_ids->GetListDeprecated()) {
       int64_t id;
       EXPECT_TRUE(base::StringToInt64(value.GetString(), &id));
       pref_dest_ids.push_back(id);
@@ -287,7 +287,7 @@
         local_state()->Get(prefs::kExternalDisplayMirrorInfo);
     ASSERT_TRUE(prefs);
     std::set<int64_t> read_ids;
-    for (const auto& value : prefs->GetList()) {
+    for (const auto& value : prefs->GetListDeprecated()) {
       int64_t id;
       EXPECT_TRUE(base::StringToInt64(value.GetString(), &id));
       read_ids.insert(id);
@@ -463,7 +463,7 @@
 
   const base::Value* external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(0U, external_display_mirror_info->GetList().size());
+  EXPECT_EQ(0U, external_display_mirror_info->GetListDeprecated().size());
 
   const base::Value* properties =
       local_state()->GetDictionary(prefs::kDisplayProperties);
@@ -595,10 +595,10 @@
 
   external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(1U, external_display_mirror_info->GetList().size());
+  EXPECT_EQ(1U, external_display_mirror_info->GetListDeprecated().size());
   // ExternalDisplayInfo stores ID without output index.
   EXPECT_EQ(base::NumberToString(display::GetDisplayIdWithoutOutputIndex(id2)),
-            external_display_mirror_info->GetList()[0].GetString());
+            external_display_mirror_info->GetListDeprecated()[0].GetString());
 
   // External display's selected resolution must not change
   // by mirroring.
@@ -1421,9 +1421,10 @@
   LoadDisplayPreferences();
   const base::Value* pref_external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(1U, pref_external_display_mirror_info->GetList().size());
-  EXPECT_EQ(base::NumberToString(first_display_masked_id),
-            pref_external_display_mirror_info->GetList()[0].GetString());
+  EXPECT_EQ(1U, pref_external_display_mirror_info->GetListDeprecated().size());
+  EXPECT_EQ(
+      base::NumberToString(first_display_masked_id),
+      pref_external_display_mirror_info->GetListDeprecated()[0].GetString());
 
   // Add first display, mirror mode restores and the external display mirror
   // info does not change.
@@ -1432,9 +1433,10 @@
   EXPECT_TRUE(display_manager()->IsInMirrorMode());
   pref_external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(1U, pref_external_display_mirror_info->GetList().size());
-  EXPECT_EQ(base::NumberToString(first_display_masked_id),
-            pref_external_display_mirror_info->GetList()[0].GetString());
+  EXPECT_EQ(1U, pref_external_display_mirror_info->GetListDeprecated().size());
+  EXPECT_EQ(
+      base::NumberToString(first_display_masked_id),
+      pref_external_display_mirror_info->GetListDeprecated()[0].GetString());
 
   // Add second display, mirror mode persists and the second display id is added
   // to the external display mirror info.
@@ -1443,11 +1445,13 @@
   EXPECT_TRUE(display_manager()->IsInMirrorMode());
   pref_external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(2U, pref_external_display_mirror_info->GetList().size());
-  EXPECT_EQ(base::NumberToString(first_display_masked_id),
-            pref_external_display_mirror_info->GetList()[0].GetString());
-  EXPECT_EQ(base::NumberToString(second_display_masked_id),
-            pref_external_display_mirror_info->GetList()[1].GetString());
+  EXPECT_EQ(2U, pref_external_display_mirror_info->GetListDeprecated().size());
+  EXPECT_EQ(
+      base::NumberToString(first_display_masked_id),
+      pref_external_display_mirror_info->GetListDeprecated()[0].GetString());
+  EXPECT_EQ(
+      base::NumberToString(second_display_masked_id),
+      pref_external_display_mirror_info->GetListDeprecated()[1].GetString());
 
   // Disconnect all external displays.
   display_info_list.erase(display_info_list.begin() + 1,
@@ -1461,9 +1465,10 @@
   LoadDisplayPreferences();
   pref_external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(1U, pref_external_display_mirror_info->GetList().size());
-  EXPECT_EQ(base::NumberToString(second_display_masked_id),
-            pref_external_display_mirror_info->GetList()[0].GetString());
+  EXPECT_EQ(1U, pref_external_display_mirror_info->GetListDeprecated().size());
+  EXPECT_EQ(
+      base::NumberToString(second_display_masked_id),
+      pref_external_display_mirror_info->GetListDeprecated()[0].GetString());
 
   // Add first display, mirror mode is off and the external display mirror info
   // does not change.
@@ -1472,9 +1477,10 @@
   EXPECT_FALSE(display_manager()->IsInMirrorMode());
   pref_external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(1U, pref_external_display_mirror_info->GetList().size());
-  EXPECT_EQ(base::NumberToString(second_display_masked_id),
-            pref_external_display_mirror_info->GetList()[0].GetString());
+  EXPECT_EQ(1U, pref_external_display_mirror_info->GetListDeprecated().size());
+  EXPECT_EQ(
+      base::NumberToString(second_display_masked_id),
+      pref_external_display_mirror_info->GetListDeprecated()[0].GetString());
 
   // Add second display, mirror mode remains off and the second display id is
   // removed from the external display mirror info.
@@ -1483,7 +1489,7 @@
   EXPECT_FALSE(display_manager()->IsInMirrorMode());
   pref_external_display_mirror_info =
       local_state()->GetList(prefs::kExternalDisplayMirrorInfo);
-  EXPECT_EQ(0U, pref_external_display_mirror_info->GetList().size());
+  EXPECT_EQ(0U, pref_external_display_mirror_info->GetListDeprecated().size());
 }
 
 TEST_F(DisplayPrefsTest, ExternalDisplayConnectedBeforeLoadingPrefs) {
@@ -1573,9 +1579,9 @@
             pref_data->FindKey("mirroring_source_id")->GetString());
   const base::Value* destination_ids_value =
       pref_data->FindKey("mirroring_destination_ids");
-  EXPECT_EQ(1U, destination_ids_value->GetList().size());
+  EXPECT_EQ(1U, destination_ids_value->GetListDeprecated().size());
   EXPECT_EQ(base::NumberToString(first_display_id),
-            destination_ids_value->GetList()[0].GetString());
+            destination_ids_value->GetListDeprecated()[0].GetString());
 
   // Overwrite current mixed mirror mode with a new configuration. (Mirror from
   // the first external display to the second external display)
@@ -1597,9 +1603,9 @@
   EXPECT_EQ(base::NumberToString(first_display_id),
             pref_data->FindKey("mirroring_source_id")->GetString());
   destination_ids_value = pref_data->FindKey("mirroring_destination_ids");
-  EXPECT_EQ(1U, destination_ids_value->GetList().size());
+  EXPECT_EQ(1U, destination_ids_value->GetListDeprecated().size());
   EXPECT_EQ(base::NumberToString(second_display_id),
-            destination_ids_value->GetList()[0].GetString());
+            destination_ids_value->GetListDeprecated()[0].GetString());
 
   // Turn off mirror mode.
   display_manager()->SetMirrorMode(display::MirrorMode::kOff, absl::nullopt);
diff --git a/ash/display/resolution_notification_controller_unittest.cc b/ash/display/resolution_notification_controller_unittest.cc
index e592cc6..2e08177 100644
--- a/ash/display/resolution_notification_controller_unittest.cc
+++ b/ash/display/resolution_notification_controller_unittest.cc
@@ -189,7 +189,7 @@
 };
 
 // Basic behaviors and verifies it doesn't cause crashes.
-TEST_P(ResolutionNotificationControllerTest, Basic) {
+TEST_P(ResolutionNotificationControllerTest, DISABLED_Basic) {
   UpdateDisplay("400x300#400x300%57|300x200%58,300x250#300x250%60|300x200%59");
   display::test::DisplayManagerTestApi display_manager_test(display_manager());
   int64_t id2 = display_manager_test.GetSecondaryDisplay().id();
@@ -413,7 +413,7 @@
   EXPECT_EQ(58.0f, mode.refresh_rate());
 }
 
-TEST_P(ResolutionNotificationControllerTest, Fallback) {
+TEST_P(ResolutionNotificationControllerTest, DISABLED_Fallback) {
   UpdateDisplay(
       "400x300#400x300%56|300x200%57,"
       "350x250#350x250%60|220x210%60|300x200%60");
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index c09b9057..0953cedd 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -1095,6 +1095,7 @@
     return;
 
   big_view->auth_user()->SetSmartLockState(state);
+  LayoutAuth(big_view, /*opt_to_hide=*/nullptr, /*animate=*/true);
 }
 
 void LockContentsView::OnSmartLockAuthResult(const AccountId& account_id,
diff --git a/ash/public/cpp/ash_typography.cc b/ash/public/cpp/ash_typography.cc
index 3403b95d4..71eaa9b 100644
--- a/ash/public/cpp/ash_typography.cc
+++ b/ash/public/cpp/ash_typography.cc
@@ -45,6 +45,8 @@
     case CONTEXT_HEADLINE_OVERSIZED:
       details.size_delta = 15;
       break;
+    case CONTEXT_SEARCH_RESULT_BIG_TITLE:
+      details.size_delta = 24;
   }
 
   switch (style) {
diff --git a/ash/public/cpp/ash_typography.h b/ash/public/cpp/ash_typography.h
index ac047d9..3a19b56b 100644
--- a/ash/public/cpp/ash_typography.h
+++ b/ash/public/cpp/ash_typography.h
@@ -50,6 +50,9 @@
   // Title and details text label used in search result view. Usually 14 pt.
   CONTEXT_SEARCH_RESULT_VIEW,
 
+  // Big title text label used in search result view. Usually 36 pt.
+  CONTEXT_SEARCH_RESULT_BIG_TITLE,
+
   // Details text label used for inline answer search result view. Usually 12pt.
   // Used when productivity launcher is enabled.
   CONTEXT_SEARCH_RESULT_VIEW_INLINE_ANSWER_DETAILS,
diff --git a/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.cc b/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.cc
index d865777..ec51ab5a 100644
--- a/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.cc
+++ b/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.cc
@@ -41,6 +41,13 @@
   Update();
 }
 
+void BluetoothEnabledProvider::
+    LowEnergyScanSessionHardwareOffloadingStatusChanged(
+        device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+            status) {
+  Update();
+}
+
 void BluetoothEnabledProvider::Update() {
   if (!HasHardwareSupport()) {
     SetEnabledAndInvokeCallback(/*is_enabled=*/false);
diff --git a/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.h b/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.h
index 9341a48..a8d58337 100644
--- a/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.h
+++ b/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider.h
@@ -28,6 +28,9 @@
                              bool powered) override;
   void AdapterPresentChanged(device::BluetoothAdapter* adapter,
                              bool present) override;
+  void LowEnergyScanSessionHardwareOffloadingStatusChanged(
+      device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+          status) override;
 
   void OnAdapterReceived(scoped_refptr<device::BluetoothAdapter> adapter);
 
diff --git a/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider_unittest.cc b/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider_unittest.cc
index 4d942aec..193f86c 100644
--- a/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider_unittest.cc
+++ b/ash/quick_pair/feature_status_tracker/bluetooth_enabled_provider_unittest.cc
@@ -82,5 +82,20 @@
   EXPECT_FALSE(provider_->is_enabled());
 }
 
+TEST_F(BluetoothEnabledProviderTest, HardwareSupportBecomesAvailable) {
+  adapter().SetHardwareOffloadingStatus(
+      device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
+          kNotSupported);
+  EXPECT_FALSE(provider_->is_enabled());
+
+  adapter().SetBluetoothIsPowered(true);
+  EXPECT_FALSE(provider_->is_enabled());
+
+  adapter().SetHardwareOffloadingStatus(
+      device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
+          kSupported);
+  EXPECT_TRUE(provider_->is_enabled());
+}
+
 }  // namespace quick_pair
 }  // namespace ash
diff --git a/ash/quick_pair/feature_status_tracker/fake_bluetooth_adapter.cc b/ash/quick_pair/feature_status_tracker/fake_bluetooth_adapter.cc
index f75e5a00..deea10a 100644
--- a/ash/quick_pair/feature_status_tracker/fake_bluetooth_adapter.cc
+++ b/ash/quick_pair/feature_status_tracker/fake_bluetooth_adapter.cc
@@ -37,6 +37,8 @@
     device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
         hardware_offloading_status) {
   hardware_offloading_status_ = hardware_offloading_status;
+  NotifyLowEnergyScanSessionHardwareOffloadingStatusChanged(
+      hardware_offloading_status);
 }
 
 }  // namespace quick_pair
diff --git a/ash/quick_pair/message_stream/message_stream.cc b/ash/quick_pair/message_stream/message_stream.cc
index 895b618..fe4bd5c2 100644
--- a/ash/quick_pair/message_stream/message_stream.cc
+++ b/ash/quick_pair/message_stream/message_stream.cc
@@ -31,6 +31,9 @@
 }
 
 MessageStream::~MessageStream() {
+  if (socket_.get())
+    socket_->Disconnect(base::DoNothing());
+
   // Notify observers for lifetime management
   for (auto& obs : observers_)
     obs.OnMessageStreamDestroyed(device_address_);
@@ -50,8 +53,12 @@
         << __func__
         << ": Failed to receive or parse data from socket more than "
         << kMaxRetryCount << " times.";
-    socket_->Disconnect(base::BindOnce(&MessageStream::OnSocketDisconnected,
-                                       weak_ptr_factory_.GetWeakPtr()));
+
+    if (socket_.get()) {
+      socket_->Disconnect(base::BindOnce(&MessageStream::OnSocketDisconnected,
+                                         weak_ptr_factory_.GetWeakPtr()));
+    }
+
     return;
   }
 
@@ -107,7 +114,7 @@
   // This can happen since the socket might have disconnected previously but
   // we kept the MessageStream instance alive to preserve messages from the
   // corresponding device.
-  if (!socket_) {
+  if (!socket_.get()) {
     std::move(on_disconnect_callback).Run();
     return;
   }
@@ -118,7 +125,6 @@
 }
 
 void MessageStream::OnSocketDisconnected() {
-  socket_ = nullptr;
   for (auto& obs : observers_)
     obs.OnDisconnected(device_address_);
 }
@@ -131,6 +137,8 @@
 
 void MessageStream::ParseMessageStreamSuccess(
     std::vector<mojom::MessageStreamMessagePtr> messages) {
+  QP_LOG(VERBOSE) << __func__;
+
   if (messages.empty()) {
     Receive();
     return;
diff --git a/ash/quick_pair/message_stream/message_stream_lookup_impl.cc b/ash/quick_pair/message_stream/message_stream_lookup_impl.cc
index 6665280..ab07f363 100644
--- a/ash/quick_pair/message_stream/message_stream_lookup_impl.cc
+++ b/ash/quick_pair/message_stream/message_stream_lookup_impl.cc
@@ -22,6 +22,23 @@
 namespace ash {
 namespace quick_pair {
 
+std::string MessageStreamLookupImpl::CreateMessageStreamAttemptTypeToString(
+    const CreateMessageStreamAttemptType& type) {
+  switch (type) {
+    case CreateMessageStreamAttemptType::kDeviceConnectedStateChanged:
+      return "[DeviceConnectedStateChanged]";
+    case CreateMessageStreamAttemptType::kDeviceAdded:
+      return "[DeviceAdded]";
+    case CreateMessageStreamAttemptType::kDevicePairedChanged:
+      return "[DevicePairedChanged]";
+    case CreateMessageStreamAttemptType::kDeviceChanged:
+      return "[DeviceChanged]";
+  }
+
+  NOTREACHED();
+  return "";
+}
+
 MessageStreamLookupImpl::MessageStreamLookupImpl() {
   device::BluetoothAdapterFactory::Get()->GetAdapter(base::BindOnce(
       &MessageStreamLookupImpl::OnGetAdapter, weak_ptr_factory_.GetWeakPtr()));
@@ -58,21 +75,85 @@
   return it->second.get();
 }
 
+void MessageStreamLookupImpl::DevicePairedChanged(
+    device::BluetoothAdapter* adapter,
+    device::BluetoothDevice* device,
+    bool new_paired_status) {
+  // Check to see if the device supports Message Streams.
+  if (!device || !base::Contains(device->GetUUIDs(), kMessageStreamUuid))
+    return;
+
+  // Remove and delete the memory stream for the device, if it exists.
+  if (!new_paired_status) {
+    AttemptRemoveMessageStream(device->GetAddress());
+    return;
+  }
+
+  QP_LOG(VERBOSE) << __func__
+                  << ": Attempting to create MessageStream for device = ["
+                  << device->GetAddress() << "]";
+  AttemptCreateMessageStream(
+      device, CreateMessageStreamAttemptType::kDevicePairedChanged);
+}
+
 void MessageStreamLookupImpl::DeviceConnectedStateChanged(
     device::BluetoothAdapter* adapter,
     device::BluetoothDevice* device,
     bool is_now_connected) {
   // Check to see if the device supports Message Streams.
-  if (!base::Contains(device->GetUUIDs(), kMessageStreamUuid))
-    return;
-
-  // Remove and delete the memory stream for the device, if it exists.
-  if (!is_now_connected) {
-    RemoveMessageStream(device->GetAddress());
+  if (!device || !base::Contains(device->GetUUIDs(), kMessageStreamUuid)) {
     return;
   }
 
-  CreateMessageStream(device);
+  // Remove and delete the memory stream for the device, if it exists.
+  if (!is_now_connected) {
+    AttemptRemoveMessageStream(device->GetAddress());
+    return;
+  }
+
+  QP_LOG(VERBOSE) << __func__
+                  << ": Attempting to create MessageStream for device = ["
+                  << device->GetAddress() << "]";
+  AttemptCreateMessageStream(
+      device, CreateMessageStreamAttemptType::kDeviceConnectedStateChanged);
+}
+
+void MessageStreamLookupImpl::DeviceChanged(device::BluetoothAdapter* adapter,
+                                            device::BluetoothDevice* device) {
+  // Check to see if the device is connected and supports MessageStreams. We
+  // need to check if the device is both connected and paired to the adapter
+  // because it is possible for a device to be connected to the adapter but not
+  // paired (example: a request for the adapter's SDP records).
+  if (!device || !(device->IsConnected() && device->IsPaired()) ||
+      !base::Contains(device->GetUUIDs(), kMessageStreamUuid)) {
+    return;
+  }
+
+  QP_LOG(VERBOSE) << __func__
+                  << ": found connected device. Attempting to create "
+                     "MessageStream for device = ["
+                  << device->GetAddress() << "]";
+  AttemptCreateMessageStream(device,
+                             CreateMessageStreamAttemptType::kDeviceChanged);
+}
+
+void MessageStreamLookupImpl::DeviceAdded(device::BluetoothAdapter* adapter,
+                                          device::BluetoothDevice* device) {
+  // Check to see if the device is connected and supports MessageStreams. We
+  // need to check if the device is both connected and paired to the adapter
+  // because it is possible for a device to be connected to the adapter but not
+  // paired (example: a request for the adapter's SDP records).
+  if (!device || !(device->IsConnected() && device->IsPaired()) ||
+      !base::Contains(device->GetUUIDs(), kMessageStreamUuid)) {
+    return;
+  }
+
+  QP_LOG(VERBOSE) << __func__
+                  << ": found connected device. Attempting to create "
+                     "MessageStream for device = ["
+                  << device->GetAddress() << "]";
+  AttemptCreateMessageStream(device,
+                             CreateMessageStreamAttemptType::kDeviceAdded);
 }
 
 void MessageStreamLookupImpl::DeviceRemoved(device::BluetoothAdapter* adapter,
@@ -83,16 +164,16 @@
   // Remove message stream if the device removed from the adapter has a
   // message stream and disconnect from socket if applicable. It isn't expected
   // to already have a MessageStream associated with it.
-  EraseMessageStream(device->GetAddress());
+  AttemptEraseMessageStream(device->GetAddress());
 }
 
-void MessageStreamLookupImpl::RemoveMessageStream(
+void MessageStreamLookupImpl::AttemptRemoveMessageStream(
     const std::string& device_address) {
   QP_LOG(VERBOSE) << __func__ << ": device address = " << device_address;
-  EraseMessageStream(device_address);
+  AttemptEraseMessageStream(device_address);
 }
 
-void MessageStreamLookupImpl::EraseMessageStream(
+void MessageStreamLookupImpl::AttemptEraseMessageStream(
     const std::string& device_address) {
   // Remove map entry if it exists. It may not exist if it was failed to be
   // created due to a |ConnectToService| error.
@@ -112,30 +193,39 @@
   message_streams_.erase(device_address);
 }
 
-void MessageStreamLookupImpl::CreateMessageStream(
-    device::BluetoothDevice* device) {
+void MessageStreamLookupImpl::AttemptCreateMessageStream(
+    device::BluetoothDevice* device,
+    const CreateMessageStreamAttemptType& type) {
   QP_LOG(VERBOSE) << __func__ << ": device address = " << device->GetAddress();
 
-  // Only open message streams for new devices that don't already have a
-  // message stream stored in the map.
+  // Only open MessageStreams for new devices that don't already have a
+  // MessageStream stored in the map. We can sometimes reach this point if
+  // multiple BluetoothAdapter events fire for a device connected event, but
+  // we need all of these BluetoothAdapter observation events to handle
+  // different connection scenarios, and have coverage for different devices.
   const std::string& device_address = device->GetAddress();
-  DCHECK(message_streams_.find(device_address) == message_streams_.end());
+  if (base::Contains(message_streams_, device->GetAddress())) {
+    QP_LOG(VERBOSE) << "Message Stream exists already for device";
+    return;
+  }
 
   device->ConnectToService(
       /*uuid=*/kMessageStreamUuid, /*callback=*/
       base::BindOnce(&MessageStreamLookupImpl::OnConnected,
                      weak_ptr_factory_.GetWeakPtr(), device_address,
-                     base::TimeTicks::Now()),
+                     base::TimeTicks::Now(), type),
       /*error_callback=*/
       base::BindOnce(&MessageStreamLookupImpl::OnConnectError,
-                     weak_ptr_factory_.GetWeakPtr()));
+                     weak_ptr_factory_.GetWeakPtr(), type));
 }
 
 void MessageStreamLookupImpl::OnConnected(
     std::string device_address,
     base::TimeTicks connect_to_service_start_time,
+    const CreateMessageStreamAttemptType& type,
     scoped_refptr<device::BluetoothSocket> socket) {
-  QP_LOG(VERBOSE) << __func__;
+  QP_LOG(VERBOSE) << __func__ << ": device = " << device_address
+                  << " Type = " << CreateMessageStreamAttemptTypeToString(type);
   RecordMessageStreamConnectToServiceResult(/*success=*/true);
   RecordMessageStreamConnectToServiceTime(base::TimeTicks::Now() -
                                           connect_to_service_start_time);
@@ -149,8 +239,14 @@
   message_streams_[device_address] = std::move(message_stream);
 }
 
-void MessageStreamLookupImpl::OnConnectError(const std::string& error_message) {
-  QP_LOG(INFO) << __func__ << ": Error = [ " << error_message << "].";
+void MessageStreamLookupImpl::OnConnectError(
+    const CreateMessageStreamAttemptType& type,
+    const std::string& error_message) {
+  // Because we need to attempt to create MessageStreams at many different
+  // iterations due to the variability of Bluetooth APIs, we can expect to
+  // see errors here frequently, along with errors followed by a success.
+  QP_LOG(VERBOSE) << __func__ << ": Error = [ " << error_message << "]. Type = "
+                  << CreateMessageStreamAttemptTypeToString(type);
   RecordMessageStreamConnectToServiceResult(/*success=*/false);
   RecordMessageStreamConnectToServiceError(error_message);
 }
diff --git a/ash/quick_pair/message_stream/message_stream_lookup_impl.h b/ash/quick_pair/message_stream/message_stream_lookup_impl.h
index c6fde61..eae320d4b 100644
--- a/ash/quick_pair/message_stream/message_stream_lookup_impl.h
+++ b/ash/quick_pair/message_stream/message_stream_lookup_impl.h
@@ -39,29 +39,53 @@
   MessageStream* GetMessageStream(const std::string& device_address) override;
 
  private:
+  // Enum class to bind to attempts to create RFCOMM channels for logging which
+  // BluetoothAdapter API triggers succeeded and failed.
+  enum class CreateMessageStreamAttemptType {
+    kDeviceConnectedStateChanged = 0,
+    kDeviceAdded = 1,
+    kDevicePairedChanged = 2,
+    kDeviceChanged = 3,
+  };
+
+  // Helper function to be used in log messages to understand success and errors
+  // for creating RFCOMM channel to the device.
+  std::string CreateMessageStreamAttemptTypeToString(
+      const CreateMessageStreamAttemptType& type);
+
   // device::BluetoothAdapter::Observer
   void DeviceConnectedStateChanged(device::BluetoothAdapter* adapter,
                                    device::BluetoothDevice* device,
                                    bool is_now_connected) override;
   void DeviceRemoved(device::BluetoothAdapter* adapter,
                      device::BluetoothDevice* device) override;
+  void DeviceAdded(device::BluetoothAdapter* adapter,
+                   device::BluetoothDevice* device) override;
+  void DevicePairedChanged(device::BluetoothAdapter* adapter,
+                           device::BluetoothDevice* device,
+                           bool new_paired_status) override;
+  void DeviceChanged(device::BluetoothAdapter* adapter,
+                     device::BluetoothDevice* device) override;
 
   // Helper functions to create and remove message stream objects and open and
   // close RFCOMM channels based on whether the device is connected or
   // disconnected from  the adapter.
-  void CreateMessageStream(device::BluetoothDevice* device);
-  void RemoveMessageStream(const std::string& device_address);
+  void AttemptCreateMessageStream(device::BluetoothDevice* device,
+                                  const CreateMessageStreamAttemptType& type);
+  void AttemptRemoveMessageStream(const std::string& device_address);
 
   // Create RFCOMM connection callbacks.
   void OnConnected(std::string device_address,
                    base::TimeTicks connect_to_service_start_time,
+                   const CreateMessageStreamAttemptType& type,
                    scoped_refptr<device::BluetoothSocket> socket);
-  void OnConnectError(const std::string& error_message);
+  void OnConnectError(const CreateMessageStreamAttemptType& type,
+                      const std::string& error_message);
 
   // Helper function to disconnect socket from a MessageStream instance and
   // destroy the MessageStream instance. Used by both |RemoveMessageStream| and
   // |DeviceRemoved|.
-  void EraseMessageStream(const std::string& device_address);
+  void AttemptEraseMessageStream(const std::string& device_address);
 
   // Callback for disconnected the socket from the MessageStream.
   void OnSocketDisconnected(const std::string& device_address);
diff --git a/ash/quick_pair/pairing/retroactive_pairing_detector_impl.cc b/ash/quick_pair/pairing/retroactive_pairing_detector_impl.cc
index e3bab77..850f537 100644
--- a/ash/quick_pair/pairing/retroactive_pairing_detector_impl.cc
+++ b/ash/quick_pair/pairing/retroactive_pairing_detector_impl.cc
@@ -48,23 +48,49 @@
 RetroactivePairingDetectorImpl::RetroactivePairingDetectorImpl(
     PairerBroker* pairer_broker,
     MessageStreamLookup* message_stream_lookup)
-    : message_stream_lookup_(message_stream_lookup) {
+    : pairer_broker_(pairer_broker),
+      message_stream_lookup_(message_stream_lookup) {
   // If there is no signed in user, don't enabled the retroactive pairing
-  // scenario, so don't initiate any objects or observations.
+  // scenario, so don't initiate any objects or observations, but store the
+  // pointers in the case that we get logged in later on.
   if (!ShouldBeEnabledForLoginStatus(
           Shell::Get()->session_controller()->login_status())) {
     QP_LOG(VERBOSE)
         << __func__
         << ": No logged in user to enable retroactive pairing scenario";
+
+    // Observe log in events in the case the login was delayed.
+    shell_observation_.Observe(Shell::Get()->session_controller());
     return;
   }
 
+  retroactive_pairing_detector_instatiated_ = true;
+
   device::BluetoothAdapterFactory::Get()->GetAdapter(
       base::BindOnce(&RetroactivePairingDetectorImpl::OnGetAdapter,
                      weak_ptr_factory_.GetWeakPtr()));
 
   message_stream_lookup_observation_.Observe(message_stream_lookup_);
-  pairer_broker_observation_.Observe(pairer_broker);
+  pairer_broker_observation_.Observe(pairer_broker_);
+}
+
+void RetroactivePairingDetectorImpl::OnLoginStatusChanged(
+    LoginStatus login_status) {
+  if (!ShouldBeEnabledForLoginStatus(login_status) || !pairer_broker_ ||
+      !message_stream_lookup_ || retroactive_pairing_detector_instatiated_) {
+    return;
+  }
+
+  QP_LOG(VERBOSE)
+      << __func__
+      << ": Logged in user, instantiate retroactive pairing scenario.";
+
+  device::BluetoothAdapterFactory::Get()->GetAdapter(
+      base::BindOnce(&RetroactivePairingDetectorImpl::OnGetAdapter,
+                     weak_ptr_factory_.GetWeakPtr()));
+
+  message_stream_lookup_observation_.Observe(message_stream_lookup_);
+  pairer_broker_observation_.Observe(pairer_broker_);
 }
 
 void RetroactivePairingDetectorImpl::OnGetAdapter(
@@ -102,6 +128,21 @@
   if (!device->classic_address())
     return;
 
+  // Sometimes we might encounter the case where |DevicePairedChanged| fires
+  // before FastPair's |OnDevicePaired|, and if that is the case and a device
+  // has been inserted in the |potential_retroactive_addresses_|, we need
+  // to remove it.
+  if (base::Contains(potential_retroactive_addresses_,
+                     device->classic_address().value())) {
+    QP_LOG(VERBOSE)
+        << __func__
+        << ": encountered a false positive for a potential retroactive pairing "
+           "device. Removing device at address = "
+        << device->classic_address().value();
+    RemoveDeviceInformation(device->classic_address().value());
+    return;
+  }
+
   QP_LOG(VERBOSE) << __func__ << ":  Storing Fast Pair device address: "
                   << device->classic_address().value();
   fast_pair_addresses_.insert(device->classic_address().value());
@@ -141,6 +182,7 @@
 void RetroactivePairingDetectorImpl::OnMessageStreamConnected(
     const std::string& device_address,
     MessageStream* message_stream) {
+  QP_LOG(VERBOSE) << __func__ << ":" << device_address;
   if (!message_stream)
     return;
 
@@ -158,6 +200,13 @@
   DCHECK(device_pairing_information_.find(device_address) ==
          device_pairing_information_.end());
 
+  // If the MessageStream is immediately available and |DevicePairedChanged|
+  // fires before FastPair's |OnDevicePaired|, it might be possible for us to
+  // find a false positive for a retroactive pairing scenario which we mitigate
+  // here.
+  if (!base::Contains(potential_retroactive_addresses_, device_address))
+    return;
+
   RetroactivePairingInformation info;
   device_pairing_information_[device_address] = info;
 
@@ -207,6 +256,13 @@
   DCHECK(device_pairing_information_.find(device_address) !=
          device_pairing_information_.end());
 
+  // If the MessageStream is immediately available and |DevicePairedChanged|
+  // fires before FastPair's |OnDevicePaired|, it might be possible for us to
+  // find a false positive for a retroactive pairing scenario which we mitigate
+  // here.
+  if (!base::Contains(potential_retroactive_addresses_, device_address))
+    return;
+
   if (device_pairing_information_[device_address].model_id.empty() ||
       device_pairing_information_[device_address].ble_address.empty()) {
     return;
@@ -245,7 +301,8 @@
   auto device = base::MakeRefCounted<Device>(model_id, ble_address,
                                              Protocol::kFastPairRetroactive);
   device->set_classic_address(classic_address);
-  QP_LOG(INFO) << __func__ << ": Found device for Retroactive Pairing.";
+  QP_LOG(VERBOSE) << __func__ << ": Found device for Retroactive Pairing "
+                  << device;
 
   for (auto& observer : observers_)
     observer.OnRetroactivePairFound(device);
@@ -255,8 +312,17 @@
 
 void RetroactivePairingDetectorImpl::RemoveDeviceInformation(
     const std::string& device_address) {
+  QP_LOG(VERBOSE) << __func__;
   potential_retroactive_addresses_.erase(device_address);
   device_pairing_information_.erase(device_address);
+
+  // We can potentially get to a state where we need to RemoveDeviceInformation
+  // before the MessageStreams are observed, connected, and/or added to our
+  // list here if we get a false positive instance of a potential retroactive
+  // pairing device.
+  if (!base::Contains(message_streams_, device_address))
+    return;
+
   message_streams_[device_address]->RemoveObserver(this);
   message_streams_.erase(device_address);
 }
diff --git a/ash/quick_pair/pairing/retroactive_pairing_detector_impl.h b/ash/quick_pair/pairing/retroactive_pairing_detector_impl.h
index 9c79454..93ba25d 100644
--- a/ash/quick_pair/pairing/retroactive_pairing_detector_impl.h
+++ b/ash/quick_pair/pairing/retroactive_pairing_detector_impl.h
@@ -9,6 +9,8 @@
 
 #include "ash/quick_pair/pairing/retroactive_pairing_detector.h"
 
+#include "ash/public/cpp/session/session_controller.h"
+#include "ash/public/cpp/session/session_observer.h"
 #include "ash/quick_pair/common/account_key_failure.h"
 #include "ash/quick_pair/common/pair_failure.h"
 #include "ash/quick_pair/common/protocol.h"
@@ -39,7 +41,8 @@
       public device::BluetoothAdapter::Observer,
       public PairerBroker::Observer,
       public MessageStreamLookup::Observer,
-      public MessageStream::Observer {
+      public MessageStream::Observer,
+      public SessionObserver {
  public:
   RetroactivePairingDetectorImpl(PairerBroker* pairer_broker,
                                  MessageStreamLookup* message_stream_lookup);
@@ -68,6 +71,9 @@
     std::string ble_address;
   };
 
+  // SessionObserver:
+  void OnLoginStatusChanged(LoginStatus login_status) override;
+
   // device::BluetoothAdapter::Observer
   void DevicePairedChanged(device::BluetoothAdapter* adapter,
                            device::BluetoothDevice* device,
@@ -131,10 +137,18 @@
   base::flat_map<std::string, RetroactivePairingInformation>
       device_pairing_information_;
 
+  // Helps us keep track of whether the RetroactivePairingDetector has already
+  // been instantiated when we get a logged-in event from the SessionObserver
+  // so we can determine if we need to instantiate the objects.
+  bool retroactive_pairing_detector_instatiated_ = false;
+
+  PairerBroker* pairer_broker_ = nullptr;
   MessageStreamLookup* message_stream_lookup_ = nullptr;
   scoped_refptr<device::BluetoothAdapter> adapter_;
   base::ObserverList<RetroactivePairingDetector::Observer> observers_;
 
+  base::ScopedObservation<SessionController, SessionObserver>
+      shell_observation_{this};
   base::ScopedObservation<device::BluetoothAdapter,
                           device::BluetoothAdapter::Observer>
       adapter_observation_{this};
diff --git a/ash/quick_pair/pairing/retroactive_pairing_detector_unittest.cc b/ash/quick_pair/pairing/retroactive_pairing_detector_unittest.cc
index 7defb3d..534c758 100644
--- a/ash/quick_pair/pairing/retroactive_pairing_detector_unittest.cc
+++ b/ash/quick_pair/pairing/retroactive_pairing_detector_unittest.cc
@@ -248,6 +248,21 @@
   EXPECT_FALSE(retroactive_pair_found_);
 }
 
+TEST_F(RetroactivePairingDetectorTest,
+       DevicedPaired_FastPair_BluetoothEventFiresFirst) {
+  Login(user_manager::UserType::USER_TYPE_REGULAR);
+  base::RunLoop().RunUntilIdle();
+  CreateRetroactivePairingDetector();
+
+  EXPECT_FALSE(retroactive_pair_found_);
+
+  PairFastPairDeviceWithClassicBluetooth(
+      /*new_paired_status=*/true, kTestDeviceAddress);
+  PairFastPairDeviceWithFastPair(kTestDeviceAddress);
+
+  EXPECT_FALSE(retroactive_pair_found_);
+}
+
 TEST_F(RetroactivePairingDetectorTest, DeviceUnpaired) {
   Login(user_manager::UserType::USER_TYPE_REGULAR);
   base::RunLoop().RunUntilIdle();
@@ -436,6 +451,24 @@
   EXPECT_EQ(retroactive_device_->metadata_id, kModelId);
 }
 
+TEST_F(RetroactivePairingDetectorTest, EnableScenarioIfLoggedInLater) {
+  EXPECT_FALSE(retroactive_pair_found_);
+
+  CreateRetroactivePairingDetector();
+  base::RunLoop().RunUntilIdle();
+  Login(user_manager::UserType::USER_TYPE_REGULAR);
+
+  AddMessageStream(kModelIdBleAddressBytes);
+  PairFastPairDeviceWithClassicBluetooth(
+      /*new_paired_status=*/true, kTestDeviceAddress);
+  fake_socket_->TriggerReceiveCallback();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_TRUE(retroactive_pair_found_);
+  EXPECT_EQ(retroactive_device_->ble_address, kBleAddress);
+  EXPECT_EQ(retroactive_device_->metadata_id, kModelId);
+}
+
 TEST_F(RetroactivePairingDetectorTest,
        MessageStream_GetMessageStream_Ble_ModelId_GuestUser) {
   Login(user_manager::UserType::USER_TYPE_GUEST);
diff --git a/ash/quick_pair/repository/fast_pair/pending_write_store.cc b/ash/quick_pair/repository/fast_pair/pending_write_store.cc
index 39bbb9c..62cf587 100644
--- a/ash/quick_pair/repository/fast_pair/pending_write_store.cc
+++ b/ash/quick_pair/repository/fast_pair/pending_write_store.cc
@@ -107,7 +107,7 @@
     return list;
   }
 
-  for (const auto& item : result->GetList()) {
+  for (const auto& item : result->GetListDeprecated()) {
     list.emplace_back(item.GetString());
   }
 
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_notification_controller.cc b/ash/quick_pair/ui/fast_pair/fast_pair_notification_controller.cc
index 1fc5b6bc..2da4a3b 100644
--- a/ash/quick_pair/ui/fast_pair/fast_pair_notification_controller.cc
+++ b/ash/quick_pair/ui/fast_pair/fast_pair_notification_controller.cc
@@ -134,6 +134,12 @@
     gfx::Image device_image,
     base::RepeatingClosure launch_bluetooth_pairing,
     base::OnceCallback<void(bool)> on_close) {
+  // Because the pairing notification is pinned, we need to manually remove it
+  // to explicitly say it is done not by the user. This only need to be done
+  // for pinned notifications.
+  message_center::MessageCenter::Get()->RemoveNotification(
+      kFastPairPairingNotificationId, /*by_user=*/false);
+
   std::unique_ptr<message_center::Notification> error_notification =
       CreateNotification(
           kFastPairErrorNotificationId,
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index a9ab051..ac30cdad6 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -799,7 +799,7 @@
       gfx::Rect(location_in_screen, gfx::Size()),
       views::MenuAnchorPosition::kBubbleRight,
       views::MenuRunner::CONTEXT_MENU |
-          views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+          views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
           views::MenuRunner::FIXED_ANCHOR);
 }
 
diff --git a/ash/session/fullscreen_controller.cc b/ash/session/fullscreen_controller.cc
index 59f59a92..4d65f5f 100644
--- a/ash/session/fullscreen_controller.cc
+++ b/ash/session/fullscreen_controller.cc
@@ -165,7 +165,7 @@
   auto* prefs = Shell::Get()->session_controller()->GetPrimaryUserPrefService();
   const auto* url_allow_list =
       prefs->GetList(prefs::kKeepFullscreenWithoutNotificationUrlAllowList);
-  if (url_allow_list->GetList().size() == 0)
+  if (url_allow_list->GetListDeprecated().size() == 0)
     return true;
 
   // Get the URL of the active window from the shell delegate.
diff --git a/ash/shelf/gradient_layer_delegate.cc b/ash/shelf/gradient_layer_delegate.cc
index 506e9b5..731463a 100644
--- a/ash/shelf/gradient_layer_delegate.cc
+++ b/ash/shelf/gradient_layer_delegate.cc
@@ -4,16 +4,30 @@
 
 #include "ash/shelf/gradient_layer_delegate.h"
 
+#include "base/time/time.h"
 #include "ui/compositor/paint_recorder.h"
+#include "ui/gfx/animation/linear_animation.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/skia_paint_util.h"
 #include "ui/views/paint_info.h"
 
 namespace ash {
 
-GradientLayerDelegate::GradientLayerDelegate() : layer_(ui::LAYER_TEXTURED) {
+GradientLayerDelegate::GradientLayerDelegate(bool animate_in)
+    : layer_(ui::LAYER_TEXTURED) {
   layer_.set_delegate(this);
   layer_.SetFillsBoundsOpaquely(false);
+
+  if (animate_in) {
+    animation_ = std::make_unique<gfx::LinearAnimation>(
+        base::Milliseconds(50), gfx::LinearAnimation::kDefaultFrameRate,
+        /*delegate=*/this);
+    animation_->Start();
+    // The animation is usually 2 or 3 frames. Instead of starting the animation
+    // at 0.0, which results in a fully transparent frame in the beginning, use
+    // an initial value so the first frame is partially opaque.
+    animation_->SetCurrentValue(0.333);
+  }
 }
 
 GradientLayerDelegate::~GradientLayerDelegate() {
@@ -43,6 +57,17 @@
     DrawFadeZone(end_fade_zone_, recorder.canvas());
 }
 
+void GradientLayerDelegate::AnimationProgressed(
+    const gfx::Animation* animation) {
+  DCHECK_EQ(animation, animation_.get());
+
+  // Schedule repaint of the affected areas.
+  if (!start_fade_zone_.zone_rect.IsEmpty())
+    layer_.SchedulePaint(start_fade_zone_.zone_rect);
+  if (!end_fade_zone_.zone_rect.IsEmpty())
+    layer_.SchedulePaint(end_fade_zone_.zone_rect);
+}
+
 void GradientLayerDelegate::DrawFadeZone(const FadeZone& fade_zone,
                                          gfx::Canvas* canvas) {
   gfx::Point start_point;
@@ -59,10 +84,18 @@
   flags.setBlendMode(SkBlendMode::kSrc);
   flags.setAntiAlias(false);
 
+  SkColor target_color;
+  if (animation_) {
+    // Animation runs 0.0 to 1.0, so alpha runs 255 (opaque) to 0 (transparent).
+    uint8_t alpha = (1.0 - animation_->GetCurrentValue()) * 255;
+    target_color = SkColorSetA(SK_ColorTRANSPARENT, alpha);
+  } else {
+    target_color = SK_ColorTRANSPARENT;
+  }
+
   flags.setShader(gfx::CreateGradientShader(
-      start_point, end_point,
-      fade_zone.fade_in ? SK_ColorTRANSPARENT : SK_ColorBLACK,
-      fade_zone.fade_in ? SK_ColorBLACK : SK_ColorTRANSPARENT));
+      start_point, end_point, fade_zone.fade_in ? target_color : SK_ColorBLACK,
+      fade_zone.fade_in ? SK_ColorBLACK : target_color));
 
   canvas->DrawRect(fade_zone.zone_rect, flags);
 }
diff --git a/ash/shelf/gradient_layer_delegate.h b/ash/shelf/gradient_layer_delegate.h
index 6ce228a..41f7710 100644
--- a/ash/shelf/gradient_layer_delegate.h
+++ b/ash/shelf/gradient_layer_delegate.h
@@ -5,13 +5,17 @@
 #ifndef ASH_SHELF_GRADIENT_LAYER_DELEGATE_H_
 #define ASH_SHELF_GRADIENT_LAYER_DELEGATE_H_
 
+#include <memory>
+
 #include "ash/ash_export.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_delegate.h"
+#include "ui/gfx/animation/animation_delegate.h"
 #include "ui/gfx/geometry/rect.h"
 
 namespace gfx {
 class Canvas;
+class LinearAnimation;
 }  // namespace gfx
 
 namespace ash {
@@ -20,7 +24,8 @@
 // of its layer.
 // TODO(jamescook): Move into //ash/controls. This class is used outside of the
 // shelf (e.g. app list, desks).
-class ASH_EXPORT GradientLayerDelegate : public ui::LayerDelegate {
+class ASH_EXPORT GradientLayerDelegate : public ui::LayerDelegate,
+                                         public gfx::AnimationDelegate {
  public:
   struct FadeZone {
     // Bounds of the fade in/out zone.
@@ -33,7 +38,9 @@
     bool is_horizontal = false;
   };
 
-  GradientLayerDelegate();
+  // If `animate_in` is true, the gradient will quickly animate in when it is
+  // first created. See https://crbug.com/1293100
+  explicit GradientLayerDelegate(bool animate_in);
   GradientLayerDelegate(const GradientLayerDelegate&) = delete;
   GradientLayerDelegate& operator=(const GradientLayerDelegate&) = delete;
   ~GradientLayerDelegate() override;
@@ -58,11 +65,17 @@
   void OnDeviceScaleFactorChanged(float old_device_scale_factor,
                                   float new_device_scale_factor) override {}
 
+  // gfx::AnimationDelegate:
+  void AnimationProgressed(const gfx::Animation* animation) override;
+
   void DrawFadeZone(const FadeZone& fade_zone, gfx::Canvas* canvas);
 
   ui::Layer layer_;
   FadeZone start_fade_zone_;
   FadeZone end_fade_zone_;
+
+  // Optional animation to quickly animate in the gradient on creation.
+  std::unique_ptr<gfx::LinearAnimation> animation_;
 };
 
 }  // namespace ash
diff --git a/ash/shelf/hotseat_widget.cc b/ash/shelf/hotseat_widget.cc
index 785ad69..e6f59a63 100644
--- a/ash/shelf/hotseat_widget.cc
+++ b/ash/shelf/hotseat_widget.cc
@@ -443,6 +443,9 @@
                                          HotseatState to_state) override;
   void OnHotseatTransitionAnimationAborted() override;
 
+  // views::View:
+  void OnThemeChanged() override;
+
   // views::WidgetDelegateView:
   bool CanActivate() const override;
   void ReorderChildLayers(ui::Layer* parent_layer) override;
@@ -520,6 +523,7 @@
     return;
   }
 
+  DCHECK(scrollable_shelf_view_);
   SetTranslucentBackground(
       scrollable_shelf_view_->GetHotseatBackgroundBounds());
 }
@@ -602,6 +606,15 @@
   --blur_lock_;
 }
 
+void HotseatWidget::DelegateView::OnThemeChanged() {
+  views::WidgetDelegateView::OnThemeChanged();
+
+  // Only update the background when the `scrollable_shelf_view_` is
+  // initialized.
+  if (scrollable_shelf_view_)
+    UpdateTranslucentBackground();
+}
+
 bool HotseatWidget::DelegateView::CanActivate() const {
   // We don't want mouse clicks to activate us, but we need to allow
   // activation when the user is using the keyboard (FocusCycler).
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc
index 1a50cae3..fbe6e66 100644
--- a/ash/shelf/scrollable_shelf_view.cc
+++ b/ash/shelf/scrollable_shelf_view.cc
@@ -347,7 +347,8 @@
       ScrollArrowView::kRight, GetShelf()->IsHorizontalAlignment(), GetShelf(),
       this));
 
-  gradient_layer_delegate_ = std::make_unique<GradientLayerDelegate>();
+  gradient_layer_delegate_ =
+      std::make_unique<GradientLayerDelegate>(/*animate_in=*/false);
   layer()->SetMaskLayer(gradient_layer_delegate_->layer());
 
   focus_search_ = std::make_unique<ScrollableShelfFocusSearch>(this);
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index aabdc78..3879490 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -2373,7 +2373,7 @@
   closing_event_time_ = base::TimeTicks();
 
   // NOTE: If you convert to HAS_MNEMONICS be sure to update menu building code.
-  int run_types = views::MenuRunner::USE_TOUCHABLE_LAYOUT;
+  int run_types = views::MenuRunner::USE_ASH_SYS_UI_LAYOUT;
   if (context_menu) {
     run_types |=
         views::MenuRunner::CONTEXT_MENU | views::MenuRunner::FIXED_ANCHOR;
diff --git a/ash/style/ash_color_mixer.cc b/ash/style/ash_color_mixer.cc
index 3c0096dd..339733b 100644
--- a/ash/style/ash_color_mixer.cc
+++ b/ash/style/ash_color_mixer.cc
@@ -22,7 +22,7 @@
       AshColorProvider::Get()->GetBaseLayerColor(
           AshColorProvider::BaseLayerType::kTransparent80);
   ui::ColorMixer& mixer = provider->AddMixer();
-  mixer[ui::kColorTouchableMenuBackground] = {menu_background_color};
+  mixer[ui::kColorAshSystemUIMenuBackground] = {menu_background_color};
 }
 
 }  // namespace ash
diff --git a/ash/system/accessibility/dictation_bubble_controller.cc b/ash/system/accessibility/dictation_bubble_controller.cc
index 6bb9f60..b6db1b7 100644
--- a/ash/system/accessibility/dictation_bubble_controller.cc
+++ b/ash/system/accessibility/dictation_bubble_controller.cc
@@ -82,8 +82,6 @@
       CollisionDetectionUtils::RelativePriority::kDictationBubble);
 }
 
-// TODO(crbug.com/1252037): Fix issue where bubble is shown behind current
-// Chrome tab.
 void DictationBubbleController::Update(
     DictationBubbleIconType icon,
     const absl::optional<std::u16string>& text,
diff --git a/ash/system/accessibility/dictation_bubble_view.cc b/ash/system/accessibility/dictation_bubble_view.cc
index 91dcb7e..86e9627f 100644
--- a/ash/system/accessibility/dictation_bubble_view.cc
+++ b/ash/system/accessibility/dictation_bubble_view.cc
@@ -30,8 +30,10 @@
 namespace ash {
 
 namespace {
-constexpr int kIconSizeDip = 15;
-constexpr int kSpaceBetweenIconAndTextDip = 10;
+constexpr int kIconSizeDip = 16;
+constexpr int kSpaceBetweenTopRowAndHintViewsDip = 4;
+constexpr int kSpaceBetweenHintLabelsDip = 4;
+constexpr int kSpaceBetweenIconAndTextDip = 4;
 constexpr int kMaxNumHints = 5;
 
 std::unique_ptr<views::ImageView> CreateImageView(
@@ -206,12 +208,16 @@
     std::unique_ptr<views::BoxLayout> layout =
         std::make_unique<views::BoxLayout>(
             views::BoxLayout::Orientation::kVertical);
+    layout->set_between_child_spacing(kSpaceBetweenHintLabelsDip);
     SetLayoutManager(std::move(layout));
+
+    SkColor primary = AshColorProvider::Get()->GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kTextColorPrimary);
+    SkColor secondary = AshColorProvider::Get()->GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kTextColorSecondary);
     for (size_t i = 0; i < labels_.size(); ++i) {
-      AddChildView(CreateLabelView(
-          &labels_[i], std::u16string(),
-          AshColorProvider::Get()->GetContentLayerColor(
-              AshColorProvider::ContentLayerType::kTextColorPrimary)));
+      SkColor color = i == 0 ? secondary : primary;
+      AddChildView(CreateLabelView(&labels_[i], std::u16string(), color));
     }
   }
 
@@ -222,8 +228,11 @@
   // Updates the text content and visibility of all labels in this view.
   void Update(
       const absl::optional<std::vector<DictationBubbleHintType>>& hints) {
-    if (hints.has_value())
+    int num_visible_hints = 0;
+    if (hints.has_value()) {
       DCHECK(hints.value().size() <= kMaxNumHints);
+      num_visible_hints = hints.value().size();
+    }
 
     for (size_t i = 0; i < labels_.size(); ++i) {
       bool has_hint_for_index = hints.has_value() && (i < hints.value().size());
@@ -235,6 +244,10 @@
         labels_[i]->SetText(std::u16string());
       }
     }
+
+    // Set visibility of this view based on the number of visible hints.
+    SetVisible(num_visible_hints > 0 ? true : false);
+
     SizeToPreferredSize();
   }
 
@@ -244,10 +257,12 @@
     if (!color_provider)
       return;
 
-    SkColor text_color = color_provider->GetContentLayerColor(
+    SkColor primary = color_provider->GetContentLayerColor(
         AshColorProvider::ContentLayerType::kTextColorPrimary);
+    SkColor secondary = color_provider->GetContentLayerColor(
+        AshColorProvider::ContentLayerType::kTextColorSecondary);
     for (size_t i = 0; i < labels_.size(); ++i) {
-      labels_[i]->SetEnabledColor(text_color);
+      labels_[i]->SetEnabledColor(i == 0 ? secondary : primary);
     }
   }
 
@@ -296,6 +311,7 @@
 void DictationBubbleView::Init() {
   std::unique_ptr<views::BoxLayout> layout = std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical);
+  layout->set_between_child_spacing(kSpaceBetweenTopRowAndHintViewsDip);
   SetLayoutManager(std::move(layout));
   UseCompactMargins();
 
diff --git a/ash/system/holding_space/holding_space_view_delegate.cc b/ash/system/holding_space/holding_space_view_delegate.cc
index fe1853ef..f7e8f77 100644
--- a/ash/system/holding_space/holding_space_view_delegate.cc
+++ b/ash/system/holding_space/holding_space_view_delegate.cc
@@ -434,7 +434,7 @@
   if (context_menu_runner_ && context_menu_runner_->IsRunning())
     return;
 
-  int run_types = views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+  int run_types = views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                   views::MenuRunner::CONTEXT_MENU |
                   views::MenuRunner::FIXED_ANCHOR;
 
diff --git a/ash/system/message_center/ash_notification_view.cc b/ash/system/message_center/ash_notification_view.cc
index ac9df12..9b356cb 100644
--- a/ash/system/message_center/ash_notification_view.cc
+++ b/ash/system/message_center/ash_notification_view.cc
@@ -722,6 +722,9 @@
   if (!is_grouped_child_view_)
     grouped_notifications_scroll_view_->SetVisible(is_grouped_parent_view_);
 
+  if (is_grouped_child_view_ && !is_nested())
+    SetIsNested();
+
   header_row()->SetVisible(!is_grouped_child_view_);
   UpdateMessageLabelInExpandedState(notification);
 
diff --git a/ash/system/message_center/unified_message_list_view.cc b/ash/system/message_center/unified_message_list_view.cc
index 7dcf6f0..f84dec1 100644
--- a/ash/system/message_center/unified_message_list_view.cc
+++ b/ash/system/message_center/unified_message_list_view.cc
@@ -829,7 +829,10 @@
   auto* view =
       MessageViewFactory::Create(notification, /*shown_in_popup=*/false)
           .release();
-  view->SetIsNested();
+  // Setting grouped notifications as nested is handled in
+  // `AshNotificationView`.
+  if (!notification.group_child())
+    view->SetIsNested();
   view->AddObserver(this);
   message_center_view_->ConfigureMessageView(view);
   return view;
diff --git a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h
index 263d9da..5d219561 100644
--- a/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h
+++ b/ash/system/pcie_peripheral/pcie_peripheral_notification_controller.h
@@ -63,6 +63,10 @@
 
   // Stubs from usb peripheral notification controller
   void OnInvalidDpCableWarning() override {}
+  void OnInvalidUSB4ValidTBTCableWarning() override {}
+  void OnInvalidUSB4CableWarning() override {}
+  void OnInvalidTBTCableWarning() override {}
+  void OnSpeedLimitingCableWarning() override {}
 
  private:
   friend class PciePeripheralNotificationControllerTest;
diff --git a/ash/system/phonehub/camera_roll_thumbnail.cc b/ash/system/phonehub/camera_roll_thumbnail.cc
index df705b98..72a0d88 100644
--- a/ash/system/phonehub/camera_roll_thumbnail.cc
+++ b/ash/system/phonehub/camera_roll_thumbnail.cc
@@ -97,7 +97,7 @@
   menu_runner_ = std::make_unique<views::MenuRunner>(
       GetMenuModel(), views::MenuRunner::CONTEXT_MENU |
                           views::MenuRunner::FIXED_ANCHOR |
-                          views::MenuRunner::USE_TOUCHABLE_LAYOUT);
+                          views::MenuRunner::USE_ASH_SYS_UI_LAYOUT);
   menu_runner_->RunMenuAt(GetWidget(), button_controller(), GetBoundsInScreen(),
                           views::MenuAnchorPosition::kBubbleTopRight,
                           ui::MENU_SOURCE_NONE);
diff --git a/ash/system/time/calendar_view.cc b/ash/system/time/calendar_view.cc
index a1b2190..3495049 100644
--- a/ash/system/time/calendar_view.cc
+++ b/ash/system/time/calendar_view.cc
@@ -1250,6 +1250,16 @@
   scroll_view_->SetVerticalScrollBarMode(
       views::ScrollView::ScrollBarMode::kDisabled);
   calendar_view_controller_->OnEventListOpened();
+  if (IsDateCellViewFocused()) {
+    auto* focus_manager = GetFocusManager();
+    event_list_container_->RequestFocus();
+    event_list_container_->SetFocusBehavior(FocusBehavior::NEVER);
+    focus_manager->AdvanceFocus(/*reverse=*/false);
+    current_month_->DisableFocus();
+    previous_month_->DisableFocus();
+    next_month_->DisableFocus();
+    content_view_->SetFocusBehavior(FocusBehavior::ALWAYS);
+  }
 }
 
 BEGIN_METADATA(CalendarView, views::View)
diff --git a/ash/system/time/calendar_view_unittest.cc b/ash/system/time/calendar_view_unittest.cc
index 57bde6b..eb231b6 100644
--- a/ash/system/time/calendar_view_unittest.cc
+++ b/ash/system/time/calendar_view_unittest.cc
@@ -138,6 +138,11 @@
     generator.PressKey(ui::KeyboardCode::VKEY_TAB, ui::EventFlags::EF_NONE);
   }
 
+  void PressShiftTab() {
+    ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
+    generator.PressKey(ui::KeyboardCode::VKEY_TAB, ui::EF_SHIFT_DOWN);
+  }
+
   void PressEnter() {
     ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow());
     generator.PressKey(ui::KeyboardCode::VKEY_RETURN, ui::EventFlags::EF_NONE);
@@ -619,6 +624,17 @@
   PressEnter();
   EXPECT_EQ(views::ScrollView::ScrollBarMode::kDisabled, GetScrollBarMode());
 
+  // Focus moves to the event list close button.
+  EXPECT_EQ(close_button(), focus_manager->GetFocusedView());
+
+  // Focus moves back to the date cell.
+  PressShiftTab();
+  PressShiftTab();
+  EXPECT_EQ(u"7",
+            static_cast<views::LabelButton*>(focus_manager->GetFocusedView())
+                ->GetText());
+  EXPECT_EQ(u"June", GetCurrentLabelText());
+
   // Tapping on up arrow keys should go to the previous month, which mens the
   // scroll bar is enabled during the key pressed.
   PressUp();
diff --git a/ash/system/tray/tray_background_view.cc b/ash/system/tray/tray_background_view.cc
index 5baa27c..e302e042 100644
--- a/ash/system/tray/tray_background_view.cc
+++ b/ash/system/tray/tray_background_view.cc
@@ -390,7 +390,7 @@
   if (!context_menu_model_)
     return;
 
-  const int run_types = views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+  const int run_types = views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                         views::MenuRunner::CONTEXT_MENU |
                         views::MenuRunner::FIXED_ANCHOR;
   context_menu_runner_ = std::make_unique<views::MenuRunner>(
diff --git a/ash/system/usb_peripheral/usb_peripheral_notification_controller.cc b/ash/system/usb_peripheral/usb_peripheral_notification_controller.cc
index 9ce71d8..ae60813 100644
--- a/ash/system/usb_peripheral/usb_peripheral_notification_controller.cc
+++ b/ash/system/usb_peripheral/usb_peripheral_notification_controller.cc
@@ -9,7 +9,10 @@
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
+#include "ash/strings/grit/ash_strings.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/cros_system_api/dbus/typecd/dbus-constants.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/public/cpp/notification.h"
 #include "ui/message_center/public/cpp/notification_types.h"
@@ -21,8 +24,18 @@
 const char kNotifierUsbPeripheral[] = "ash.usb_peripheral";
 const char kUsbPeripheralInvalidDpCableNotificationId[] =
     "cros_usb_peripheral_invalid_dp_cable_notification_id";
-const char kNotificationLandingPageUrl[] =
+const char kUsbPeripheralInvalidUSB4ValidTBTCableNotificationId[] =
+    "cros_usb_peripheral_invalid_usb4_valid_tbt_cable_notification_id";
+const char kUsbPeripheralInvalidUSB4CableNotificationId[] =
+    "cros_usb_peripheral_invalid_usb4_cable_notification_id";
+const char kUsbPeripheralInvalidTBTCableNotificationId[] =
+    "cros_usb_peripheral_invalid_tbt_cable_notification_id";
+const char kUsbPeripheralSpeedLimitingCableNotificationId[] =
+    "cros_usb_peripheral_speed_limiting_cable_notification_id";
+const char kNotificationDisplayLandingPageUrl[] =
     "https://support.google.com/chromebook?p=cable_notification";
+const char kNotificationDeviceLandingPageUrl[] =
+    "https://support.google.com/chromebook?p=cable_notification_2";
 
 bool ShouldDisplayNotification() {
   return Shell::Get()->session_controller()->GetSessionState() ==
@@ -30,11 +43,15 @@
          !Shell::Get()->session_controller()->IsUserSessionBlocked();
 }
 
-void OnInvalidDpCableNotificationClicked() {
-  NewWindowDelegate::GetInstance()->OpenUrl(GURL(kNotificationLandingPageUrl),
-                                            /*from_user_interaction=*/true);
-  message_center::MessageCenter::Get()->RemoveNotification(
-      kUsbPeripheralInvalidDpCableNotificationId, /*from_user=*/true);
+void OnCableNotificationClicked(const std::string& notification_id,
+                                const std::string& landing_page,
+                                absl::optional<int> button_index) {
+  if (button_index)
+    NewWindowDelegate::GetInstance()->OpenUrl(GURL(landing_page),
+                                              /*from_user_interaction=*/true);
+
+  message_center::MessageCenter::Get()->RemoveNotification(notification_id,
+                                                           /*from_user=*/true);
 }
 
 }  // namespace
@@ -61,18 +78,159 @@
   if (!ShouldDisplayNotification())
     return;
 
+  message_center::RichNotificationData optional;
+  optional.buttons.push_back(message_center::ButtonInfo(
+      l10n_util::GetStringUTF16(IDS_ASH_USB_NOTIFICATION_LEARN_MORE)));
+
   std::unique_ptr<message_center::Notification> notification =
       CreateSystemNotification(
           message_center::NOTIFICATION_TYPE_SIMPLE,
-          kUsbPeripheralInvalidDpCableNotificationId, u"USB Type-C Warning.",
-          u"This cable may not support dp alternate mode.",
+          kUsbPeripheralInvalidDpCableNotificationId,
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_TITLE),
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_DISPLAY_BODY),
           /*display_source=*/std::u16string(), GURL(),
           message_center::NotifierId(
               message_center::NotifierType::SYSTEM_COMPONENT,
               kNotifierUsbPeripheral),
-          message_center::RichNotificationData(),
+          optional,
           base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
-              base::BindRepeating(&OnInvalidDpCableNotificationClicked)),
+              base::BindRepeating(&OnCableNotificationClicked,
+                                  kUsbPeripheralInvalidDpCableNotificationId,
+                                  kNotificationDisplayLandingPageUrl)),
+          kSettingsIcon,
+          message_center::SystemNotificationWarningLevel::WARNING);
+
+  message_center_->AddNotification(std::move(notification));
+}
+
+// Notify the user that the USB4 device will use TBT due to the cable.
+void UsbPeripheralNotificationController::OnInvalidUSB4ValidTBTCableWarning() {
+  if (!ShouldDisplayNotification())
+    return;
+
+  message_center::RichNotificationData optional;
+  optional.buttons.push_back(message_center::ButtonInfo(
+      l10n_util::GetStringUTF16(IDS_ASH_USB_NOTIFICATION_LEARN_MORE)));
+
+  std::unique_ptr<message_center::Notification> notification =
+      CreateSystemNotification(
+          message_center::NOTIFICATION_TYPE_SIMPLE,
+          kUsbPeripheralInvalidUSB4ValidTBTCableNotificationId,
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE),
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_USB4_SUPPORT_BODY),
+          /*display_source=*/std::u16string(), GURL(),
+          message_center::NotifierId(
+              message_center::NotifierType::SYSTEM_COMPONENT,
+              kNotifierUsbPeripheral),
+          optional,
+          base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
+              base::BindRepeating(
+                  &OnCableNotificationClicked,
+                  kUsbPeripheralInvalidUSB4ValidTBTCableNotificationId,
+                  kNotificationDeviceLandingPageUrl)),
+          kSettingsIcon,
+          message_center::SystemNotificationWarningLevel::WARNING);
+
+  message_center_->AddNotification(std::move(notification));
+}
+
+// Notify the user that the USB4 device will use DisplayPort,
+// USB 3.2 or USB 2.0 due to the cable.
+void UsbPeripheralNotificationController::OnInvalidUSB4CableWarning() {
+  if (!ShouldDisplayNotification())
+    return;
+
+  message_center::RichNotificationData optional;
+  optional.buttons.push_back(message_center::ButtonInfo(
+      l10n_util::GetStringUTF16(IDS_ASH_USB_NOTIFICATION_LEARN_MORE)));
+
+  std::unique_ptr<message_center::Notification> notification =
+      CreateSystemNotification(
+          message_center::NOTIFICATION_TYPE_SIMPLE,
+          kUsbPeripheralInvalidUSB4CableNotificationId,
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE),
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_USB4_SUPPORT_BODY),
+          /*display_source=*/std::u16string(), GURL(),
+          message_center::NotifierId(
+              message_center::NotifierType::SYSTEM_COMPONENT,
+              kNotifierUsbPeripheral),
+          optional,
+          base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
+              base::BindRepeating(&OnCableNotificationClicked,
+                                  kUsbPeripheralInvalidUSB4CableNotificationId,
+                                  kNotificationDeviceLandingPageUrl)),
+          kSettingsIcon,
+          message_center::SystemNotificationWarningLevel::WARNING);
+
+  message_center_->AddNotification(std::move(notification));
+}
+
+// Notify the user that the TBT device will use DisplayPort,
+// USB 3.2 or USB 2.0 due to the cable.
+void UsbPeripheralNotificationController::OnInvalidTBTCableWarning() {
+  if (!ShouldDisplayNotification())
+    return;
+
+  message_center::RichNotificationData optional;
+  optional.buttons.push_back(message_center::ButtonInfo(
+      l10n_util::GetStringUTF16(IDS_ASH_USB_NOTIFICATION_LEARN_MORE)));
+
+  std::unique_ptr<message_center::Notification> notification =
+      CreateSystemNotification(
+          message_center::NOTIFICATION_TYPE_SIMPLE,
+          kUsbPeripheralInvalidTBTCableNotificationId,
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE),
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_NO_TBT_SUPPORT_BODY),
+          /*display_source=*/std::u16string(), GURL(),
+          message_center::NotifierId(
+              message_center::NotifierType::SYSTEM_COMPONENT,
+              kNotifierUsbPeripheral),
+          optional,
+          base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
+              base::BindRepeating(&OnCableNotificationClicked,
+                                  kUsbPeripheralInvalidTBTCableNotificationId,
+                                  kNotificationDeviceLandingPageUrl)),
+          kSettingsIcon,
+          message_center::SystemNotificationWarningLevel::WARNING);
+
+  message_center_->AddNotification(std::move(notification));
+}
+
+// Notify the user that the cable limits USB device performance.
+void UsbPeripheralNotificationController::OnSpeedLimitingCableWarning() {
+  if (!ShouldDisplayNotification())
+    return;
+
+  message_center::RichNotificationData optional;
+  optional.buttons.push_back(message_center::ButtonInfo(
+      l10n_util::GetStringUTF16(IDS_ASH_USB_NOTIFICATION_LEARN_MORE)));
+
+  std::unique_ptr<message_center::Notification> notification =
+      CreateSystemNotification(
+          message_center::NOTIFICATION_TYPE_SIMPLE,
+          kUsbPeripheralSpeedLimitingCableNotificationId,
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_PERFORMANCE_TITLE),
+          l10n_util::GetStringUTF16(
+              IDS_ASH_USB_NOTIFICATION_CABLE_WARNING_SPEED_LIMITED_BODY),
+          /*display_source=*/std::u16string(), GURL(),
+          message_center::NotifierId(
+              message_center::NotifierType::SYSTEM_COMPONENT,
+              kNotifierUsbPeripheral),
+          optional,
+          base::MakeRefCounted<message_center::HandleNotificationClickDelegate>(
+              base::BindRepeating(
+                  &OnCableNotificationClicked,
+                  kUsbPeripheralSpeedLimitingCableNotificationId,
+                  kNotificationDeviceLandingPageUrl)),
           kSettingsIcon,
           message_center::SystemNotificationWarningLevel::WARNING);
 
diff --git a/ash/system/usb_peripheral/usb_peripheral_notification_controller.h b/ash/system/usb_peripheral/usb_peripheral_notification_controller.h
index b73b567..a466014 100644
--- a/ash/system/usb_peripheral/usb_peripheral_notification_controller.h
+++ b/ash/system/usb_peripheral/usb_peripheral_notification_controller.h
@@ -30,6 +30,10 @@
 
   // PeripheralNotificationManager::Observer:
   void OnInvalidDpCableWarning() override;
+  void OnInvalidUSB4ValidTBTCableWarning() override;
+  void OnInvalidUSB4CableWarning() override;
+  void OnInvalidTBTCableWarning() override;
+  void OnSpeedLimitingCableWarning() override;
 
   // Stubs from PCIE Notification controller
   void OnLimitedPerformancePeripheralReceived() override {}
diff --git a/ash/system/usb_peripheral/usb_peripheral_notification_controller_unittest.cc b/ash/system/usb_peripheral/usb_peripheral_notification_controller_unittest.cc
index f7c06272..a7f1c53d 100644
--- a/ash/system/usb_peripheral/usb_peripheral_notification_controller_unittest.cc
+++ b/ash/system/usb_peripheral/usb_peripheral_notification_controller_unittest.cc
@@ -16,6 +16,14 @@
 
 const char kUsbPeripheralInvalidDpCableNotificationId[] =
     "cros_usb_peripheral_invalid_dp_cable_notification_id";
+const char kUsbPeripheralInvalidUSB4ValidTBTCableNotificationId[] =
+    "cros_usb_peripheral_invalid_usb4_valid_tbt_cable_notification_id";
+const char kUsbPeripheralInvalidUSB4CableNotificationId[] =
+    "cros_usb_peripheral_invalid_usb4_cable_notification_id";
+const char kUsbPeripheralInvalidTBTCableNotificationId[] =
+    "cros_usb_peripheral_invalid_tbt_cable_notification_id";
+const char kUsbPeripheralSpeedLimitingCableNotificationId[] =
+    "cros_usb_peripheral_speed_limiting_cable_notification_id";
 
 }  // namespace
 
@@ -31,11 +39,6 @@
   UsbPeripheralNotificationController* controller() {
     return Shell::Get()->usb_peripheral_notification_controller();
   }
-
-  message_center::Notification* GetInvalidDpCableNotification() {
-    return MessageCenter::Get()->FindVisibleNotificationById(
-        kUsbPeripheralInvalidDpCableNotificationId);
-  }
 };
 
 TEST_F(UsbPeripheralNotificationControllerTest, InvalidDpCableNotification) {
@@ -43,12 +46,76 @@
   controller()->OnInvalidDpCableWarning();
   EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
 
-  message_center::Notification* notification = GetInvalidDpCableNotification();
+  message_center::Notification* notification =
+      MessageCenter::Get()->FindVisibleNotificationById(
+          kUsbPeripheralInvalidDpCableNotificationId);
   ASSERT_TRUE(notification);
 
-  EXPECT_EQ(notification->buttons().size(), 0u);
+  EXPECT_EQ(notification->buttons().size(), 1u);
   controller()->OnInvalidDpCableWarning();
   EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
 }
 
+TEST_F(UsbPeripheralNotificationControllerTest,
+       InvalidUSB4ValidTBTCableNotification) {
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 0u);
+  controller()->OnInvalidUSB4ValidTBTCableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+
+  message_center::Notification* notification =
+      MessageCenter::Get()->FindVisibleNotificationById(
+          kUsbPeripheralInvalidUSB4ValidTBTCableNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(notification->buttons().size(), 1u);
+  controller()->OnInvalidUSB4ValidTBTCableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+}
+
+TEST_F(UsbPeripheralNotificationControllerTest, InvalidUSB4CableNotification) {
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 0u);
+  controller()->OnInvalidUSB4CableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+
+  message_center::Notification* notification =
+      MessageCenter::Get()->FindVisibleNotificationById(
+          kUsbPeripheralInvalidUSB4CableNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(notification->buttons().size(), 1u);
+  controller()->OnInvalidUSB4CableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+}
+
+TEST_F(UsbPeripheralNotificationControllerTest, InvalidTBTCableNotification) {
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 0u);
+  controller()->OnInvalidTBTCableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+
+  message_center::Notification* notification =
+      MessageCenter::Get()->FindVisibleNotificationById(
+          kUsbPeripheralInvalidTBTCableNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(notification->buttons().size(), 1u);
+  controller()->OnInvalidTBTCableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+}
+
+TEST_F(UsbPeripheralNotificationControllerTest,
+       SpeedLimitingCableNotification) {
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 0u);
+  controller()->OnSpeedLimitingCableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+
+  message_center::Notification* notification =
+      MessageCenter::Get()->FindVisibleNotificationById(
+          kUsbPeripheralSpeedLimitingCableNotificationId);
+  ASSERT_TRUE(notification);
+
+  EXPECT_EQ(notification->buttons().size(), 1u);
+  controller()->OnSpeedLimitingCableWarning();
+  EXPECT_EQ(MessageCenter::Get()->NotificationCount(), 1u);
+}
+
 }  // namespace ash
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc
index cffa6ba0..d077511f 100644
--- a/ash/wallpaper/wallpaper_controller_impl.cc
+++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -548,7 +548,7 @@
   }
   if (variant_list) {
     std::vector<OnlineWallpaperVariant> variants;
-    for (const auto& variant_info : variant_list->GetList()) {
+    for (const auto& variant_info : variant_list->GetListDeprecated()) {
       const std::string* variant_asset_id_str = variant_info.FindStringPath(
           WallpaperControllerImpl::kNewWallpaperAssetIdNodeName);
       const std::string* url = variant_info.FindStringPath(
@@ -2439,8 +2439,9 @@
 
   absl::optional<std::vector<SkColor>> cached_colors_out;
   cached_colors_out = std::vector<SkColor>();
-  cached_colors_out.value().reserve(prominent_colors->GetList().size());
-  for (const auto& value : prominent_colors->GetList()) {
+  cached_colors_out.value().reserve(
+      prominent_colors->GetListDeprecated().size());
+  for (const auto& value : prominent_colors->GetListDeprecated()) {
     cached_colors_out.value().push_back(
         static_cast<SkColor>(value.GetDouble()));
   }
diff --git a/ash/webui/camera_app_ui/camera_app_ui.cc b/ash/webui/camera_app_ui/camera_app_ui.cc
index 4a39291e..623f4678 100644
--- a/ash/webui/camera_app_ui/camera_app_ui.cc
+++ b/ash/webui/camera_app_ui/camera_app_ui.cc
@@ -4,11 +4,11 @@
 
 #include "ash/webui/camera_app_ui/camera_app_ui.h"
 
-#include "ash/grit/ash_camera_app_resources_map.h"
 #include "ash/public/cpp/window_properties.h"
 #include "ash/webui/camera_app_ui/camera_app_helper_impl.h"
 #include "ash/webui/camera_app_ui/resources.h"
 #include "ash/webui/camera_app_ui/url_constants.h"
+#include "ash/webui/grit/ash_camera_app_resources_map.h"
 #include "base/bind.h"
 #include "base/strings/string_util.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
diff --git a/ash/webui/color_internals/DEPS b/ash/webui/color_internals/DEPS
index 92c2044..4244eece 100644
--- a/ash/webui/color_internals/DEPS
+++ b/ash/webui/color_internals/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
   # Do not add chrome here. Use a delegate instead.
-  "+ash/grit/ash_color_internals_resources.h",
   "+ui/webui",
 ]
diff --git a/ash/webui/color_internals/color_internals_ui.cc b/ash/webui/color_internals/color_internals_ui.cc
index fbf21703..ae37002 100644
--- a/ash/webui/color_internals/color_internals_ui.cc
+++ b/ash/webui/color_internals/color_internals_ui.cc
@@ -4,9 +4,9 @@
 
 #include "ash/webui/color_internals/color_internals_ui.h"
 
-#include "ash/grit/ash_color_internals_resources.h"
-#include "ash/grit/ash_color_internals_resources_map.h"
 #include "ash/webui/color_internals/url_constants.h"
+#include "ash/webui/grit/ash_color_internals_resources.h"
+#include "ash/webui/grit/ash_color_internals_resources_map.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
diff --git a/ash/webui/common/backend/plural_string_handler.cc b/ash/webui/common/backend/plural_string_handler.cc
index a8fa5a8..1f65d96e 100644
--- a/ash/webui/common/backend/plural_string_handler.cc
+++ b/ash/webui/common/backend/plural_string_handler.cc
@@ -31,10 +31,10 @@
 
 void PluralStringHandler::HandleGetPluralString(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(3U, args->GetList().size());
-  const std::string callback = args->GetList()[0].GetString();
-  const std::string name = args->GetList()[1].GetString();
-  const int count = args->GetList()[2].GetInt();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  const std::string callback = args->GetListDeprecated()[0].GetString();
+  const std::string name = args->GetListDeprecated()[1].GetString();
+  const int count = args->GetListDeprecated()[2].GetInt();
   DCHECK(base::Contains(string_id_map_, name));
   const std::u16string localized_string =
       l10n_util::GetPluralStringFUTF16(string_id_map_.at(name), count);
diff --git a/ash/webui/common/resources/navigation_selector.html b/ash/webui/common/resources/navigation_selector.html
index 8e58d4bd..a28c0bf 100644
--- a/ash/webui/common/resources/navigation_selector.html
+++ b/ash/webui/common/resources/navigation_selector.html
@@ -21,6 +21,10 @@
   padding-inline-start: 20px;
 }
 
+.navigation-item:focus-visible {
+  outline: var(--cros-focus-ring-color) solid var(--focus-border-width);
+}
+
 div:hover:not(.selected).navigation-item {
   background-color: var(--cros-ripple-color);
 }
@@ -47,6 +51,11 @@
   padding-inline-start: 20px;
 }
 
+#navigationSelectorMenu {
+  position: relative;
+  top: var(--focus-border-width, 0);
+}
+
 </style>
 
 <div id="navigationSelectorComponent">
diff --git a/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc b/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc
index cdc33d3..765a379 100644
--- a/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc
+++ b/ash/webui/connectivity_diagnostics/connectivity_diagnostics_ui.cc
@@ -72,7 +72,7 @@
   // TODO(crbug/1220965): Remove conditional feedback button when WebUI feedback
   // is launched.
   void GetShowFeedbackButton(const base::ListValue* value) {
-    auto args = value->GetList();
+    auto args = value->GetListDeprecated();
     if (args.size() < 1 || !args[0].is_string())
       return;
 
diff --git a/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc b/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc
index afa8a8c..0cce03c 100644
--- a/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc
+++ b/ash/webui/demo_mode_app_ui/demo_mode_app_ui.cc
@@ -4,10 +4,10 @@
 
 #include "ash/webui/demo_mode_app_ui/demo_mode_app_ui.h"
 
-#include "ash/grit/ash_demo_mode_app_resources.h"
-#include "ash/grit/ash_demo_mode_app_resources_map.h"
 #include "ash/webui/demo_mode_app_ui/demo_mode_page_handler.h"
 #include "ash/webui/demo_mode_app_ui/url_constants.h"
+#include "ash/webui/grit/ash_demo_mode_app_resources.h"
+#include "ash/webui/grit/ash_demo_mode_app_resources_map.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "services/network/public/mojom/content_security_policy.mojom.h"
diff --git a/ash/webui/diagnostics_ui/DEPS b/ash/webui/diagnostics_ui/DEPS
index c325318..3f6f56d 100644
--- a/ash/webui/diagnostics_ui/DEPS
+++ b/ash/webui/diagnostics_ui/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+ash/grit/ash_diagnostics_app_resources.h",
   "+chromeos/login/login_state",
   "+chromeos/strings/grit/chromeos_strings.h",
   "+components",
diff --git a/ash/webui/diagnostics_ui/backend/session_log_handler.cc b/ash/webui/diagnostics_ui/backend/session_log_handler.cc
index 3209771..8e437e9 100644
--- a/ash/webui/diagnostics_ui/backend/session_log_handler.cc
+++ b/ash/webui/diagnostics_ui/backend/session_log_handler.cc
@@ -183,9 +183,9 @@
 
 void SessionLogHandler::HandleSaveSessionLogRequest(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   DCHECK(save_session_log_callback_id_.empty());
-  save_session_log_callback_id_ = args->GetList()[0].GetString();
+  save_session_log_callback_id_ = args->GetListDeprecated()[0].GetString();
 
   content::WebContents* web_contents = web_ui()->GetWebContents();
   gfx::NativeWindow owning_window =
@@ -205,7 +205,7 @@
 }
 
 void SessionLogHandler::HandleInitialize(const base::ListValue* args) {
-  DCHECK(args && args->GetList().empty());
+  DCHECK(args && args->GetListDeprecated().empty());
   AllowJavascript();
 }
 
diff --git a/ash/webui/diagnostics_ui/diagnostics_ui.cc b/ash/webui/diagnostics_ui/diagnostics_ui.cc
index b65b6362..7e80725 100644
--- a/ash/webui/diagnostics_ui/diagnostics_ui.cc
+++ b/ash/webui/diagnostics_ui/diagnostics_ui.cc
@@ -8,8 +8,6 @@
 #include <string>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_diagnostics_app_resources.h"
-#include "ash/grit/ash_diagnostics_app_resources_map.h"
 #include "ash/webui/common/backend/plural_string_handler.h"
 #include "ash/webui/diagnostics_ui/backend/diagnostics_manager.h"
 #include "ash/webui/diagnostics_ui/backend/histogram_util.h"
@@ -23,6 +21,8 @@
 #include "ash/webui/diagnostics_ui/mojom/network_health_provider.mojom.h"
 #include "ash/webui/diagnostics_ui/mojom/system_data_provider.mojom.h"
 #include "ash/webui/diagnostics_ui/url_constants.h"
+#include "ash/webui/grit/ash_diagnostics_app_resources.h"
+#include "ash/webui/grit/ash_diagnostics_app_resources_map.h"
 #include "base/containers/span.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
diff --git a/ash/webui/eche_app_ui/DEPS b/ash/webui/eche_app_ui/DEPS
index e81a168e..c85b845 100644
--- a/ash/webui/eche_app_ui/DEPS
+++ b/ash/webui/eche_app_ui/DEPS
@@ -1,7 +1,5 @@
 include_rules = [
   # Do not add chrome here (use a delegate instead).
-  "+ash/grit/ash_eche_bundle_resources.h",
-  "+ash/grit/ash_eche_bundle_resources_map.h",
   "+chromeos/services/device_sync/public/cpp",
   "+components/keyed_service/core/keyed_service.h",
   "+crypto/random.h",
diff --git a/ash/webui/eche_app_ui/eche_app_ui.cc b/ash/webui/eche_app_ui/eche_app_ui.cc
index 0c113f6..db853dce 100644
--- a/ash/webui/eche_app_ui/eche_app_ui.cc
+++ b/ash/webui/eche_app_ui/eche_app_ui.cc
@@ -4,12 +4,12 @@
 
 #include <memory>
 
-#include "ash/grit/ash_eche_app_resources.h"
-#include "ash/grit/ash_eche_bundle_resources.h"
 #include "ash/webui/eche_app_ui/eche_app_manager.h"
 #include "ash/webui/eche_app_ui/eche_app_ui.h"
 #include "ash/webui/eche_app_ui/mojom/eche_app.mojom.h"
 #include "ash/webui/eche_app_ui/url_constants.h"
+#include "ash/webui/grit/ash_eche_app_resources.h"
+#include "ash/webui/grit/ash_eche_bundle_resources.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
diff --git a/ash/webui/eche_app_ui/untrusted_eche_app_ui.cc b/ash/webui/eche_app_ui/untrusted_eche_app_ui.cc
index 8856501..6b2df83b 100644
--- a/ash/webui/eche_app_ui/untrusted_eche_app_ui.cc
+++ b/ash/webui/eche_app_ui/untrusted_eche_app_ui.cc
@@ -4,10 +4,10 @@
 
 #include "ash/webui/eche_app_ui/untrusted_eche_app_ui.h"
 
-#include "ash/grit/ash_eche_app_resources.h"
-#include "ash/grit/ash_eche_bundle_resources.h"
-#include "ash/grit/ash_eche_bundle_resources_map.h"
 #include "ash/webui/eche_app_ui/url_constants.h"
+#include "ash/webui/grit/ash_eche_app_resources.h"
+#include "ash/webui/grit/ash_eche_bundle_resources.h"
+#include "ash/webui/grit/ash_eche_bundle_resources_map.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
diff --git a/ash/webui/file_manager/DEPS b/ash/webui/file_manager/DEPS
index 96c8cf6a..2483c32 100644
--- a/ash/webui/file_manager/DEPS
+++ b/ash/webui/file_manager/DEPS
@@ -1,6 +1,5 @@
 include_rules = [
   # Do not add chrome here (use a delegate instead).
-  "+ash/grit/ash_file_manager_resources.h",
   "+ui/file_manager/grit",
   "+ui/webui",
 ]
diff --git a/ash/webui/firmware_update_ui/DEPS b/ash/webui/firmware_update_ui/DEPS
index 0db0cc9..5ea09cfd 100644
--- a/ash/webui/firmware_update_ui/DEPS
+++ b/ash/webui/firmware_update_ui/DEPS
@@ -1,5 +1,3 @@
 include_rules = [
-  "+ash/grit/ash_firmware_update_app_resources.h",
-  "+ash/grit/ash_firmware_update_app_resources_map.h",
   "+ui/resources",
 ]
diff --git a/ash/webui/firmware_update_ui/firmware_update_app_ui.cc b/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
index 97f9e81..f16f07b 100644
--- a/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
+++ b/ash/webui/firmware_update_ui/firmware_update_app_ui.cc
@@ -8,10 +8,10 @@
 #include <utility>
 
 #include "ash/components/fwupd/firmware_update_manager.h"
-#include "ash/grit/ash_firmware_update_app_resources.h"
-#include "ash/grit/ash_firmware_update_app_resources_map.h"
 #include "ash/webui/firmware_update_ui/mojom/firmware_update.mojom.h"
 #include "ash/webui/firmware_update_ui/url_constants.h"
+#include "ash/webui/grit/ash_firmware_update_app_resources.h"
+#include "ash/webui/grit/ash_firmware_update_app_resources_map.h"
 #include "chromeos/strings/grit/chromeos_strings.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui.h"
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html
index 745a55d7..f9d13ed1 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html
+++ b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.html
@@ -40,7 +40,9 @@
         [[dialogContent.body]]
       </div>
     </div>
-    <div slot="footer" hidden$="[[!shouldShowProgressBar_(installationProgress.state)]]">
+    <div slot="footer"
+        hidden$="[[!shouldShowProgressBar_(installationProgress.*,
+                   isInitiallyInflight_)]]">
       <label id="progress" class="firmware-dialog-installing-font">
         [[dialogContent.footer]]
       </label>
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
index ec3a96f..a86b4861 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
+++ b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
@@ -116,6 +116,11 @@
    * @param {!InstallationProgress} update
    */
   onStatusChanged(update) {
+    if (update.state === UpdateState.kSuccess ||
+        update.state === UpdateState.kFailed) {
+      // Install is completed, reset inflight state.
+      this.isInitiallyInflight_ = false;
+    }
     this.installationProgress = update;
   }
 
@@ -225,7 +230,8 @@
    * @return {boolean}
    */
   shouldShowProgressBar_() {
-    return this.isUpdateInProgress_() || this.isDeviceRestarting_();
+    return this.isUpdateInProgress_() || this.isDeviceRestarting_() ||
+        this.isInitiallyInflight_;
   }
   /**
    * @protected
diff --git a/ash/webui/help_app_ui/help_app_ui.cc b/ash/webui/help_app_ui/help_app_ui.cc
index 5ac1003..7d188c0 100644
--- a/ash/webui/help_app_ui/help_app_ui.cc
+++ b/ash/webui/help_app_ui/help_app_ui.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_help_app_resources.h"
+#include "ash/webui/grit/ash_help_app_resources.h"
 #include "ash/webui/help_app_ui/help_app_manager.h"
 #include "ash/webui/help_app_ui/help_app_manager_factory.h"
 #include "ash/webui/help_app_ui/help_app_page_handler.h"
diff --git a/ash/webui/help_app_ui/help_app_untrusted_ui.cc b/ash/webui/help_app_ui/help_app_untrusted_ui.cc
index cdcedfd2..ee58d6d 100644
--- a/ash/webui/help_app_ui/help_app_untrusted_ui.cc
+++ b/ash/webui/help_app_ui/help_app_untrusted_ui.cc
@@ -4,7 +4,7 @@
 
 #include "ash/webui/help_app_ui/help_app_untrusted_ui.h"
 
-#include "ash/grit/ash_help_app_resources.h"
+#include "ash/webui/grit/ash_help_app_resources.h"
 #include "ash/webui/help_app_ui/url_constants.h"
 #include "ash/webui/web_applications/webui_test_prod_util.h"
 #include "chromeos/grit/chromeos_help_app_bundle_resources.h"
diff --git a/ash/webui/media_app_ui/media_app_guest_ui.cc b/ash/webui/media_app_ui/media_app_guest_ui.cc
index fd954db..383ce8a 100644
--- a/ash/webui/media_app_ui/media_app_guest_ui.cc
+++ b/ash/webui/media_app_ui/media_app_guest_ui.cc
@@ -4,7 +4,7 @@
 
 #include "ash/webui/media_app_ui/media_app_guest_ui.h"
 
-#include "ash/grit/ash_media_app_resources.h"
+#include "ash/webui/grit/ash_media_app_resources.h"
 #include "ash/webui/media_app_ui/url_constants.h"
 #include "ash/webui/web_applications/webui_test_prod_util.h"
 #include "chromeos/grit/chromeos_media_app_bundle_resources.h"
diff --git a/ash/webui/media_app_ui/media_app_ui.cc b/ash/webui/media_app_ui/media_app_ui.cc
index ac26db8..42685eb 100644
--- a/ash/webui/media_app_ui/media_app_ui.cc
+++ b/ash/webui/media_app_ui/media_app_ui.cc
@@ -6,7 +6,7 @@
 
 #include <utility>
 
-#include "ash/grit/ash_media_app_resources.h"
+#include "ash/webui/grit/ash_media_app_resources.h"
 #include "ash/webui/media_app_ui/media_app_page_handler.h"
 #include "ash/webui/media_app_ui/url_constants.h"
 #include "ash/webui/web_applications/webui_test_prod_util.h"
diff --git a/ash/webui/multidevice_debug/proximity_auth_ui.cc b/ash/webui/multidevice_debug/proximity_auth_ui.cc
index d761916..e10699c 100644
--- a/ash/webui/multidevice_debug/proximity_auth_ui.cc
+++ b/ash/webui/multidevice_debug/proximity_auth_ui.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/grit/ash_multidevice_debug_resources.h"
+#include "ash/webui/grit/ash_multidevice_debug_resources.h"
 #include "ash/webui/multidevice_debug/proximity_auth_webui_handler.h"
 #include "ash/webui/multidevice_debug/url_constants.h"
 #include "base/bind.h"
diff --git a/ash/webui/os_feedback_ui/os_feedback_ui.cc b/ash/webui/os_feedback_ui/os_feedback_ui.cc
index a5a5f6a..f85b4e1 100644
--- a/ash/webui/os_feedback_ui/os_feedback_ui.cc
+++ b/ash/webui/os_feedback_ui/os_feedback_ui.cc
@@ -4,8 +4,8 @@
 
 #include "ash/webui/os_feedback_ui/os_feedback_ui.h"
 
-#include "ash/grit/ash_os_feedback_resources.h"
-#include "ash/grit/ash_os_feedback_resources_map.h"
+#include "ash/webui/grit/ash_os_feedback_resources.h"
+#include "ash/webui/grit/ash_os_feedback_resources_map.h"
 #include "ash/webui/os_feedback_ui/url_constants.h"
 #include "base/memory/ptr_util.h"
 #include "content/public/browser/web_contents.h"
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom
index 15e4e57f..6e787f1 100644
--- a/ash/webui/personalization_app/mojom/personalization_app.mojom
+++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -192,13 +192,14 @@
     // will be -1 on failure.
     FetchGooglePhotosCount() => (int32 count);
 
-    // Fetch the list of all photos the user has stored in their Google Photos
-    // library. Only visible photos will be returned. On error,
-    // |response.photos| will be absent. |response.resume_token| will be present
-    // when there are more results to fetch; |resume_token| will be present when
-    // this is a follow-up query to one that indicated there were more results
-    // to fetch.
-    FetchGooglePhotosPhotos(string? resume_token) =>
+    // Fetch a list of photos the user has stored in Google Photos. If provided,
+    // |album_id| specifies the album whose photos are fetched; otherwise, the
+    // user's entire library is fetched. Only visible photos will be returned.
+    // On error, |response.photos| will be absent. |response.resume_token| will
+    // be present when there are more results to fetch; |resume_token| will be
+    // present when this is a follow-up query to one that indicated there were
+    // more results to fetch.
+    FetchGooglePhotosPhotos(string? album_id, string? resume_token) =>
         (FetchGooglePhotosPhotosResponse response);
 
     // Fetch a list of FilePath objects from the local file system. |images|
@@ -327,9 +328,9 @@
   // Boolean pref for whether ambient mode is enabled.
   IsAmbientModeEnabled() => (bool enabled);
 
-  // Binds a listener to start receiving updates on ambient mode pref changes.
-  SetAmbientObserver(pending_remote<AmbientObserver> observer);
-
   // Enables or disables ambient mode.
   SetAmbientModeEnabled(bool enabled);
+
+  // Binds a listener to start receiving updates on ambient mode pref changes.
+  SetAmbientObserver(pending_remote<AmbientObserver> observer);
 };
diff --git a/ash/webui/personalization_app/personalization_app_ui.cc b/ash/webui/personalization_app/personalization_app_ui.cc
index 2c09250..e152a13 100644
--- a/ash/webui/personalization_app/personalization_app_ui.cc
+++ b/ash/webui/personalization_app/personalization_app_ui.cc
@@ -5,8 +5,8 @@
 #include "ash/webui/personalization_app/personalization_app_ui.h"
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_personalization_app_resources.h"
-#include "ash/grit/ash_personalization_app_resources_map.h"
+#include "ash/webui/grit/ash_personalization_app_resources.h"
+#include "ash/webui/grit/ash_personalization_app_resources_map.h"
 #include "ash/webui/personalization_app/personalization_app_ambient_provider.h"
 #include "ash/webui/personalization_app/personalization_app_theme_provider.h"
 #include "ash/webui/personalization_app/personalization_app_url_constants.h"
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
index d6c6d96..72d5035 100644
--- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
+++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_controller.ts
@@ -121,12 +121,14 @@
   store.dispatch(action.beginLoadGooglePhotosPhotosAction());
 
   let photos: Array<GooglePhotosPhoto>|null = [];
+  const albumId: string|null|undefined = null;
   let resumeToken: string|null|undefined = null;
 
   // TODO(b/216882690): Support incremental load of photos as the user scrolls
   // through their library as opposed to loading them all at once.
   do {
-    const {response} = await provider.fetchGooglePhotosPhotos(resumeToken) as
+    const {response} =
+        await provider.fetchGooglePhotosPhotos(albumId, resumeToken) as
         {response: FetchGooglePhotosPhotosResponse};
     if (!Array.isArray(response.photos)) {
       console.warn('Failed to fetch Google Photos photos');
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
index b273d008..813d40b 100644
--- a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
+++ b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
@@ -74,6 +74,7 @@
 }
 
 void FakePersonalizationAppWallpaperProvider::FetchGooglePhotosPhotos(
+    const absl::optional<std::string>& album_id,
     const absl::optional<std::string>& resume_token,
     FetchGooglePhotosPhotosCallback callback) {
   std::move(callback).Run(
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
index cd22c90..1560f8a 100644
--- a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
+++ b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
@@ -51,6 +51,7 @@
   void FetchGooglePhotosCount(FetchGooglePhotosCountCallback callback) override;
 
   void FetchGooglePhotosPhotos(
+      const absl::optional<std::string>& album_id,
       const absl::optional<std::string>& resume_token,
       FetchGooglePhotosPhotosCallback callback) override;
 
diff --git a/ash/webui/personalization_app/untrusted_personalization_app_ui_config.cc b/ash/webui/personalization_app/untrusted_personalization_app_ui_config.cc
index d6877e2..8485a5c 100644
--- a/ash/webui/personalization_app/untrusted_personalization_app_ui_config.cc
+++ b/ash/webui/personalization_app/untrusted_personalization_app_ui_config.cc
@@ -5,8 +5,8 @@
 #include "ash/webui/personalization_app/untrusted_personalization_app_ui_config.h"
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_personalization_app_resources.h"
-#include "ash/grit/ash_personalization_app_resources_map.h"
+#include "ash/webui/grit/ash_personalization_app_resources.h"
+#include "ash/webui/grit/ash_personalization_app_resources_map.h"
 #include "ash/webui/personalization_app/personalization_app_url_constants.h"
 #include "base/strings/string_util.h"
 #include "chromeos/strings/grit/chromeos_strings.h"
diff --git a/ash/webui/print_management/print_management_ui.cc b/ash/webui/print_management/print_management_ui.cc
index 0047466..597d7d4e 100644
--- a/ash/webui/print_management/print_management_ui.cc
+++ b/ash/webui/print_management/print_management_ui.cc
@@ -4,8 +4,8 @@
 
 #include "ash/webui/print_management/print_management_ui.h"
 
-#include "ash/grit/ash_print_management_resources.h"
-#include "ash/grit/ash_print_management_resources_map.h"
+#include "ash/webui/grit/ash_print_management_resources.h"
+#include "ash/webui/grit/ash_print_management_resources_map.h"
 #include "ash/webui/print_management/mojom/printing_manager.mojom.h"
 #include "ash/webui/print_management/url_constants.h"
 #include "base/memory/ptr_util.h"
diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
index fc96b3e3..a852d05 100644
--- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc
+++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
@@ -136,7 +136,7 @@
   EXPECT_TRUE(call_data.arg2()->GetBool());
   ASSERT_TRUE(call_data.arg3()->is_list());
 
-  const auto& list_view = call_data.arg3()->GetList();
+  const auto& list_view = call_data.arg3()->GetListDeprecated();
   // There is only one account in the identity manager.
   EXPECT_EQ(list_view.size(), 1u);
 
@@ -371,7 +371,7 @@
   EXPECT_TRUE(call_data.arg2()->GetBool());
   ASSERT_TRUE(call_data.arg3()->is_list());
 
-  const auto& list_view = call_data.arg3()->GetList();
+  const auto& list_view = call_data.arg3()->GetListDeprecated();
   // There is only one screencast.
   EXPECT_EQ(list_view.size(), 1u);
 
diff --git a/ash/webui/projector_app/trusted_projector_annotator_ui.cc b/ash/webui/projector_app/trusted_projector_annotator_ui.cc
index 9087937..0acd45b 100644
--- a/ash/webui/projector_app/trusted_projector_annotator_ui.cc
+++ b/ash/webui/projector_app/trusted_projector_annotator_ui.cc
@@ -4,9 +4,9 @@
 
 #include "ash/webui/projector_app/trusted_projector_annotator_ui.h"
 
-#include "ash/grit/ash_projector_app_trusted_resources.h"
-#include "ash/grit/ash_projector_app_trusted_resources_map.h"
 #include "ash/public/cpp/projector/projector_annotator_controller.h"
+#include "ash/webui/grit/ash_projector_app_trusted_resources.h"
+#include "ash/webui/grit/ash_projector_app_trusted_resources_map.h"
 #include "ash/webui/projector_app/annotator_message_handler.h"
 #include "ash/webui/projector_app/projector_message_handler.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
diff --git a/ash/webui/projector_app/trusted_projector_ui.cc b/ash/webui/projector_app/trusted_projector_ui.cc
index 65caf0e..db000f9 100644
--- a/ash/webui/projector_app/trusted_projector_ui.cc
+++ b/ash/webui/projector_app/trusted_projector_ui.cc
@@ -4,9 +4,9 @@
 
 #include "ash/webui/projector_app/trusted_projector_ui.h"
 
-#include "ash/grit/ash_projector_app_trusted_resources.h"
-#include "ash/grit/ash_projector_app_trusted_resources_map.h"
 #include "ash/public/cpp/projector/projector_annotator_controller.h"
+#include "ash/webui/grit/ash_projector_app_trusted_resources.h"
+#include "ash/webui/grit/ash_projector_app_trusted_resources_map.h"
 #include "ash/webui/projector_app/annotator_message_handler.h"
 #include "ash/webui/projector_app/projector_message_handler.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
diff --git a/ash/webui/projector_app/untrusted_projector_annotator_ui.cc b/ash/webui/projector_app/untrusted_projector_annotator_ui.cc
index e085976..bdfc967 100644
--- a/ash/webui/projector_app/untrusted_projector_annotator_ui.cc
+++ b/ash/webui/projector_app/untrusted_projector_annotator_ui.cc
@@ -4,8 +4,8 @@
 
 #include "ash/webui/projector_app/untrusted_projector_annotator_ui.h"
 
-#include "ash/grit/ash_projector_app_untrusted_resources.h"
-#include "ash/grit/ash_projector_app_untrusted_resources_map.h"
+#include "ash/webui/grit/ash_projector_app_untrusted_resources.h"
+#include "ash/webui/grit/ash_projector_app_untrusted_resources_map.h"
 #include "ash/webui/media_app_ui/buildflags.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
 #include "chromeos/grit/chromeos_projector_app_bundle_resources.h"
diff --git a/ash/webui/projector_app/untrusted_projector_ui.cc b/ash/webui/projector_app/untrusted_projector_ui.cc
index 383bd99d..bd2f0ff 100644
--- a/ash/webui/projector_app/untrusted_projector_ui.cc
+++ b/ash/webui/projector_app/untrusted_projector_ui.cc
@@ -4,8 +4,8 @@
 
 #include "ash/webui/projector_app/untrusted_projector_ui.h"
 
-#include "ash/grit/ash_projector_app_untrusted_resources.h"
-#include "ash/grit/ash_projector_app_untrusted_resources_map.h"
+#include "ash/webui/grit/ash_projector_app_untrusted_resources.h"
+#include "ash/webui/grit/ash_projector_app_untrusted_resources_map.h"
 #include "ash/webui/media_app_ui/buildflags.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
 #include "chromeos/grit/chromeos_projector_app_bundle_resources.h"
diff --git a/ash/webui/resources/BUILD.gn b/ash/webui/resources/BUILD.gn
index 493de55..6e3ad667 100644
--- a/ash/webui/resources/BUILD.gn
+++ b/ash/webui/resources/BUILD.gn
@@ -10,6 +10,8 @@
 
 assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //ash")
 
+ash_webui_grit_output_dir = "$root_gen_dir/ash/webui"
+
 # Convenience template for WebUIs using generate_grd.
 # TODO(calamity): Further deduplicate with non-generated grit targets.
 template("ash_generated_grit") {
@@ -22,13 +24,14 @@
 
     # These arguments are needed since the grd is generated at build time.
     enable_input_discovery_for_gn_analyze = false
+
     outputs = [
-      "ash_$target_name.pak",
-      "grit/ash_$target_name.h",
+      "ash_${target_name}.pak",
+      "grit/ash_${target_name}.h",
       "grit/ash_${target_name}_map.cc",
       "grit/ash_${target_name}_map.h",
     ]
-    output_dir = "$root_gen_dir/ash"
+    output_dir = "$ash_webui_grit_output_dir"
   }
 }
 
@@ -133,7 +136,7 @@
     "grit/ash_scanning_app_resources_map.h",
   ]
 
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 }
 
 grit("diagnostics_app_resources") {
@@ -151,7 +154,7 @@
     "grit/ash_diagnostics_app_resources_map.h",
   ]
 
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 }
 
 # Resources used by chrome://help-app, and parts of the sandboxed app it hosts
@@ -165,7 +168,7 @@
     "grit/ash_help_app_resources_map.h",
     "ash_help_app_resources.pak",
   ]
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 
   deps = [
     "//ash/webui/help_app_ui:mojo_bindings_js",
@@ -228,7 +231,7 @@
     "grit/ash_media_app_resources.h",
     "ash_media_app_resources.pak",
   ]
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 
   use_brotli = true
 
@@ -279,7 +282,7 @@
     "ash_print_management_resources.pak",
   ]
 
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 }
 
 # Resources used by chrome-untrusted://projector SWA.
@@ -341,7 +344,7 @@
     "grit/ash_eche_bundle_resources_map.h",
     "ash_eche_bundle_resources.pak",
   ]
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 }
 
 # Resources used by chrome://connectivity-diagnostics
@@ -361,7 +364,7 @@
     "grit/connectivity_diagnostics_resources_map.h",
   ]
 
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 }
 
 grit("multidevice_debug_resources") {
@@ -375,5 +378,5 @@
     "ash_multidevice_debug_resources.pak",
   ]
 
-  output_dir = "$root_gen_dir/ash"
+  output_dir = "$ash_webui_grit_output_dir"
 }
diff --git a/ash/webui/sample_system_web_app_ui/DEPS b/ash/webui/sample_system_web_app_ui/DEPS
index 1da0510b..52336fd4 100644
--- a/ash/webui/sample_system_web_app_ui/DEPS
+++ b/ash/webui/sample_system_web_app_ui/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
   # Do not add chrome here (use a delegate instead).
-  "+ash/grit/ash_sample_system_web_app_resources.h",
   "+ui/webui",
 ]
diff --git a/ash/webui/sample_system_web_app_ui/sample_system_web_app_ui.cc b/ash/webui/sample_system_web_app_ui/sample_system_web_app_ui.cc
index 57bbd8f6..64724f25 100644
--- a/ash/webui/sample_system_web_app_ui/sample_system_web_app_ui.cc
+++ b/ash/webui/sample_system_web_app_ui/sample_system_web_app_ui.cc
@@ -6,8 +6,8 @@
 
 #include <utility>
 
-#include "ash/grit/ash_sample_system_web_app_resources.h"
-#include "ash/grit/ash_sample_system_web_app_resources_map.h"
+#include "ash/webui/grit/ash_sample_system_web_app_resources.h"
+#include "ash/webui/grit/ash_sample_system_web_app_resources_map.h"
 #include "ash/webui/sample_system_web_app_ui/sample_page_handler.h"
 #include "ash/webui/sample_system_web_app_ui/url_constants.h"
 #include "base/memory/ptr_util.h"
diff --git a/ash/webui/sample_system_web_app_ui/untrusted_sample_system_web_app_ui.cc b/ash/webui/sample_system_web_app_ui/untrusted_sample_system_web_app_ui.cc
index 6463c35..54c913e 100644
--- a/ash/webui/sample_system_web_app_ui/untrusted_sample_system_web_app_ui.cc
+++ b/ash/webui/sample_system_web_app_ui/untrusted_sample_system_web_app_ui.cc
@@ -4,7 +4,7 @@
 
 #include "ash/webui/sample_system_web_app_ui/untrusted_sample_system_web_app_ui.h"
 
-#include "ash/grit/ash_sample_system_web_app_untrusted_resources_map.h"
+#include "ash/webui/grit/ash_sample_system_web_app_untrusted_resources_map.h"
 #include "ash/webui/sample_system_web_app_ui/sample_system_web_app_ui.h"
 #include "ash/webui/sample_system_web_app_ui/url_constants.h"
 #include "content/public/browser/web_contents.h"
diff --git a/ash/webui/scanning/DEPS b/ash/webui/scanning/DEPS
index f911907..fd995e3 100644
--- a/ash/webui/scanning/DEPS
+++ b/ash/webui/scanning/DEPS
@@ -1,6 +1,4 @@
 include_rules = [
-  "+ash/grit/ash_scanning_app_resources.h",
-  "+ash/grit/ash_scanning_app_resources_map.h",
   "+chromeos/strings/grit/chromeos_strings.h",
   "+ui/base",
   "+ui/gfx",
diff --git a/ash/webui/scanning/scanning_handler.cc b/ash/webui/scanning/scanning_handler.cc
index aab2e9a..6082ffe1 100644
--- a/ash/webui/scanning/scanning_handler.cc
+++ b/ash/webui/scanning/scanning_handler.cc
@@ -124,7 +124,7 @@
 }
 
 void ScanningHandler::HandleInitialize(const base::ListValue* args) {
-  DCHECK(args && args->GetList().empty());
+  DCHECK(args && args->GetListDeprecated().empty());
   AllowJavascript();
 }
 
@@ -132,9 +132,10 @@
   if (!IsJavascriptAllowed())
     return;
 
-  CHECK_EQ(1U, args->GetList().size());
-  DCHECK(args->GetList()[0].is_list());
-  const base::Value::ConstListView& value_list = args->GetList()[0].GetList();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  DCHECK(args->GetListDeprecated()[0].is_list());
+  const base::Value::ConstListView& value_list =
+      args->GetListDeprecated()[0].GetList();
   DCHECK(!value_list.empty());
 
   std::vector<base::FilePath> file_paths;
@@ -146,8 +147,8 @@
 }
 
 void ScanningHandler::HandleRequestScanToLocation(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  scan_location_callback_id_ = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  scan_location_callback_id_ = args->GetListDeprecated()[0].GetString();
 
   content::WebContents* web_contents = web_ui()->GetWebContents();
   gfx::NativeWindow owning_window =
@@ -168,9 +169,9 @@
   if (!IsJavascriptAllowed())
     return;
 
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string callback = args->GetList()[0].GetString();
-  const base::FilePath file_location(args->GetList()[1].GetString());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string callback = args->GetListDeprecated()[0].GetString();
+  const base::FilePath file_location(args->GetListDeprecated()[1].GetString());
   scanning_app_delegate_->ShowFileInFilesApp(
       file_location,
       base::BindOnce(&ScanningHandler::OnShowFileInLocation,
@@ -187,10 +188,10 @@
   if (!IsJavascriptAllowed())
     return;
 
-  CHECK_EQ(3U, args->GetList().size());
-  const std::string callback = args->GetList()[0].GetString();
-  const std::string name = args->GetList()[1].GetString();
-  const int count = args->GetList()[2].GetInt();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  const std::string callback = args->GetListDeprecated()[0].GetString();
+  const std::string name = args->GetListDeprecated()[1].GetString();
+  const int count = args->GetListDeprecated()[2].GetInt();
 
   const std::u16string localized_string = l10n_util::GetPluralStringFUTF16(
       string_id_map_.find(name)->second, count);
@@ -202,8 +203,8 @@
   if (!IsJavascriptAllowed())
     return;
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback = args->GetListDeprecated()[0].GetString();
 
   const base::FilePath my_files_path = scanning_app_delegate_->GetMyFilesPath();
   ResolveJavascriptCallback(base::Value(callback),
@@ -214,8 +215,8 @@
   if (!IsJavascriptAllowed())
     return;
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& scan_settings = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& scan_settings = args->GetListDeprecated()[0].GetString();
   scanning_app_delegate_->SaveScanSettingsToPrefs(scan_settings);
 }
 
@@ -223,8 +224,8 @@
   if (!IsJavascriptAllowed())
     return;
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback = args->GetListDeprecated()[0].GetString();
 
   ResolveJavascriptCallback(
       base::Value(callback),
@@ -235,9 +236,9 @@
   if (!IsJavascriptAllowed())
     return;
 
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string callback = args->GetList()[0].GetString();
-  const base::FilePath file_path(args->GetList()[1].GetString());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string callback = args->GetListDeprecated()[0].GetString();
+  const base::FilePath file_path(args->GetListDeprecated()[1].GetString());
 
   task_runner_->PostTaskAndReplyWithResult(
       FROM_HERE, base::BindOnce(&base::PathExists, file_path),
diff --git a/ash/webui/scanning/scanning_metrics_handler.cc b/ash/webui/scanning/scanning_metrics_handler.cc
index 737b9a52..5fda05b2 100644
--- a/ash/webui/scanning/scanning_metrics_handler.cc
+++ b/ash/webui/scanning/scanning_metrics_handler.cc
@@ -57,27 +57,27 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   base::UmaHistogramCounts100("Scanning.NumScanSettingChanges",
-                              args->GetList()[0].GetInt());
+                              args->GetListDeprecated()[0].GetInt());
 }
 
 void ScanningMetricsHandler::HandleRecordScanCompleteAction(
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  base::UmaHistogramEnumeration(
-      "Scanning.ScanCompleteAction",
-      static_cast<scanning::ScanCompleteAction>(args->GetList()[0].GetInt()));
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  base::UmaHistogramEnumeration("Scanning.ScanCompleteAction",
+                                static_cast<scanning::ScanCompleteAction>(
+                                    args->GetListDeprecated()[0].GetInt()));
 }
 
 void ScanningMetricsHandler::HandleRecordScanJobSettings(
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& scan_job_settings = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& scan_job_settings = args->GetListDeprecated()[0];
   CHECK(scan_job_settings.is_dict());
 
   base::UmaHistogramEnumeration(
@@ -109,9 +109,9 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   base::UmaHistogramCounts100("Scanning.NumCompletedScansInSession",
-                              args->GetList()[0].GetInt());
+                              args->GetListDeprecated()[0].GetInt());
 }
 
 }  // namespace ash
diff --git a/ash/webui/scanning/scanning_ui.cc b/ash/webui/scanning/scanning_ui.cc
index db759663..486cc33 100644
--- a/ash/webui/scanning/scanning_ui.cc
+++ b/ash/webui/scanning/scanning_ui.cc
@@ -9,10 +9,10 @@
 #include <utility>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_scanning_app_resources.h"
-#include "ash/grit/ash_scanning_app_resources_map.h"
 #include "ash/webui/common/backend/accessibility_features.h"
 #include "ash/webui/common/mojom/accessibility_features.mojom.h"
+#include "ash/webui/grit/ash_scanning_app_resources.h"
+#include "ash/webui/grit/ash_scanning_app_resources_map.h"
 #include "ash/webui/scanning/mojom/scanning.mojom.h"
 #include "ash/webui/scanning/scanning_app_delegate.h"
 #include "ash/webui/scanning/scanning_metrics_handler.h"
diff --git a/ash/webui/shimless_rma/DEPS b/ash/webui/shimless_rma/DEPS
index cdebd9908..c72c12ae 100644
--- a/ash/webui/shimless_rma/DEPS
+++ b/ash/webui/shimless_rma/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+ash/grit/ash_shimless_rma_resources.h",
   "+chromeos/dbus",
   "+chromeos/dbus/power",
   "+chromeos/dbus/rmad",
diff --git a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.html b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.html
index 17f28ef..3465a111 100644
--- a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.html
+++ b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.html
@@ -19,10 +19,6 @@
     color: red;
   }
 
-  #rsuCodeLengthLabel {
-    float: right;
-  }
-
   #inputContainer {
     width: 275px;
   }
@@ -40,13 +36,11 @@
       <span inner-h-t-m-l="[[rsuInstructionsText_]]"></span>
     </div>
     <div id="inputContainer">
-      <div id="inputValidationLabel">
-        [[i18n('rsuCodeLabelText')]]
-        <span id="rsuCodeLengthLabel">[[rsuCodeLengthLabel_]]</span>
-      </div>
+      <div id="inputValidationLabel">[[i18n('rsuCodeLabelText')]]</div>
       <cr-input
           id="rsuCode"
           value="{{rsuCode_}}"
+          maxlength="[[rsuCodeExpectedLength_]]"
           pattern="[[rsuCodeValidationRegex_]]"
           invalid="{{rsuCodeInvalid_}}"
           auto-validate
@@ -68,4 +62,4 @@
       [[i18n('rsuChallengeDialogDoneButtonLabel')]]
     </cr-button>
   </div>
-</cr-dialog>
\ No newline at end of file
+</cr-dialog>
diff --git a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js
index 73bbb84..b5c3fb6 100644
--- a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js
@@ -21,6 +21,9 @@
 // Styling for filled tiles in the QR code.
 const QR_CODE_FILL_STYLE = '#000000';
 
+// The number of characters in an RSU code.
+const RSU_CODE_EXPECTED_LENGTH = 8;
+
 /**
  * @fileoverview
  * 'onboarding-enter-rsu-wp-disable-code-page' asks the user for the RSU disable
@@ -80,6 +83,13 @@
       },
 
       /** @protected */
+      rsuCodeExpectedLength_: {
+        type: Number,
+        value: RSU_CODE_EXPECTED_LENGTH,
+        readOnly: true,
+      },
+
+      /** @protected */
       rsuInstructionsText_: {
         type: String,
         value: '',
@@ -105,12 +115,6 @@
         value: false,
         reflectToAttribute: true,
       },
-
-      /** @protected */
-      rsuCodeLengthLabel_: {
-        type: String,
-        computed: 'computeRsuCodeLengthLabel_(rsuCode_)',
-      },
     };
   }
 
@@ -171,7 +175,7 @@
    * @private
    */
   rsuCodeIsPlausible_() {
-    return !!this.rsuCode_ && this.rsuCode_.length == 8;
+    return !!this.rsuCode_ && this.rsuCode_.length === RSU_CODE_EXPECTED_LENGTH;
   }
 
   /**
@@ -232,14 +236,6 @@
   closeDialog_() {
     this.shadowRoot.querySelector('#rsuChallengeDialog').close();
   }
-
-  /**
-   * @return {string}
-   * @private
-   */
-  computeRsuCodeLengthLabel_() {
-    return this.rsuCode_.length + '/8';
-  }
 }
 
 customElements.define(
diff --git a/ash/webui/shimless_rma/shimless_rma.cc b/ash/webui/shimless_rma/shimless_rma.cc
index 39e6e763..e61cfa48 100644
--- a/ash/webui/shimless_rma/shimless_rma.cc
+++ b/ash/webui/shimless_rma/shimless_rma.cc
@@ -8,9 +8,9 @@
 #include <string>
 #include <utility>
 
-#include "ash/grit/ash_shimless_rma_resources.h"
-#include "ash/grit/ash_shimless_rma_resources_map.h"
 #include "ash/public/cpp/network_config_service.h"
+#include "ash/webui/grit/ash_shimless_rma_resources.h"
+#include "ash/webui/grit/ash_shimless_rma_resources_map.h"
 #include "ash/webui/shimless_rma/backend/shimless_rma_delegate.h"
 #include "ash/webui/shimless_rma/url_constants.h"
 #include "base/containers/span.h"
diff --git a/ash/webui/shortcut_customization_ui/DEPS b/ash/webui/shortcut_customization_ui/DEPS
index 4ff4187..93138d4 100644
--- a/ash/webui/shortcut_customization_ui/DEPS
+++ b/ash/webui/shortcut_customization_ui/DEPS
@@ -1,6 +1,4 @@
 include_rules = [
-  "+ash/grit/ash_shortcut_customization_app_resources.h",
-  "+ash/grit/ash_shortcut_customization_app_resources_map.h",
   "+ui/resources",
   "+ui/webui",
 ]
diff --git a/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc b/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc
index b38294b..66c04a2 100644
--- a/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc
+++ b/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc
@@ -7,8 +7,8 @@
 #include <memory>
 #include <utility>
 
-#include "ash/grit/ash_shortcut_customization_app_resources.h"
-#include "ash/grit/ash_shortcut_customization_app_resources_map.h"
+#include "ash/webui/grit/ash_shortcut_customization_app_resources.h"
+#include "ash/webui/grit/ash_shortcut_customization_app_resources_map.h"
 #include "ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.h"
 #include "ash/webui/shortcut_customization_ui/mojom/shortcut_customization.mojom.h"
 #include "ash/webui/shortcut_customization_ui/url_constants.h"
diff --git a/ash/webui/system_extensions_internals_ui/DEPS b/ash/webui/system_extensions_internals_ui/DEPS
index e1a02ef..4244eece 100644
--- a/ash/webui/system_extensions_internals_ui/DEPS
+++ b/ash/webui/system_extensions_internals_ui/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
   # Do not add chrome here. Use a delegate instead.
-  "+ash/grit/ash_system_extensions_internals_resources.h",
   "+ui/webui",
 ]
diff --git a/ash/webui/system_extensions_internals_ui/system_extensions_internals_ui.cc b/ash/webui/system_extensions_internals_ui/system_extensions_internals_ui.cc
index 69458872..0b6a2a1 100644
--- a/ash/webui/system_extensions_internals_ui/system_extensions_internals_ui.cc
+++ b/ash/webui/system_extensions_internals_ui/system_extensions_internals_ui.cc
@@ -4,8 +4,8 @@
 
 #include "ash/webui/system_extensions_internals_ui/system_extensions_internals_ui.h"
 
-#include "ash/grit/ash_system_extensions_internals_resources.h"
-#include "ash/grit/ash_system_extensions_internals_resources_map.h"
+#include "ash/webui/grit/ash_system_extensions_internals_resources.h"
+#include "ash/webui/grit/ash_system_extensions_internals_resources_map.h"
 #include "ash/webui/system_extensions_internals_ui/url_constants.h"
 #include "base/memory/ptr_util.h"
 #include "content/public/browser/web_contents.h"
diff --git a/ash/webui/telemetry_extension_ui/DEPS b/ash/webui/telemetry_extension_ui/DEPS
index e16f58c..f396279 100644
--- a/ash/webui/telemetry_extension_ui/DEPS
+++ b/ash/webui/telemetry_extension_ui/DEPS
@@ -1,6 +1,5 @@
 include_rules = [
   # Do not add chrome here (use a delegate instead).
-  "+ash/grit/ash_telemetry_extension_resources.h",
   "+chrome/browser/ash/wilco_dtc_supportd/mojo_utils.h",
 
   # TODO(https://crbug.com/1164001): Remove when these moves to ash.
diff --git a/ash/wm/desks/desks_bar_view.cc b/ash/wm/desks/desks_bar_view.cc
index 32105ca..b25739c6 100644
--- a/ash/wm/desks/desks_bar_view.cc
+++ b/ash/wm/desks/desks_bar_view.cc
@@ -393,7 +393,8 @@
   scroll_view_contents_->SetLayoutManager(
       std::make_unique<DesksBarScrollViewLayout>(this));
 
-  gradient_layer_delegate_ = std::make_unique<GradientLayerDelegate>();
+  gradient_layer_delegate_ =
+      std::make_unique<GradientLayerDelegate>(/*animate_in=*/false);
   scroll_view_->layer()->SetMaskLayer(gradient_layer_delegate_->layer());
 
   on_contents_scrolled_subscription_ =
diff --git a/ash/wm/desks/desks_restore_util.cc b/ash/wm/desks/desks_restore_util.cc
index ce6ad4e..0066131 100644
--- a/ash/wm/desks/desks_restore_util.cc
+++ b/ash/wm/desks/desks_restore_util.cc
@@ -150,7 +150,7 @@
       primary_user_prefs->GetList(prefs::kDesksMetricsList);
 
   // First create the same number of desks.
-  const size_t restore_size = desks_names->GetList().size();
+  const size_t restore_size = desks_names->GetListDeprecated().size();
 
   // If we don't have any restore data, or the list is corrupt for some reason,
   // abort.
@@ -161,9 +161,10 @@
   while (desks_controller->desks().size() < restore_size)
     desks_controller->NewDesk(DesksCreationRemovalSource::kDesksRestore);
 
-  const auto& desks_names_list = desks_names->GetList();
-  const auto& desks_metrics_list = desks_metrics->GetList();
-  const size_t desks_metrics_list_size = desks_metrics->GetList().size();
+  const auto& desks_names_list = desks_names->GetListDeprecated();
+  const auto& desks_metrics_list = desks_metrics->GetListDeprecated();
+  const size_t desks_metrics_list_size =
+      desks_metrics->GetListDeprecated().size();
   const auto now = base::Time::Now();
   for (size_t index = 0; index < restore_size; ++index) {
     const std::string& desk_name = desks_names_list[index].GetString();
@@ -274,7 +275,7 @@
                                : std::string());
   }
 
-  DCHECK_EQ(name_pref_data->GetList().size(), desks.size());
+  DCHECK_EQ(name_pref_data->GetListDeprecated().size(), desks.size());
 
   if (IsNowInValidTimePeriod() &&
       !primary_user_prefs->GetBoolean(kUserHasUsedDesksRecently)) {
@@ -311,7 +312,7 @@
     metrics_pref_data->Append(std::move(metrics_dict));
   }
 
-  DCHECK_EQ(metrics_pref_data->GetList().size(), desks.size());
+  DCHECK_EQ(metrics_pref_data->GetListDeprecated().size(), desks.size());
 
   // Save weekly active report time.
   DictionaryPrefUpdate weekly_active_desks_update(
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc
index 2186181..262f2b9 100644
--- a/ash/wm/desks/desks_unittests.cc
+++ b/ash/wm/desks/desks_unittests.cc
@@ -1983,10 +1983,11 @@
                             const std::vector<std::string>& desks_names) {
   const base::Value* desks_restore_names =
       user_prefs->GetList(prefs::kDesksNamesList);
-  ASSERT_EQ(desks_names.size(), desks_restore_names->GetList().size());
+  ASSERT_EQ(desks_names.size(),
+            desks_restore_names->GetListDeprecated().size());
 
   size_t index = 0;
-  for (const auto& value : desks_restore_names->GetList())
+  for (const auto& value : desks_restore_names->GetListDeprecated())
     EXPECT_EQ(desks_names[index++], value.GetString());
 }
 
@@ -3246,7 +3247,7 @@
     DCHECK(prefs);
     ListPrefUpdate update(prefs, prefs::kDesksNamesList);
     base::Value* pref_data = update.Get();
-    ASSERT_TRUE(pref_data->GetList().empty());
+    ASSERT_TRUE(pref_data->GetListDeprecated().empty());
     for (auto desk_name : desk_names)
       pref_data->Append(desk_name);
   }
diff --git a/ash/wm/desks/persistent_desks_bar_context_menu.cc b/ash/wm/desks/persistent_desks_bar_context_menu.cc
index 204ebaa..06e537c7 100644
--- a/ash/wm/desks/persistent_desks_bar_context_menu.cc
+++ b/ash/wm/desks/persistent_desks_bar_context_menu.cc
@@ -25,7 +25,7 @@
     views::View* source,
     const gfx::Point& point,
     ui::MenuSourceType source_type) {
-  const int run_types = views::MenuRunner::USE_TOUCHABLE_LAYOUT |
+  const int run_types = views::MenuRunner::USE_ASH_SYS_UI_LAYOUT |
                         views::MenuRunner::CONTEXT_MENU |
                         views::MenuRunner::FIXED_ANCHOR;
 
diff --git a/ash/wm/desks/templates/desks_templates_animations.cc b/ash/wm/desks/templates/desks_templates_animations.cc
index 31955450..ba0b91c0 100644
--- a/ash/wm/desks/templates/desks_templates_animations.cc
+++ b/ash/wm/desks/templates/desks_templates_animations.cc
@@ -53,12 +53,23 @@
 
 }  // namespace
 
-void PerformFadeInLayer(ui::Layer* layer) {
+void PerformFadeInLayer(ui::Layer* layer, bool animate) {
+  if (!animate) {
+    layer->SetOpacity(1.f);
+    return;
+  }
+
   FadeInLayer(layer, kFadeInDurationMs);
 }
 
 void PerformFadeOutLayer(ui::Layer* layer,
+                         bool animate,
                          base::OnceClosure on_animation_ended_callback) {
+  if (!animate) {
+    layer->SetOpacity(0.f);
+    return;
+  }
+
   FadeOutLayer(layer, std::move(on_animation_ended_callback),
                kFadeOutDurationMs);
 }
diff --git a/ash/wm/desks/templates/desks_templates_animations.h b/ash/wm/desks/templates/desks_templates_animations.h
index 4f543d3..8bfada70 100644
--- a/ash/wm/desks/templates/desks_templates_animations.h
+++ b/ash/wm/desks/templates/desks_templates_animations.h
@@ -14,14 +14,15 @@
 
 namespace ash {
 
-// Animates the desks templates grid when it is shown, fading out current
-// overview items and widgets, and fading in the grid.
-void PerformFadeInLayer(ui::Layer* layer);
+// Immediately shows `layer` if `animate` is false. Does a linear fade in of
+// `layer` if `animate` is true.
+void PerformFadeInLayer(ui::Layer* layer, bool animate);
 
-// Animates linear fade out of overview items.
-void PerformFadeOutLayer(
-    ui::Layer* layer,
-    base::OnceClosure on_animation_ended_callback = base::DoNothing());
+// Immediately hides `layer` if `animate` is false. Does a linear fade out of
+// `layer` if `animate` is true.
+void PerformFadeOutLayer(ui::Layer* layer,
+                         bool animate,
+                         base::OnceClosure on_animation_ended_callback);
 
 }  // namespace ash
 
diff --git a/ash/wm/desks/templates/desks_templates_item_view.cc b/ash/wm/desks/templates/desks_templates_item_view.cc
index 03c44c8e..19b378b 100644
--- a/ash/wm/desks/templates/desks_templates_item_view.cc
+++ b/ash/wm/desks/templates/desks_templates_item_view.cc
@@ -26,9 +26,11 @@
 #include "ash/wm/overview/overview_grid.h"
 #include "ash/wm/overview/overview_highlight_controller.h"
 #include "ash/wm/overview/overview_session.h"
+#include "base/i18n/time_formatting.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/ui/vector_icons/vector_icons.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/base/l10n/time_format.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/gfx/geometry/insets.h"
 #include "ui/gfx/paint_vector_icon.h"
@@ -69,24 +71,30 @@
 constexpr int kManagedStatusIndicatorSpacing = 8;
 constexpr int kManagedStatusIndicatorSize = 20;
 
-constexpr char kAmPmTimeDateFmtStr[] = "%d:%02d%s, %d-%02d-%02d";
-
-// TODO(crbug.com/1268922): This is a placeholder text format. Update this once
-// specs are done.
 std::u16string GetTimeStr(base::Time timestamp) {
-  base::Time::Exploded exploded_time;
-  timestamp.LocalExplode(&exploded_time);
+  std::u16string date, time, time_str;
 
-  const int noon = 12;
-  int hour = exploded_time.hour % noon;
-  if (hour == 0)
-    hour += noon;
+  // Returns empty if `timestamp` is out of relative date range, which is
+  // yesterday and today as of now. Please see `ui/base/l10n/time_format.h` for
+  // more details.
+  date = ui::TimeFormat::RelativeDate(timestamp, NULL);
+  if (date.empty()) {
+    // Syntax `yMMMdjmm` is used by the File App if it's not a relative date.
+    // Please note, this might be slightly different for different locales.
+    // Examples:
+    //  `en-US` - `Jan 1, 2022, 10:30 AM`
+    //  `zh-CN` - `2022年1月1日 10:30`
+    time_str = base::TimeFormatWithPattern(timestamp, "yMMMdjmm");
+  } else {
+    // If it's a relative date, just append `jmm` to it.
+    // Please note, this might be slightly different for different locales.
+    // Examples:
+    //  `en-US` - `Today 10:30 AM`
+    //  `zh-CN` - `今天 10:30`
+    time_str = date + u" " + base::TimeFormatWithPattern(timestamp, "jmm");
+  }
 
-  std::string time = base::StringPrintf(
-      kAmPmTimeDateFmtStr, hour, exploded_time.minute,
-      (exploded_time.hour >= noon ? "pm" : "am"), exploded_time.year,
-      exploded_time.month, exploded_time.day_of_month);
-  return base::UTF8ToUTF16(time);
+  return time_str;
 }
 
 }  // namespace
@@ -574,7 +582,9 @@
   name_view_->SetAccessibleName(new_name);
   SetAccessibleName(new_name);
 
-  Layout();
+  // This will trigger `name_view_` to compute its new preferred bounds and
+  // invalidate the layout for `this`.
+  name_view_->OnContentsChanged();
 }
 
 views::View* DesksTemplatesItemView::GetView() {
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc
index a514be0..35b7273 100644
--- a/ash/wm/desks/templates/desks_templates_unittest.cc
+++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -1756,6 +1756,7 @@
   EXPECT_EQ(base::UTF8ToUTF16(template_name), name_view->GetText());
 
   // Empty text fields will also revert back to the original name.
+  ClickOnView(name_view);
   SendKey(ui::VKEY_A, ui::EF_CONTROL_DOWN);
   SendKey(ui::VKEY_BACK);
   SendKey(ui::VKEY_RETURN);
@@ -2243,7 +2244,7 @@
 
   // Delete one of the templates which will iterate the histogram's second
   // bucket.
-  DeleteTemplate(GetAllEntries()[0]->uuid(), /*expected_item_count=*/3);
+  DeleteTemplate(GetAllEntries()[0]->uuid(), /*expected_current_item_count=*/3);
 
   histogram_tester.ExpectBucketCount(kUserTemplateCountHistogramName, 1, 1);
   histogram_tester.ExpectBucketCount(kUserTemplateCountHistogramName, 2, 2);
@@ -2335,7 +2336,7 @@
 
 // Tests that windows have their opacity reset after being hidden and then going
 // to a different desk. Regression test for https://crbug.com/1292174.
-TEST_F(DesksTemplatesTest, WindowOpacityResetAfterViewing) {
+TEST_F(DesksTemplatesTest, WindowOpacityResetAfterImmediateExit) {
   AddEntry(base::GUID::GenerateRandomV4(), "template", base::Time::Now());
 
   // Create and a new desk, and create a couple of test windows on the active
@@ -2368,6 +2369,53 @@
   EXPECT_EQ(1.f, test_window3->layer()->opacity());
 }
 
+// Tests that windows have their opacity reset after being hidden and then
+// leaving overview. Regression test for https://crbug.com/1292773.
+TEST_F(DesksTemplatesTest, WindowOpacityResetAfterLeavingOverview) {
+  const base::GUID uuid = base::GUID::GenerateRandomV4();
+  AddEntry(uuid, "template", base::Time::Now());
+
+  // Create and a new desk, and create a couple of test windows on the active
+  // desk.
+  DesksController* desks_controller = DesksController::Get();
+  desks_controller->NewDesk(DesksCreationRemovalSource::kKeyboard);
+  auto test_window1 = CreateAppWindow();
+  auto test_window2 = CreateAppWindow();
+  ASSERT_EQ(0, desks_controller->GetActiveDeskIndex());
+  ASSERT_TRUE(desks_controller->BelongsToActiveDesk(test_window1.get()));
+  ASSERT_TRUE(desks_controller->BelongsToActiveDesk(test_window2.get()));
+  ASSERT_EQ(2u, desks_controller->desks().size());
+
+  OpenOverviewAndShowTemplatesGrid();
+
+  // The windows are hidden to show the templates grid.
+  ASSERT_EQ(0.f, test_window1->layer()->opacity());
+  ASSERT_EQ(0.f, test_window2->layer()->opacity());
+
+  // The bug did not repro with zero duration as the animation callback to
+  // reshow the windows would happen immediately.
+  ui::ScopedAnimationDurationScaleMode animation(
+      ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
+
+  // Launch a new desk.
+  ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0));
+  WaitForDesksTemplatesUI();
+
+  views::Widget* desks_templates_grid_widget =
+      GetOverviewGridList()[0]->desks_templates_grid_widget();
+  desks_templates_grid_widget->GetLayer()->GetAnimator()->StopAnimating();
+  ASSERT_FALSE(desks_templates_grid_widget->IsVisible());
+  ASSERT_EQ(3u, desks_controller->desks().size());
+
+  // Tests that after exiting overview, the windows have their opacities
+  // restored.
+  ToggleOverview();
+  WaitForOverviewExitAnimation();
+  ASSERT_FALSE(InOverviewSession());
+  EXPECT_EQ(1.f, test_window1->layer()->opacity());
+  EXPECT_EQ(1.f, test_window2->layer()->opacity());
+}
+
 // Tests that the desks templates name view can accept touch events and get
 // focused. Regression test for https://crbug.com/1291769.
 TEST_F(DesksTemplatesTest, TouchForNameView) {
@@ -2385,4 +2433,92 @@
   EXPECT_TRUE(name_view->HasFocus());
 }
 
+// Tests that the desks templates use the right time string format. It's
+// expected to align with the File App. More details can be found at:
+// https://crbug.com/1268922.
+TEST_F(DesksTemplatesTest, TimeStrFormat) {
+  // Uses `01-01-2022 10:30 AM`, `Today 10:30 AM`, `Yesterday 10:30 AM`, and
+  // ``Tomorrow 10:30 AM`` for test.
+  base::Time time_long_ago, time_today, time_yesterday;
+
+  // 01-01-2022 10:30 AM.
+  base::Time::Exploded exploded_long_ago = {
+      /*year=*/2022,
+      /*month=*/1,
+      /*day_of_week=*/6,
+      /*day_of_month=*/1,
+      /*hour=*/10,
+      /*minute=*/30,
+      /*second=*/0,
+      /*millisecond=*/0,
+  };
+  ASSERT_TRUE(base::Time::FromLocalExploded(exploded_long_ago, &time_long_ago));
+
+  // Today 10:30 AM.
+  base::Time::Exploded exploded_today;
+  base::Time::Now().LocalExplode(&exploded_today);
+  exploded_today.hour = 10;
+  exploded_today.minute = 30;
+  exploded_today.second = 0;
+  exploded_today.millisecond = 0;
+  ASSERT_TRUE(base::Time::FromLocalExploded(exploded_today, &time_today));
+
+  // Yesterday 10:30 AM.
+  base::Time::Exploded exploded_yesterday;
+  (base::Time::Now() - base::Days(1)).LocalExplode(&exploded_yesterday);
+  exploded_yesterday.hour = 10;
+  exploded_yesterday.minute = 30;
+  exploded_yesterday.second = 0;
+  exploded_yesterday.millisecond = 0;
+  ASSERT_TRUE(
+      base::Time::FromLocalExploded(exploded_yesterday, &time_yesterday));
+
+  const std::vector<base::GUID> uuid = {
+      base::GUID::GenerateRandomV4(),
+      base::GUID::GenerateRandomV4(),
+      base::GUID::GenerateRandomV4(),
+  };
+  const std::vector<std::string> name = {
+      "template_1",
+      "template_2",
+      "template_3",
+  };
+  // The expected time string for each template.
+  const std::vector<std::u16string> expected_timestr = {
+      u"Jan 1, 2022, 10:30 AM",
+      u"Today 10:30 AM",
+      u"Yesterday 10:30 AM",
+  };
+  std::vector<base::Time> time = {
+      time_long_ago,
+      time_today,
+      time_yesterday,
+  };
+
+  for (size_t i = 0; i < 3; i++)
+    AddEntry(uuid[i], name[i], time[i]);
+
+  OpenOverviewAndShowTemplatesGrid();
+
+  // Tests that each template comes with an expected time string format.
+  std::vector<DesksTemplatesItemView*> grid_items =
+      static_cast<DesksTemplatesGridView*>(GetOverviewGridList()
+                                               .front()
+                                               ->desks_templates_grid_widget()
+                                               ->GetContentsView())
+          ->grid_items();
+  for (size_t i = 0; i < 3; i++) {
+    auto iter = std::find_if(grid_items.cbegin(), grid_items.cend(),
+                             [uuid, i](const DesksTemplatesItemView* v) {
+                               return DesksTemplatesItemViewTestApi(v).uuid() ==
+                                      uuid[i];
+                             });
+    ASSERT_NE(grid_items.end(), iter);
+
+    DesksTemplatesItemView* item_view = *iter;
+    EXPECT_EQ(expected_timestr[i],
+              DesksTemplatesItemViewTestApi(item_view).time_view()->GetText());
+  }
+}
+
 }  // namespace ash
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index 16283cd5..e367d87 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -757,6 +757,7 @@
 
 void OverviewGrid::RemoveAllItemsForDesksTemplatesLaunch() {
   for (auto& item : window_list_) {
+    item->RevertHideForDesksTemplatesGrid(/*animate=*/false);
     item->RestoreWindow(/*reset_tranform=*/true,
                         /*was_desks_templates_grid_showing=*/true);
   }
@@ -1723,7 +1724,8 @@
   // Fade in the widget from its current opacity.
   // TODO(crbug.com/1277160): Consider adding animate flag to determine whether
   // to disable animations.
-  PerformFadeInLayer(desks_templates_grid_widget_->GetLayer());
+  PerformFadeInLayer(desks_templates_grid_widget_->GetLayer(),
+                     /*animate=*/true);
 
   UpdateSaveDeskAsTemplateButton();
 
@@ -1774,6 +1776,7 @@
   // done fade in the supporting widgets and revert the overview item hides.
   PerformFadeOutLayer(
       desks_templates_grid_widget_->GetLayer(),
+      /*animate=*/true,
       base::BindOnce(&OverviewGrid::OnDesksTemplatesGridFadedOut,
                      weak_ptr_factory_.GetWeakPtr()));
 }
@@ -1856,6 +1859,7 @@
     if (save_desk_as_template_widget_) {
       PerformFadeOutLayer(
           save_desk_as_template_widget_->GetLayer(),
+          /*animate=*/true,
           base::BindOnce(&OverviewGrid::OnSaveDeskAsTemplateButtonFadedOut,
                          weak_ptr_factory_.GetWeakPtr()));
     }
@@ -1879,7 +1883,8 @@
   // `StopAnimating()` is a no-op if there is no animation in progress.
   save_desk_as_template_widget_->GetLayer()->GetAnimator()->StopAnimating();
   save_desk_as_template_widget_->Show();
-  PerformFadeInLayer(save_desk_as_template_widget_->GetLayer());
+  PerformFadeInLayer(save_desk_as_template_widget_->GetLayer(),
+                     /*animate=*/true);
 
   // Disable the create templates button if the current number of templates has
   // reached the max or the current desk has only unsupported apps.
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index ac61421..e1123b4 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -221,17 +221,11 @@
   GetWindow()->SetProperty(kForceVisibleInMiniViewKey, true);
 
   DCHECK(item_widget_);
-  if (animate)
-    PerformFadeOutLayer(item_widget_->GetLayer());
-  else
-    item_widget_->GetLayer()->SetOpacity(0.f);
+  PerformFadeOutLayer(item_widget_->GetLayer(), animate, base::DoNothing());
 
   for (aura::Window* transient_child : GetTransientTreeIterator(GetWindow())) {
     transient_child->SetProperty(kForceVisibleInMiniViewKey, true);
-    if (animate)
-      PerformFadeOutLayer(transient_child->layer());
-    else
-      transient_child->layer()->SetOpacity(0.f);
+    PerformFadeOutLayer(transient_child->layer(), animate, base::DoNothing());
   }
 
   item_widget_event_blocker_ =
@@ -241,19 +235,12 @@
 
 void OverviewItem::RevertHideForDesksTemplatesGrid(bool animate) {
   // `item_widget_` may be null during shutdown if the window is minimized.
-  if (item_widget_) {
-    if (animate)
-      PerformFadeInLayer(item_widget_->GetLayer());
-    else
-      item_widget_->GetLayer()->SetOpacity(1.f);
-  }
+  if (item_widget_)
+    PerformFadeInLayer(item_widget_->GetLayer(), animate);
 
   for (aura::Window* transient_child :
        GetTransientTreeIterator(transform_window_.window())) {
-    if (animate)
-      PerformFadeInLayer(transient_child->layer());
-    else
-      transient_child->layer()->SetOpacity(1.f);
+    PerformFadeInLayer(transient_child->layer(), animate);
   }
 
   item_widget_event_blocker_.reset();
diff --git a/base/allocator/allocator.gni b/base/allocator/allocator.gni
index f1a1096..135ec716 100644
--- a/base/allocator/allocator.gni
+++ b/base/allocator/allocator.gni
@@ -52,18 +52,13 @@
 
   # Whether PartitionAlloc should be available for use or not.
   # true makes PartitionAlloc linked to the executable or shared library and
-  # makes it available for use, but it doesn't mean that the default allocator
-  # is PartitionAlloc.  PartitionAlloc may or may not be the default allocator.
+  # makes it available for use. It doesn't mean that the default allocator
+  # is PartitionAlloc, which is governed by |use_allocator|.
   #
-  # |use_allocator = "partition"| makes PartitionAlloc the default allocator
-  # but it's effective only when |use_partition_alloc = true|.
-  #
-  # TODO(lizeb, yukishiino): Determine if |use_partition_alloc| is necessary or
-  # not, and redesign or remove the flag accordingly.  We may want to assert a
-  # possible conflict between |use_allocator = "partition"| and
-  # |use_partition_alloc = true| rather than prioritizing use_partition_alloc.
-  # TODO(crbug.com/1250788): Enable use_partition_alloc on iOS device builds.
-  use_partition_alloc = !is_ios || target_environment == "simulator"
+  # This flag is currently set to false only on Cronet bots, because Cronet
+  # doesn't use PartitionAlloc at all, and doesn't wish to incur the library
+  # size increase (crbug.com/674570).
+  use_partition_alloc = true
 }
 
 if (!use_partition_alloc && use_allocator == "partition") {
diff --git a/base/allocator/allocator_interception_mac.mm b/base/allocator/allocator_interception_mac.mm
index eba2362..3b9ab8c 100644
--- a/base/allocator/allocator_interception_mac.mm
+++ b/base/allocator/allocator_interception_mac.mm
@@ -34,6 +34,7 @@
 #include "base/mac/mach_logging.h"
 #include "base/process/memory.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
 #include "third_party/apple_apsl/CFBase.h"
 
diff --git a/base/allocator/allocator_shim_override_libc_symbols.h b/base/allocator/allocator_shim_override_libc_symbols.h
index 3738dd9..ca4587e1 100644
--- a/base/allocator/allocator_shim_override_libc_symbols.h
+++ b/base/allocator/allocator_shim_override_libc_symbols.h
@@ -22,6 +22,15 @@
 
 extern "C" {
 
+// WARNING: Whenever a new function is added there (which, surprisingly enough,
+// happens. For instance glibc 2.33 introduced mallinfo2(), which we don't
+// support... yet?), it MUST be added to build/linux/chrome.map.
+//
+// Otherwise the new symbol is not exported from Chromium's main binary, which
+// is necessary to override libc's weak symbol, which in turn is necessary to
+// intercept calls made by dynamic libraries. See crbug.com/1292206 for such
+// an example.
+
 SHIM_ALWAYS_EXPORT void* malloc(size_t size) __THROW {
   return ShimMalloc(size, nullptr);
 }
diff --git a/base/allocator/partition_allocator/address_pool_manager_unittest.cc b/base/allocator/partition_allocator/address_pool_manager_unittest.cc
index a075400..c743acb 100644
--- a/base/allocator/partition_allocator/address_pool_manager_unittest.cc
+++ b/base/allocator/partition_allocator/address_pool_manager_unittest.cc
@@ -44,8 +44,8 @@
 
   AddressPoolManager* GetAddressPoolManager() { return manager_.get(); }
 
-  static constexpr size_t kPageCnt = 4096;
-  static constexpr size_t kPoolSize = kSuperPageSize * kPageCnt;
+  static constexpr size_t kPoolSize = kPoolMaxSize;
+  static constexpr size_t kPageCnt = kPoolSize / kSuperPageSize;
 
   std::unique_ptr<AddressPoolManagerForTesting> manager_;
   uintptr_t base_address_;
diff --git a/base/allocator/partition_allocator/page_allocator_unittest.cc b/base/allocator/partition_allocator/page_allocator_unittest.cc
index 046a609..28579e8 100644
--- a/base/allocator/partition_allocator/page_allocator_unittest.cc
+++ b/base/allocator/partition_allocator/page_allocator_unittest.cc
@@ -426,7 +426,14 @@
   FreePages(buffer, PageAllocationGranularity());
 }
 
-TEST(PartitionAllocPageAllocatorTest, ReadExecutePages) {
+// TODO(crbug.com/1291888): Understand why we can't read from Read-Execute pages
+// on iOS.
+#if BUILDFLAG(IS_IOS)
+#define MAYBE_ReadExecutePages DISABLED_ReadExecutePages
+#else
+#define MAYBE_ReadExecutePages ReadExecutePages
+#endif  // BUILDFLAG(IS_IOS)
+TEST(PartitionAllocPageAllocatorTest, MAYBE_ReadExecutePages) {
   uintptr_t buffer = AllocPages(
       PageAllocationGranularity(), PageAllocationGranularity(),
       PageAccessibilityConfiguration::kReadExecute, PageTag::kChromium);
diff --git a/base/allocator/partition_allocator/partition_address_space.h b/base/allocator/partition_allocator/partition_address_space.h
index d5a2f4f..594755e0 100644
--- a/base/allocator/partition_allocator/partition_address_space.h
+++ b/base/allocator/partition_allocator/partition_address_space.h
@@ -172,8 +172,14 @@
   // memory cage, which requires that ArrayBuffers be located inside of it.
   static constexpr size_t kRegularPoolSize = kPoolMaxSize;
   static constexpr size_t kBRPPoolSize = kPoolMaxSize;
+// TODO(crbug.com/1250788): Remove the iOS special case.
+#if BUILDFLAG(IS_IOS)
+  static constexpr size_t kConfigurablePoolMaxSize = kPoolMaxSize;
+  static constexpr size_t kConfigurablePoolMinSize = kPoolMaxSize;
+#else
   static constexpr size_t kConfigurablePoolMaxSize = kPoolMaxSize;
   static constexpr size_t kConfigurablePoolMinSize = 1 * kGiB;
+#endif
   static_assert(base::bits::IsPowerOfTwo(kRegularPoolSize) &&
                     base::bits::IsPowerOfTwo(kBRPPoolSize) &&
                     base::bits::IsPowerOfTwo(kConfigurablePoolMaxSize) &&
diff --git a/base/allocator/partition_allocator/partition_alloc_constants.h b/base/allocator/partition_allocator/partition_alloc_constants.h
index 0ece5a5..bc6c07ed 100644
--- a/base/allocator/partition_allocator/partition_alloc_constants.h
+++ b/base/allocator/partition_allocator/partition_alloc_constants.h
@@ -212,8 +212,15 @@
 #if defined(PA_HAS_64_BITS_POINTERS)
 // The Configurable Pool is only available in 64-bit mode
 constexpr size_t kNumPools = 3;
-constexpr size_t kPoolMaxSize = 8 * kGiB;
+// TODO(crbug.com/1250788): Remove the iOS special case, once larger address
+// space can be used there. This limitation isn't meant for releasing, but is ok
+// to keep for now only because nothing uses PartitionAlloc on iOS yet.
+#if BUILDFLAG(IS_IOS)
+constexpr size_t kPoolMaxSize = kGiB / 4;
 #else
+constexpr size_t kPoolMaxSize = 8 * kGiB;
+#endif
+#else  // defined(PA_HAS_64_BITS_POINTERS)
 constexpr size_t kNumPools = 2;
 constexpr size_t kPoolMaxSize = 4 * kGiB;
 #endif
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
index ec884b0..63aeed3 100644
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -925,12 +925,12 @@
 #endif
   }
 
-  // Can we allocate a massive (512MB) size?
-  // Allocate 512MB, but +1, to test for cookie writing alignment issues.
+  // Can we allocate a massive (128MB) size?
+  // Add +1, to test for cookie writing alignment issues.
   // Test this only if the device has enough memory or it might fail due
   // to OOM.
   if (IsLargeMemoryDevice()) {
-    void* ptr = allocator.root()->Alloc(512 * 1024 * 1024 + 1, type_name);
+    void* ptr = allocator.root()->Alloc(128 * 1024 * 1024 + 1, type_name);
     allocator.root()->Free(ptr);
   }
 
@@ -1045,7 +1045,7 @@
 
   // Allocate something very large, and uneven.
   if (IsLargeMemoryDevice()) {
-    requested_size = 512 * 1024 * 1024 - 1;
+    requested_size = 128 * 1024 * 1024 - 1;
     predicted_capacity =
         allocator.root()->AllocationCapacityFromRequestedSize(requested_size);
     ptr = allocator.root()->Alloc(requested_size, type_name);
@@ -3034,7 +3034,7 @@
                           kMaxBucketed + 1,
                           2 * kMaxBucketed,
                           base::kSuperPageSize - 2 * PartitionPageSize(),
-                          10 * kMaxBucketed};
+                          4 * kMaxBucketed};
   for (size_t alloc_size : alloc_sizes) {
     for (size_t alignment = 1; alignment <= kMaxSupportedAlignment;
          alignment <<= 1) {
diff --git a/base/android/java/src/org/chromium/base/IntentUtils.java b/base/android/java/src/org/chromium/base/IntentUtils.java
index 4e3fcfb5..0cd7f79 100644
--- a/base/android/java/src/org/chromium/base/IntentUtils.java
+++ b/base/android/java/src/org/chromium/base/IntentUtils.java
@@ -25,6 +25,7 @@
 import androidx.core.app.BundleCompat;
 
 import org.chromium.base.compat.ApiHelperForM;
+import org.chromium.base.compat.ApiHelperForS;
 
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -45,9 +46,6 @@
     public static final String EPHEMERAL_INSTALLER_CLASS =
             "com.google.android.gms.instantapps.routing.EphemeralInstallerActivity";
 
-    // TODO(mthiesse): Move to ApiHelperForS when it exist.
-    private static final int FLAG_MUTABLE = 1 << 25;
-
     /**
      * Intent extra used to identify the sending application.
      */
@@ -516,7 +514,7 @@
         if (!mutable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
             return ApiHelperForM.getPendingIntentImmutableFlag();
         } else if (mutable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-            return FLAG_MUTABLE;
+            return ApiHelperForS.getPendingIntentMutableFlag();
         }
         return 0;
     }
diff --git a/base/android/java/src/org/chromium/base/compat/ApiHelperForS.java b/base/android/java/src/org/chromium/base/compat/ApiHelperForS.java
index c7533c50..3892bce3 100644
--- a/base/android/java/src/org/chromium/base/compat/ApiHelperForS.java
+++ b/base/android/java/src/org/chromium/base/compat/ApiHelperForS.java
@@ -6,6 +6,7 @@
 
 import android.Manifest;
 import android.annotation.TargetApi;
+import android.app.PendingIntent;
 import android.app.PictureInPictureParams;
 import android.content.ClipData;
 import android.content.ClipDescription;
@@ -104,4 +105,11 @@
             Context context, Display display, int type, Bundle options) {
         return context.createWindowContext(display, type, options);
     }
+
+    /**
+     * See {@link PendingIntent#FLAG_MUTABLE}.
+     */
+    public static int getPendingIntentMutableFlag() {
+        return PendingIntent.FLAG_MUTABLE;
+    }
 }
diff --git a/base/android/junit/src/org/chromium/base/PromiseTest.java b/base/android/junit/src/org/chromium/base/PromiseTest.java
index ad876d67..dfefa4ccb 100644
--- a/base/android/junit/src/org/chromium/base/PromiseTest.java
+++ b/base/android/junit/src/org/chromium/base/PromiseTest.java
@@ -12,6 +12,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.Promise.UnhandledRejectionException;
@@ -20,6 +21,7 @@
 /** Unit tests for {@link Promise}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class PromiseTest {
     // We need a simple mutable reference type for testing.
     private static class Value {
diff --git a/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java b/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java
index d6f0c55..c801532 100644
--- a/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java
+++ b/base/android/junit/src/org/chromium/base/jank_tracker/JankReportingSchedulerTest.java
@@ -14,6 +14,7 @@
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadow.api.Shadow;
 import org.robolectric.shadows.ShadowLooper;
 
@@ -23,6 +24,7 @@
  *  Tests for JankReportingScheduler.
  */
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class JankReportingSchedulerTest {
     ShadowLooper mShadowLooper;
 
diff --git a/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java b/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
index d54060c9..53e6d23 100644
--- a/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
+++ b/base/android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java
@@ -33,6 +33,7 @@
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -44,6 +45,7 @@
 /** Unit tests for the ChildConnectionAllocator class. */
 @Config(manifest = Config.NONE)
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ChildConnectionAllocatorTest {
     private static final String TEST_PACKAGE_NAME = "org.chromium.allocator_test";
 
diff --git a/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java b/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
index 846e6b3..5965d5e4 100644
--- a/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
+++ b/base/android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java
@@ -36,6 +36,7 @@
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.ChildBindingState;
@@ -46,6 +47,7 @@
 /** Unit tests for ChildProcessConnection. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ChildProcessConnectionTest {
     private static class ChildServiceConnectionMock implements ChildServiceConnection {
         private final Intent mBindIntent;
diff --git a/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java b/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java
index 2e83d204..654f67f 100644
--- a/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java
+++ b/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java
@@ -14,6 +14,7 @@
 import org.mockito.MockitoAnnotations;
 import org.mockito.Spy;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowProcess;
 
 import org.chromium.base.Callback;
@@ -24,6 +25,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(shadows = {ShadowProcess.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public class OneshotSupplierImplTest {
     private OneshotSupplierImpl<String> mSupplier = new OneshotSupplierImpl<>();
 
diff --git a/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java b/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java
index cfc90ee2..44cb1c20f 100644
--- a/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java
+++ b/base/android/junit/src/org/chromium/base/task/AsyncTaskThreadTest.java
@@ -21,6 +21,7 @@
 import org.robolectric.Robolectric;
 import org.robolectric.android.util.concurrent.RoboExecutorService;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLog;
 import org.robolectric.util.Scheduler;
 
@@ -37,6 +38,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class AsyncTaskThreadTest {
     private static final String TAG = "AsyncTaskThreadTest";
     private static final boolean DEBUG = false;
diff --git a/base/android/record_user_action.cc b/base/android/record_user_action.cc
index 898a613b..6cc0a6f 100644
--- a/base/android/record_user_action.cc
+++ b/base/android/record_user_action.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/metrics/user_metrics.h"
+#include "base/time/time.h"
 
 namespace {
 struct ActionCallbackWrapper {
diff --git a/base/json/json_parser_unittest.cc b/base/json/json_parser_unittest.cc
index 8fbf0a0..68269f0 100644
--- a/base/json/json_parser_unittest.cc
+++ b/base/json/json_parser_unittest.cc
@@ -75,7 +75,7 @@
 
   ASSERT_TRUE(value);
   ASSERT_TRUE(value->is_list());
-  EXPECT_EQ(2u, value->GetList().size());
+  EXPECT_EQ(2u, value->GetListDeprecated().size());
 }
 
 TEST_F(JSONParserTest, ConsumeDictionary) {
diff --git a/base/json/json_reader_unittest.cc b/base/json/json_reader_unittest.cc
index c9fce085..b8f01ac 100644
--- a/base/json/json_reader_unittest.cc
+++ b/base/json/json_reader_unittest.cc
@@ -88,15 +88,15 @@
   root = JSONReader::Read("[1, /* comment, 2 ] */ \n 3]");
   ASSERT_TRUE(root);
   ASSERT_TRUE(root->is_list());
-  ASSERT_EQ(2u, root->GetList().size());
-  ASSERT_TRUE(root->GetList()[0].is_int());
-  EXPECT_EQ(1, root->GetList()[0].GetInt());
-  ASSERT_TRUE(root->GetList()[1].is_int());
-  EXPECT_EQ(3, root->GetList()[1].GetInt());
+  ASSERT_EQ(2u, root->GetListDeprecated().size());
+  ASSERT_TRUE(root->GetListDeprecated()[0].is_int());
+  EXPECT_EQ(1, root->GetListDeprecated()[0].GetInt());
+  ASSERT_TRUE(root->GetListDeprecated()[1].is_int());
+  EXPECT_EQ(3, root->GetListDeprecated()[1].GetInt());
   root = JSONReader::Read("[1, /*a*/2, 3]");
   ASSERT_TRUE(root);
   ASSERT_TRUE(root->is_list());
-  EXPECT_EQ(3u, root->GetList().size());
+  EXPECT_EQ(3u, root->GetListDeprecated().size());
   root = JSONReader::Read("/* comment **/42");
   ASSERT_TRUE(root);
   ASSERT_TRUE(root->is_int());
@@ -302,7 +302,7 @@
   absl::optional<Value> list = JSONReader::Read("[true, false, null]");
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  EXPECT_EQ(3U, list->GetList().size());
+  EXPECT_EQ(3U, list->GetListDeprecated().size());
 
   // Test with trailing comma.  Should be parsed the same as above.
   absl::optional<Value> root2 =
@@ -315,14 +315,14 @@
   absl::optional<Value> list = JSONReader::Read("[]");
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  EXPECT_TRUE(list->GetList().empty());
+  EXPECT_TRUE(list->GetListDeprecated().empty());
 }
 
 TEST(JSONReaderTest, CompleteArray) {
   absl::optional<Value> list = JSONReader::Read("[\"a\", 3, 4.56, null]");
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  EXPECT_EQ(4U, list->GetList().size());
+  EXPECT_EQ(4U, list->GetListDeprecated().size());
 }
 
 TEST(JSONReaderTest, NestedArrays) {
@@ -331,7 +331,7 @@
       "[null]], null]");
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  EXPECT_EQ(5U, list->GetList().size());
+  EXPECT_EQ(5U, list->GetListDeprecated().size());
 
   // Lots of trailing commas.
   absl::optional<Value> root2 = JSONReader::Read(
@@ -363,8 +363,8 @@
       JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS);
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  ASSERT_EQ(1U, list->GetList().size());
-  const Value& value1 = list->GetList()[0];
+  ASSERT_EQ(1U, list->GetListDeprecated().size());
+  const Value& value1 = list->GetListDeprecated()[0];
   ASSERT_TRUE(value1.is_bool());
   EXPECT_TRUE(value1.GetBool());
 }
@@ -449,7 +449,7 @@
   ASSERT_TRUE(inner_dict);
   const Value* inner_array = inner_dict->FindListKey("array");
   ASSERT_TRUE(inner_array);
-  EXPECT_EQ(4U, inner_array->GetList().size());
+  EXPECT_EQ(4U, inner_array->GetListDeprecated().size());
   auto bool_value = dict_val->FindBoolKey("false");
   ASSERT_TRUE(bool_value);
   EXPECT_FALSE(*bool_value);
@@ -549,7 +549,7 @@
   absl::optional<Value> list = JSONReader::Read(not_evil);
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  EXPECT_EQ(5001U, list->GetList().size());
+  EXPECT_EQ(5001U, list->GetListDeprecated().size());
 }
 
 TEST(JSONReaderTest, UTF8Input) {
@@ -750,9 +750,9 @@
     ASSERT_TRUE(dict->RemoveKey("baz"));
     ASSERT_TRUE(dict->RemoveKey("moo"));
 
-    ASSERT_EQ(2u, list->GetList().size());
-    list_value_0 = std::move(list->GetList()[0]);
-    list_value_1 = std::move(list->GetList()[1]);
+    ASSERT_EQ(2u, list->GetListDeprecated().size());
+    list_value_0 = std::move(list->GetListDeprecated()[0]);
+    list_value_1 = std::move(list->GetListDeprecated()[1]);
     list->ClearList();
   }
 
@@ -828,7 +828,7 @@
   absl::optional<Value> root = JSONReader::Read(kUtf8Data, JSON_PARSE_RFC);
   ASSERT_TRUE(root);
   ASSERT_TRUE(root->is_list());
-  Value::ListView lv = root->GetList();
+  Value::ListView lv = root->GetListDeprecated();
   ASSERT_EQ(5u, lv.size());
   ASSERT_TRUE(lv[0].is_string());
   EXPECT_EQ("\xF0\x9F\x98\x87", lv[0].GetString());
diff --git a/base/json/json_value_serializer_unittest.cc b/base/json/json_value_serializer_unittest.cc
index c028c7d0..44d6532 100644
--- a/base/json/json_value_serializer_unittest.cc
+++ b/base/json/json_value_serializer_unittest.cc
@@ -80,8 +80,8 @@
   absl::optional<Value> list = JSONReader::Read(json);
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  ASSERT_EQ(1U, list->GetList().size());
-  const Value& elt = list->GetList()[0];
+  ASSERT_EQ(1U, list->GetListDeprecated().size());
+  const Value& elt = list->GetListDeprecated()[0];
   ASSERT_TRUE(elt.is_int());
   ASSERT_EQ(1, elt.GetInt());
 }
@@ -371,8 +371,8 @@
   absl::optional<Value> list = JSONReader::Read("[\"// ok\\n /* foo */ \"]");
   ASSERT_TRUE(list);
   ASSERT_TRUE(list->is_list());
-  ASSERT_EQ(1U, list->GetList().size());
-  const Value& elt = list->GetList()[0];
+  ASSERT_EQ(1U, list->GetListDeprecated().size());
+  const Value& elt = list->GetListDeprecated()[0];
   ASSERT_TRUE(elt.is_string());
   ASSERT_EQ("// ok\n /* foo */ ", elt.GetString());
 
diff --git a/base/metrics/statistics_recorder_unittest.cc b/base/metrics/statistics_recorder_unittest.cc
index 28fcdfbe..aee27ea2 100644
--- a/base/metrics/statistics_recorder_unittest.cc
+++ b/base/metrics/statistics_recorder_unittest.cc
@@ -388,10 +388,10 @@
   const Value* histogram_list = root->FindListKey("histograms");
 
   ASSERT_TRUE(histogram_list);
-  ASSERT_EQ(2u, histogram_list->GetList().size());
+  ASSERT_EQ(2u, histogram_list->GetListDeprecated().size());
 
   // Examine the first histogram.
-  const Value& histogram_dict = histogram_list->GetList()[0];
+  const Value& histogram_dict = histogram_list->GetListDeprecated()[0];
   ASSERT_TRUE(histogram_dict.is_dict());
 
   auto sample_count = histogram_dict.FindIntKey("count");
@@ -400,7 +400,7 @@
 
   const Value* buckets_list = histogram_dict.FindListKey("buckets");
   ASSERT_TRUE(buckets_list);
-  EXPECT_EQ(2u, buckets_list->GetList().size());
+  EXPECT_EQ(2u, buckets_list->GetListDeprecated().size());
 
   // Check the serialized JSON with a different verbosity level.
   json = StatisticsRecorder::ToJSON(JSON_VERBOSITY_LEVEL_OMIT_BUCKETS);
@@ -409,8 +409,8 @@
   ASSERT_TRUE(root->is_dict());
   histogram_list = root->FindListKey("histograms");
   ASSERT_TRUE(histogram_list);
-  ASSERT_EQ(2u, histogram_list->GetList().size());
-  const Value& histogram_dict2 = histogram_list->GetList()[0];
+  ASSERT_EQ(2u, histogram_list->GetListDeprecated().size());
+  const Value& histogram_dict2 = histogram_list->GetListDeprecated()[0];
   ASSERT_TRUE(histogram_dict2.is_dict());
   sample_count = histogram_dict2.FindIntKey("count");
   ASSERT_TRUE(sample_count);
diff --git a/base/task/common/scoped_defer_task_posting.h b/base/task/common/scoped_defer_task_posting.h
index b199ac6..14f91cd 100644
--- a/base/task/common/scoped_defer_task_posting.h
+++ b/base/task/common/scoped_defer_task_posting.h
@@ -10,6 +10,7 @@
 #include "base/base_export.h"
 #include "base/location.h"
 #include "base/task/sequenced_task_runner.h"
+#include "base/time/time.h"
 
 namespace base {
 
diff --git a/base/task/sequenced_task_runner.cc b/base/task/sequenced_task_runner.cc
index 7d5392a..7502e8bb 100644
--- a/base/task/sequenced_task_runner.cc
+++ b/base/task/sequenced_task_runner.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/task/default_delayed_task_handle_delegate.h"
+#include "base/time/time.h"
 
 namespace base {
 
diff --git a/base/task/sequenced_task_runner.h b/base/task/sequenced_task_runner.h
index 6449b55..10f6d489 100644
--- a/base/task/sequenced_task_runner.h
+++ b/base/task/sequenced_task_runner.h
@@ -29,6 +29,8 @@
 class DelayTimerBase;
 }
 class DeadlineTimer;
+class TimeDelta;
+class TimeTicks;
 
 namespace subtle {
 
diff --git a/base/task/simple_task_executor.cc b/base/task/simple_task_executor.cc
index 8c979442..09b5921 100644
--- a/base/task/simple_task_executor.cc
+++ b/base/task/simple_task_executor.cc
@@ -4,6 +4,7 @@
 
 #include "base/task/simple_task_executor.h"
 
+#include "base/time/time.h"
 #include "build/build_config.h"
 
 namespace base {
diff --git a/base/task/task_runner.cc b/base/task/task_runner.cc
index d8e41fd0..655869d6 100644
--- a/base/task/task_runner.cc
+++ b/base/task/task_runner.cc
@@ -11,6 +11,7 @@
 #include "base/compiler_specific.h"
 #include "base/memory/raw_ptr.h"
 #include "base/threading/post_task_and_reply_impl.h"
+#include "base/time/time.h"
 
 namespace base {
 
diff --git a/base/task/task_runner.h b/base/task/task_runner.h
index 72e60842..8bf201ce1 100644
--- a/base/task/task_runner.h
+++ b/base/task/task_runner.h
@@ -15,11 +15,11 @@
 #include "base/location.h"
 #include "base/memory/ref_counted.h"
 #include "base/task/post_task_and_reply_with_result_internal.h"
-#include "base/time/time.h"
 
 namespace base {
 
 struct TaskRunnerTraits;
+class TimeDelta;
 
 // A TaskRunner is an object that runs posted tasks (in the form of
 // OnceClosure objects).  The TaskRunner interface provides a way of
diff --git a/base/test/gtest_util.cc b/base/test/gtest_util.cc
index 5a1e957..3ac54fc 100644
--- a/base/test/gtest_util.cc
+++ b/base/test/gtest_util.cc
@@ -84,7 +84,7 @@
     return false;
 
   std::vector<TestIdentifier> result;
-  for (const Value& item : value->GetList()) {
+  for (const Value& item : value->GetListDeprecated()) {
     if (!item.is_dict())
       return false;
 
diff --git a/base/test/launcher/test_launcher_test_utils.cc b/base/test/launcher/test_launcher_test_utils.cc
index 9ed89ce..601d99a 100644
--- a/base/test/launcher/test_launcher_test_utils.cc
+++ b/base/test/launcher/test_launcher_test_utils.cc
@@ -71,12 +71,12 @@
     ADD_FAILURE() << "Cannot find result";
     return false;
   }
-  if (1u != results->GetList().size()) {
+  if (1u != results->GetListDeprecated().size()) {
     ADD_FAILURE() << "Expected one result";
     return false;
   }
 
-  const Value& val = results->GetList()[0];
+  const Value& val = results->GetListDeprecated()[0];
   if (!val.is_dict()) {
     ADD_FAILURE() << "Value must be of type DICTIONARY";
     return false;
@@ -105,9 +105,9 @@
     return false;
   }
 
-  if (result_part_count != value->GetList().size()) {
+  if (result_part_count != value->GetListDeprecated().size()) {
     ADD_FAILURE() << "result_parts count expected: " << result_part_count
-                  << ", actual:" << value->GetList().size();
+                  << ", actual:" << value->GetListDeprecated().size();
     return false;
   }
   return true;
diff --git a/base/test/launcher/test_launcher_unittest.cc b/base/test/launcher/test_launcher_unittest.cc
index 57f3a72..15de857 100644
--- a/base/test/launcher/test_launcher_unittest.cc
+++ b/base/test/launcher/test_launcher_unittest.cc
@@ -557,12 +557,12 @@
     ADD_FAILURE() << "Results not found";
     return false;
   }
-  if (1u != results->GetList().size()) {
+  if (1u != results->GetListDeprecated().size()) {
     ADD_FAILURE() << "Expected one result, actual: "
-                  << results->GetList().size();
+                  << results->GetListDeprecated().size();
     return false;
   }
-  const Value& val = results->GetList()[0];
+  const Value& val = results->GetListDeprecated()[0];
   if (!val.is_dict()) {
     ADD_FAILURE() << "Unexpected type";
     return false;
@@ -587,14 +587,15 @@
   result &= ValidateKeyValue(val, "status", test_result.StatusAsString());
 
   const Value* value = val.FindListKey("result_parts");
-  if (test_result.test_result_parts.size() != value->GetList().size()) {
+  if (test_result.test_result_parts.size() !=
+      value->GetListDeprecated().size()) {
     ADD_FAILURE() << "test_result_parts count is not valid";
     return false;
   }
 
   for (unsigned i = 0; i < test_result.test_result_parts.size(); i++) {
     TestResultPart result_part = test_result.test_result_parts.at(i);
-    const Value& part_dict = value->GetList()[i];
+    const Value& part_dict = value->GetListDeprecated()[i];
 
     result &= ValidateKeyValue(part_dict, "type", result_part.TypeAsString());
     result &= ValidateKeyValue(part_dict, "file", result_part.file_name);
@@ -616,15 +617,15 @@
     return false;
   }
 
-  if (values.size() != val->GetList().size()) {
+  if (values.size() != val->GetListDeprecated().size()) {
     ADD_FAILURE() << "expected size: " << values.size()
-                  << ", actual size:" << val->GetList().size();
+                  << ", actual size:" << val->GetListDeprecated().size();
     return false;
   }
 
   for (unsigned i = 0; i < values.size(); i++) {
-    if (!val->GetList()[i].is_string() &&
-        val->GetList()[i].GetString().compare(values.at(i))) {
+    if (!val->GetListDeprecated()[i].is_string() &&
+        val->GetListDeprecated()[i].GetString().compare(values.at(i))) {
       ADD_FAILURE() << "Expected list values do not match actual list";
       return false;
     }
@@ -685,9 +686,9 @@
 
   val = root->FindListKey("per_iteration_data");
   ASSERT_TRUE(val);
-  ASSERT_EQ(2u, val->GetList().size());
-  for (size_t i = 0; i < val->GetList().size(); i++) {
-    const Value* iteration_val = &(val->GetList()[i]);
+  ASSERT_EQ(2u, val->GetListDeprecated().size());
+  for (size_t i = 0; i < val->GetListDeprecated().size(); i++) {
+    const Value* iteration_val = &(val->GetListDeprecated()[i]);
     ASSERT_TRUE(iteration_val);
     ASSERT_TRUE(iteration_val->is_dict());
     EXPECT_EQ(2u, iteration_val->DictSize());
@@ -728,9 +729,9 @@
 
   val = root->FindListKey("per_iteration_data");
   ASSERT_TRUE(val);
-  ASSERT_EQ(1u, val->GetList().size());
+  ASSERT_EQ(1u, val->GetListDeprecated().size());
 
-  Value* iteration_val = &(val->GetList()[0]);
+  Value* iteration_val = &(val->GetListDeprecated()[0]);
   ASSERT_TRUE(iteration_val);
   ASSERT_TRUE(iteration_val->is_dict());
   EXPECT_EQ(1u, iteration_val->DictSize());
@@ -888,9 +889,9 @@
 
   val = root->FindListKey("per_iteration_data");
   ASSERT_TRUE(val);
-  ASSERT_EQ(1u, val->GetList().size());
+  ASSERT_EQ(1u, val->GetListDeprecated().size());
 
-  Value* iteration_val = &(val->GetList()[0]);
+  Value* iteration_val = &(val->GetListDeprecated()[0]);
   ASSERT_TRUE(iteration_val);
   ASSERT_TRUE(iteration_val->is_dict());
   EXPECT_EQ(4u, iteration_val->DictSize());
diff --git a/base/test/null_task_runner.cc b/base/test/null_task_runner.cc
index dfa26fa..8a44332 100644
--- a/base/test/null_task_runner.cc
+++ b/base/test/null_task_runner.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "base/test/null_task_runner.h"
+#include "base/time/time.h"
 
 namespace base {
 
diff --git a/base/test/trace_event_analyzer.cc b/base/test/trace_event_analyzer.cc
index 0da2b68..b8034dc 100644
--- a/base/test/trace_event_analyzer.cc
+++ b/base/test/trace_event_analyzer.cc
@@ -779,13 +779,13 @@
 
   base::Value::ListView list;
   if (root->is_list()) {
-    list = root->GetList();
+    list = root->GetListDeprecated();
   } else if (root->is_dict()) {
     base::Value* trace_events = root->FindListKey("traceEvents");
     if (!trace_events)
       return false;
 
-    list = trace_events->GetList();
+    list = trace_events->GetListDeprecated();
   } else {
     return false;
   }
diff --git a/base/trace_event/memory_dump_scheduler.cc b/base/trace_event/memory_dump_scheduler.cc
index c45ea50..d1c29af 100644
--- a/base/trace_event/memory_dump_scheduler.cc
+++ b/base/trace_event/memory_dump_scheduler.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/check_op.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "base/time/time.h"
 
 namespace base {
 namespace trace_event {
diff --git a/base/trace_event/trace_config.cc b/base/trace_event/trace_config.cc
index 17760d1..0ceeea3a 100644
--- a/base/trace_event/trace_config.cc
+++ b/base/trace_event/trace_config.cc
@@ -155,7 +155,7 @@
   const Value* value = dict.FindListKey(kIncludedProcessesParam);
   if (!value)
     return;
-  for (auto& pid_value : value->GetList()) {
+  for (auto& pid_value : value->GetListDeprecated()) {
     if (pid_value.is_int())
       included_process_ids_.insert(pid_value.GetInt());
   }
@@ -230,7 +230,7 @@
   const Value* list = args_.FindListPath(key);
   if (!list)
     return false;
-  for (const Value& item : list->GetList()) {
+  for (const Value& item : list->GetListDeprecated()) {
     if (item.is_string())
       out_set->insert(item.GetString());
   }
@@ -418,7 +418,7 @@
   if (enable_systrace_) {
     const Value* systrace_events = dict.FindListKey(kSystraceEventsParam);
     if (systrace_events) {
-      for (const Value& value : systrace_events->GetList())
+      for (const Value& value : systrace_events->GetListDeprecated())
         systrace_events_.insert(value.GetString());
     }
   }
@@ -494,7 +494,7 @@
   const Value* allowed_modes_list =
       memory_dump_config.FindListKey(kAllowedDumpModesParam);
   if (allowed_modes_list) {
-    for (const Value& item : allowed_modes_list->GetList()) {
+    for (const Value& item : allowed_modes_list->GetListDeprecated()) {
       DCHECK(item.is_string());
       memory_dump_config_.allowed_dump_modes.insert(
           StringToMemoryDumpLevelOfDetail(item.GetString()));
@@ -508,7 +508,7 @@
   memory_dump_config_.triggers.clear();
   const Value* trigger_list = memory_dump_config.FindListKey(kTriggersParam);
   if (trigger_list) {
-    for (const Value& trigger : trigger_list->GetList()) {
+    for (const Value& trigger : trigger_list->GetListDeprecated()) {
       if (!trigger.is_dict())
         continue;
 
diff --git a/base/trace_event/trace_event_impl.h b/base/trace_event/trace_event_impl.h
index 2cd380f2..b830c36b81 100644
--- a/base/trace_event/trace_event_impl.h
+++ b/base/trace_event/trace_event_impl.h
@@ -17,6 +17,7 @@
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/lock.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/time/time.h"
 #include "base/threading/thread_local.h"
 #include "base/trace_event/common/trace_event_common.h"
 #include "base/trace_event/thread_instruction_count.h"
diff --git a/base/trace_event/traced_value.cc b/base/trace_event/traced_value.cc
index f9f52f5..abe32b41 100644
--- a/base/trace_event/traced_value.cc
+++ b/base/trace_event/traced_value.cc
@@ -346,7 +346,7 @@
             cur_list->Append(std::move(new_dict));
             // |new_dict| is invalidated at this point, so |cur_dict| needs to
             // be reset.
-            cur_dict = &cur_list->GetList().back();
+            cur_dict = &cur_list->GetListDeprecated().back();
             stack.push_back(cur_list);
             cur_list = nullptr;
           }
@@ -375,7 +375,7 @@
             stack.push_back(cur_list);
             // |cur_list| is invalidated at this point by the Append, so it
             // needs to be reset.
-            cur_list = &cur_list->GetList().back();
+            cur_list = &cur_list->GetListDeprecated().back();
           }
         } break;
 
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 61ceb0d..f2ec9635 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -790,9 +790,7 @@
   # This flag enforces that member pointer base types are complete. It helps
   # prevent us from running into problems in the Microsoft C++ ABI (see
   # https://crbug.com/847724).
-  # TODO(crbug/1052397): Remove is_chromeos_lacros once lacros-chrome switches
-  # to target_os="chromeos".
-  if (is_clang && !is_nacl && target_os != "chromeos" && !is_chromeos_lacros &&
+  if (is_clang && !is_nacl && target_os != "chromeos" &&
       (is_win || use_custom_libcxx)) {
     cflags += [ "-fcomplete-member-pointers" ]
   }
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 5170f17..fe9d928f 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-7.20220202.1.1
+7.20220202.3.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index 5170f17..fe9d928f 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-7.20220202.1.1
+7.20220202.3.1
diff --git a/build/linux/chrome.map b/build/linux/chrome.map
index 718796f..c84a0ca 100644
--- a/build/linux/chrome.map
+++ b/build/linux/chrome.map
@@ -22,6 +22,7 @@
 
   # Memory allocation symbols.  We want chrome and any libraries to
   # share the same heap, so it is correct to export these symbols.
+  aligned_alloc;
   calloc;
   cfree;
   free;
diff --git a/build/toolchain/cros/BUILD.gn b/build/toolchain/cros/BUILD.gn
index 9f6a83e..2dfe045 100644
--- a/build/toolchain/cros/BUILD.gn
+++ b/build/toolchain/cros/BUILD.gn
@@ -193,24 +193,25 @@
 # See build/config/chromeos/ui_mode.gni
 if (also_build_lacros_chrome_for_architecture != "") {
   cros_toolchain("lacros_clang") {
+    if (also_build_lacros_chrome_for_architecture == "amd64") {
+      lacros_args =
+          read_file("//build/args/chromeos/amd64-generic-crostoolchain.gni",
+                    "scope")
+      lacros_v8_snapshot_sysroot = "//build/linux/debian_sid_amd64-sysroot"
+    } else if (also_build_lacros_chrome_for_architecture == "arm") {
+      lacros_args =
+          read_file("//build/args/chromeos/arm-generic-crostoolchain.gni",
+                    "scope")
+      lacros_v8_snapshot_sysroot = "//build/linux/debian_sid_i386-sysroot"
+    } else {
+      assert(false,
+             "also_build_lacros_chrome_for_architecture is not " +
+                 "one of the supported architectures.")
+    }
+
     toolchain_args = {
-      if (also_build_lacros_chrome_for_architecture == "amd64") {
-        forward_variables_from(
-            read_file("//build/args/chromeos/amd64-generic-crostoolchain.gni",
-                      "scope"),
-            "*")
-        cros_v8_snapshot_sysroot = "//build/linux/debian_sid_amd64-sysroot"
-      } else if (also_build_lacros_chrome_for_architecture == "arm") {
-        forward_variables_from(
-            read_file("//build/args/chromeos/arm-generic-crostoolchain.gni",
-                      "scope"),
-            "*")
-        cros_v8_snapshot_sysroot = "//build/linux/debian_sid_i386-sysroot"
-      } else {
-        assert(false,
-               "also_build_lacros_chrome_for_architecture is not " +
-                   "one of the supported architecture.")
-      }
+      forward_variables_from(lacros_args, "*")
+      cros_v8_snapshot_sysroot = lacros_v8_snapshot_sysroot
       current_os = "chromeos"
       target_os = "chromeos"
       current_cpu = current_cpu
@@ -221,21 +222,23 @@
     }
     if (!lacros_use_chromium_toolchain) {
       # These are args for the template.
-      ar = cros_target_ar
-      cc = cros_target_cc
-      cxx = cros_target_cxx
-      ld = cros_target_ld
+      ar = lacros_args.cros_target_ar
+      cc = lacros_args.cros_target_cc
+      cxx = lacros_args.cros_target_cxx
+      ld = lacros_args.cros_target_ld
 
-      if (cros_target_nm != "") {
-        nm = cros_target_nm
+      if (defined(lacros_args.cros_target_nm) &&
+          lacros_args.cros_target_nm != "") {
+        nm = lacros_args.cros_target_nm
       }
-      if (cros_target_readelf != "") {
-        readelf = cros_target_readelf
+      if (defined(lacros_args.cros_target_readelf) &&
+          lacros_args.cros_target_readelf != "") {
+        readelf = lacros_args.cros_target_readelf
       }
-      extra_cflags = cros_target_extra_cflags
-      extra_cppflags = cros_target_extra_cppflags
-      extra_cxxflags = cros_target_extra_cxxflags
-      extra_ldflags = cros_target_extra_ldflags
+      extra_cflags = lacros_args.cros_target_extra_cflags
+      extra_cppflags = lacros_args.cros_target_extra_cppflags
+      extra_cxxflags = lacros_args.cros_target_extra_cxxflags
+      extra_ldflags = lacros_args.cros_target_extra_ldflags
 
       toolchain_args.needs_gomacc_path_arg = true
     }
diff --git a/cc/animation/animation_host_perftest.cc b/cc/animation/animation_host_perftest.cc
index 537a645..36726b2 100644
--- a/cc/animation/animation_host_perftest.cc
+++ b/cc/animation/animation_host_perftest.cc
@@ -120,7 +120,7 @@
   }
 
   void DoTest(const std::string& test_name) {
-    PropertyTrees property_trees;
+    PropertyTrees property_trees(*host());
     timer_.Reset();
     do {
       // Invalidate dirty flags.
diff --git a/cc/animation/animation_host_unittest.cc b/cc/animation/animation_host_unittest.cc
index 6b7f9d5..9b352fd 100644
--- a/cc/animation/animation_host_unittest.cc
+++ b/cc/animation/animation_host_unittest.cc
@@ -314,7 +314,7 @@
   client_impl_.RegisterElementId(element_id, ElementListType::ACTIVE);
   host_impl_->AddAnimationTimeline(timeline_);
 
-  PropertyTrees property_trees;
+  PropertyTrees property_trees(*host_impl_);
   property_trees.set_is_main_thread(false);
   property_trees.set_is_active(true);
   CreateScrollingNodeForElement(element_id, &property_trees);
@@ -372,7 +372,7 @@
   client_.RegisterElementId(element_id_, ElementListType::ACTIVE);
   client_impl_.RegisterElementId(element_id_, ElementListType::PENDING);
   client_impl_.RegisterElementId(element_id_, ElementListType::ACTIVE);
-  PropertyTrees property_trees;
+  PropertyTrees property_trees(*host_impl_);
   property_trees.set_is_main_thread(false);
   property_trees.set_is_active(true);
   CreateScrollingNodeForElement(element_id_, &property_trees);
@@ -439,7 +439,7 @@
   client_impl_.RegisterElementId(element_id_, ElementListType::ACTIVE);
   host_impl_->AddAnimationTimeline(timeline_);
 
-  PropertyTrees property_trees;
+  PropertyTrees property_trees(*host_impl_);
   property_trees.set_is_main_thread(false);
   property_trees.set_is_active(true);
   CreateScrollingNodeForElement(element_id_, &property_trees);
diff --git a/cc/animation/scroll_timeline_unittest.cc b/cc/animation/scroll_timeline_unittest.cc
index 2aa5fbb..6d66c54 100644
--- a/cc/animation/scroll_timeline_unittest.cc
+++ b/cc/animation/scroll_timeline_unittest.cc
@@ -84,10 +84,14 @@
 
 }  // namespace
 
-class ScrollTimelineTest : public ::testing::Test {
+class ScrollTimelineTest : public ::testing::Test,
+                           public ProtectedSequenceSynchronizer {
  public:
   ScrollTimelineTest()
-      : scroller_id_(1), container_size_(100, 100), content_size_(500, 500) {
+      : property_trees_(*this),
+        scroller_id_(1),
+        container_size_(100, 100),
+        content_size_(500, 500) {
     // For simplicity we make the property_tree main thread; this avoids the
     // need to deal with the synced scroll offset code.
     property_trees_.set_is_main_thread(true);
@@ -106,6 +110,11 @@
   gfx::Size container_size() const { return container_size_; }
   gfx::Size content_size() const { return content_size_; }
 
+  // ProtectedSequenceSynchronizer implementation
+  bool IsOwnerThread() const override { return true; }
+  bool InProtectedSequence() const override { return false; }
+  void WaitForProtectedSequenceCompletion() const override {}
+
  private:
   PropertyTrees property_trees_;
   ElementId scroller_id_;
@@ -257,8 +266,8 @@
 // had a few crashes caused by assuming that the id would be available in the
 // active tree before the activation happened; see http://crbug.com/853231
 TEST_F(ScrollTimelineTest, ActiveTimeIsSetOnlyAfterPromotion) {
-  PropertyTrees pending_tree;
-  PropertyTrees active_tree;
+  PropertyTrees pending_tree(*this);
+  PropertyTrees active_tree(*this);
 
   pending_tree.set_is_active(false);
   active_tree.set_is_active(true);
diff --git a/cc/base/math_util.cc b/cc/base/math_util.cc
index c4a9048a8..53852a30 100644
--- a/cc/base/math_util.cc
+++ b/cc/base/math_util.cc
@@ -828,7 +828,7 @@
   if (!raw_value->is_list())
     return false;
 
-  base::Value::ConstListView list_view = raw_value->GetList();
+  base::Value::ConstListView list_view = raw_value->GetListDeprecated();
 
   if (list_view.size() != 4)
     return false;
diff --git a/cc/benchmarks/micro_benchmark_controller_unittest.cc b/cc/benchmarks/micro_benchmark_controller_unittest.cc
index f0d0f5ef..e65da20 100644
--- a/cc/benchmarks/micro_benchmark_controller_unittest.cc
+++ b/cc/benchmarks/micro_benchmark_controller_unittest.cc
@@ -37,7 +37,8 @@
         &layer_tree_host_client_, &task_graph_runner_, animation_host_.get());
     layer_tree_host_->SetRootLayer(Layer::Create());
     layer_tree_host_->InitializeForTesting(
-        TaskRunnerProvider::Create(nullptr, nullptr),
+        TaskRunnerProvider::Create(base::ThreadTaskRunnerHandle::Get(),
+                                   nullptr),
         std::unique_ptr<Proxy>(new FakeProxy));
   }
 
diff --git a/cc/input/browser_controls_offset_manager_unittest.cc b/cc/input/browser_controls_offset_manager_unittest.cc
index ce295d2..7e82d144 100644
--- a/cc/input/browser_controls_offset_manager_unittest.cc
+++ b/cc/input/browser_controls_offset_manager_unittest.cc
@@ -38,7 +38,7 @@
         browser_controls_show_threshold_(browser_controls_show_threshold),
         browser_controls_hide_threshold_(browser_controls_hide_threshold) {
     active_tree_ = std::make_unique<LayerTreeImpl>(
-        &host_impl_, new SyncedScale, new SyncedBrowserControls,
+        host_impl_, new SyncedScale, new SyncedBrowserControls,
         new SyncedBrowserControls, new SyncedElasticOverscroll);
     root_scroll_layer_ = LayerImpl::Create(active_tree_.get(), 1);
   }
diff --git a/cc/paint/display_item_list_unittest.cc b/cc/paint/display_item_list_unittest.cc
index 7cd50e3..d198ccf 100644
--- a/cc/paint/display_item_list_unittest.cc
+++ b/cc/paint/display_item_list_unittest.cc
@@ -74,13 +74,13 @@
   }
 };
 
-#define EXPECT_TRACED_RECT(x, y, width, height, rect_list)    \
-  do {                                                        \
-    ASSERT_EQ(4u, rect_list->GetList().size());               \
-    EXPECT_EQ(x, rect_list->GetList()[0].GetIfDouble());      \
-    EXPECT_EQ(y, rect_list->GetList()[1].GetIfDouble());      \
-    EXPECT_EQ(width, rect_list->GetList()[2].GetIfDouble());  \
-    EXPECT_EQ(height, rect_list->GetList()[3].GetIfDouble()); \
+#define EXPECT_TRACED_RECT(x, y, width, height, rect_list)              \
+  do {                                                                  \
+    ASSERT_EQ(4u, rect_list->GetListDeprecated().size());               \
+    EXPECT_EQ(x, rect_list->GetListDeprecated()[0].GetIfDouble());      \
+    EXPECT_EQ(y, rect_list->GetListDeprecated()[1].GetIfDouble());      \
+    EXPECT_EQ(width, rect_list->GetListDeprecated()[2].GetIfDouble());  \
+    EXPECT_EQ(height, rect_list->GetListDeprecated()[3].GetIfDouble()); \
   } while (false)
 
 // AddToValue should not crash if there are different numbers of visual_rect
@@ -111,14 +111,14 @@
   ASSERT_TRUE(root_dict->GetDictionary("params", &params_dict));
   const base::ListValue* items;
   ASSERT_TRUE(params_dict->GetList("items", &items));
-  ASSERT_EQ(2u, items->GetList().size());
+  ASSERT_EQ(2u, items->GetListDeprecated().size());
 
   const base::Value* item_value;
   const base::DictionaryValue* item_dict;
   const base::ListValue* visual_rect;
   std::string name;
 
-  item_value = &items->GetList()[0];
+  item_value = &items->GetListDeprecated()[0];
   ASSERT_TRUE(item_value->is_dict());
   item_dict = &base::Value::AsDictionaryValue(*item_value);
   ASSERT_TRUE(item_dict->GetList("visual_rect", &visual_rect));
@@ -126,7 +126,7 @@
   EXPECT_TRUE(item_dict->GetString("name", &name));
   EXPECT_EQ("DrawRect", name);
 
-  item_value = &items->GetList()[1];
+  item_value = &items->GetListDeprecated()[1];
   ASSERT_TRUE(item_value->is_dict());
   item_dict = &base::Value::AsDictionaryValue(*item_value);
   ASSERT_TRUE(item_dict->GetList("visual_rect", &visual_rect));
@@ -476,7 +476,7 @@
 
       // The items list is there but empty.
       ASSERT_TRUE(params_dict->GetList("items", &params_list));
-      EXPECT_EQ(0u, params_list->GetList().size());
+      EXPECT_EQ(0u, params_list->GetListDeprecated().size());
     }
   }
 
@@ -558,7 +558,7 @@
       // The items list has 3 things in it since we built 3 visual rects.
       const base::ListValue* items;
       ASSERT_TRUE(params_dict->GetList("items", &items));
-      ASSERT_EQ(7u, items->GetList().size());
+      ASSERT_EQ(7u, items->GetListDeprecated().size());
 
       const char* expected_names[] = {"Save",      "Concat",   "SaveLayer",
                                       "Translate", "DrawRect", "Restore",
@@ -566,7 +566,7 @@
       bool expected_has_skp[] = {false, true, true, true, true, false, false};
 
       for (int i = 0; i < 7; ++i) {
-        const base::Value& item_value = items->GetList()[i];
+        const base::Value& item_value = items->GetListDeprecated()[i];
         ASSERT_TRUE(item_value.is_dict());
         const base::DictionaryValue& item_dict =
             base::Value::AsDictionaryValue(item_value);
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc
index 5e9ee99..c8f088ab 100644
--- a/cc/paint/oop_pixeltest.cc
+++ b/cc/paint/oop_pixeltest.cc
@@ -80,7 +80,26 @@
   return bitmap;
 }
 
+// Creates a SkImage filled with magenta and a 30x40 green rectangle.
+sk_sp<SkImage> MakeSkImage(const gfx::Size& size,
+                           sk_sp<SkColorSpace> color_space = nullptr) {
+  SkBitmap bitmap;
+  bitmap.allocPixelsFlags(
+      SkImageInfo::MakeN32Premul(size.width(), size.height(), color_space),
+      SkBitmap::kZeroPixels_AllocFlag);
+
+  SkCanvas canvas(bitmap, SkSurfaceProps{});
+  canvas.drawColor(SK_ColorMAGENTA);
+  SkPaint green;
+  green.setColor(SK_ColorGREEN);
+  canvas.drawRect(SkRect::MakeXYWH(10, 20, 30, 40), green);
+
+  return SkImage::MakeFromBitmap(bitmap);
+}
+
 constexpr size_t kCacheLimitBytes = 1024 * 1024;
+constexpr PaintFlags::FilterQuality kDefaultFilterQuality =
+    PaintFlags::FilterQuality::kNone;
 
 class OopPixelTest : public testing::Test,
                      public gpu::raster::GrShaderCache::Client {
@@ -321,13 +340,6 @@
 
   SkBitmap RasterExpectedBitmap(
       scoped_refptr<DisplayItemList> display_item_list,
-      const gfx::Size& playback_size) {
-    RasterOptions options(playback_size);
-    return RasterExpectedBitmap(display_item_list, options);
-  }
-
-  SkBitmap RasterExpectedBitmap(
-      scoped_refptr<DisplayItemList> display_item_list,
       const RasterOptions& options) {
     viz::TestInProcessContextProvider::ScopedRasterContextLock lock(
         gles2_context_provider_.get());
@@ -423,7 +435,7 @@
   }
 
  protected:
-  enum { kWorkingSetSize = 64 * 1024 * 1024 };
+  static constexpr size_t kWorkingSetSize = 64 * 1024 * 1024;
   scoped_refptr<viz::TestInProcessContextProvider> raster_context_provider_;
   scoped_refptr<viz::TestInProcessContextProvider> gles2_context_provider_;
   std::unique_ptr<GpuImageDecodeCache> gpu_image_cache_;
@@ -435,21 +447,6 @@
   gpu::GpuProcessActivityFlags activity_flags_;
 };
 
-class OopImagePixelTest : public OopPixelTest,
-                          public ::testing::WithParamInterface<bool> {
- public:
-  bool UseTooLargeImage() { return GetParam(); }
-  PaintFlags::FilterQuality FilterQuality() {
-    return PaintFlags::FilterQuality::kNone;
-  }
-
-  gfx::Size GetImageSize() {
-    const int kMaxSize = 20000;
-    DCHECK_GT(kMaxSize, gles2_context_provider_->GrContext()->maxTextureSize());
-    return UseTooLargeImage() ? gfx::Size(10, kMaxSize) : gfx::Size(10, 10);
-  }
-};
-
 class OopClearPixelTest : public OopPixelTest,
                           public ::testing::WithParamInterface<bool> {
  public:
@@ -578,25 +575,10 @@
   ExpectEquals(actual, expected);
 }
 
-TEST_P(OopImagePixelTest, DrawImage) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
+TEST_F(OopPixelTest, DrawImage) {
+  constexpr gfx::Rect rect(100, 100);
 
-  gfx::Rect rect(10, 10);
-  gfx::Size image_size = GetImageSize();
-
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()),
-      SkBitmap::kZeroPixels_AllocFlag);
-
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size());
   const PaintImage::Id kSomeId = 32;
   auto builder =
       PaintImageBuilder::WithDefault().set_image(image, 0).set_id(kSomeId);
@@ -605,7 +587,7 @@
   auto display_item_list = base::MakeRefCounted<DisplayItemList>();
   display_item_list->StartPaint();
   SkSamplingOptions sampling(
-      PaintFlags::FilterQualityToSkSamplingOptions(FilterQuality()));
+      PaintFlags::FilterQualityToSkSamplingOptions(kDefaultFilterQuality));
 
   display_item_list->push<DrawImageOp>(paint_image, 0.f, 0.f, sampling,
                                        nullptr);
@@ -616,25 +598,10 @@
   ExpectEquals(actual, FILE_PATH_LITERAL("oop_draw_image.png"));
 }
 
-TEST_P(OopImagePixelTest, DrawImageScaled) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
+TEST_F(OopPixelTest, DrawImageScaled) {
+  constexpr gfx::Rect rect(100, 100);
 
-  gfx::Rect rect(10, 10);
-  gfx::Size image_size = GetImageSize();
-
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()),
-      SkBitmap::kZeroPixels_AllocFlag);
-
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size());
   auto builder = PaintImageBuilder::WithDefault().set_image(image, 0).set_id(
       PaintImage::GetNextId());
   auto paint_image = builder.TakePaintImage();
@@ -643,36 +610,20 @@
   display_item_list->StartPaint();
   display_item_list->push<ScaleOp>(0.5f, 0.5f);
   SkSamplingOptions sampling(
-      PaintFlags::FilterQualityToSkSamplingOptions(FilterQuality()));
+      PaintFlags::FilterQualityToSkSamplingOptions(kDefaultFilterQuality));
   display_item_list->push<DrawImageOp>(paint_image, 0.f, 0.f, sampling,
                                        nullptr);
   display_item_list->EndPaintOfUnpaired(rect);
   display_item_list->Finalize();
 
   auto actual = Raster(display_item_list, rect.size());
-  auto expected = RasterExpectedBitmap(display_item_list, rect.size());
-  ExpectEquals(actual, expected);
+  ExpectEquals(actual, FILE_PATH_LITERAL("oop_draw_image_scaled.png"));
 }
 
-TEST_P(OopImagePixelTest, DrawImageShaderScaled) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
+TEST_F(OopPixelTest, DrawImageShaderScaled) {
+  constexpr gfx::Rect rect(100, 100);
 
-  gfx::Rect rect(10, 10);
-  gfx::Size image_size = GetImageSize();
-
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()),
-      SkBitmap::kZeroPixels_AllocFlag);
-
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size());
   auto builder = PaintImageBuilder::WithDefault().set_image(image, 0).set_id(
       PaintImage::GetNextId());
   auto paint_image = builder.TakePaintImage();
@@ -684,41 +635,25 @@
   display_item_list->push<ScaleOp>(0.5f, 0.5f);
   PaintFlags flags;
   flags.setShader(paint_image_shader);
-  flags.setFilterQuality(FilterQuality());
+  flags.setFilterQuality(kDefaultFilterQuality);
   display_item_list->push<DrawRectOp>(gfx::RectToSkRect(rect), flags);
   display_item_list->EndPaintOfUnpaired(rect);
   display_item_list->Finalize();
 
   auto actual = Raster(display_item_list, rect.size());
-  auto expected = RasterExpectedBitmap(display_item_list, rect.size());
-  ExpectEquals(actual, expected);
+  ExpectEquals(actual, FILE_PATH_LITERAL("oop_draw_image_shader_scaled.png"));
 }
 
-TEST_P(OopImagePixelTest, DrawRecordShaderWithImageScaled) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
+TEST_F(OopPixelTest, DrawRecordShaderWithImageScaled) {
+  constexpr gfx::Rect rect(100, 100);
 
-  gfx::Rect rect(10, 10);
-  gfx::Size image_size = GetImageSize();
-
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()),
-      SkBitmap::kZeroPixels_AllocFlag);
-
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size());
   auto builder = PaintImageBuilder::WithDefault().set_image(image, 0).set_id(
       PaintImage::GetNextId());
   auto paint_image = builder.TakePaintImage();
   auto paint_record = sk_make_sp<PaintOpBuffer>();
   SkSamplingOptions sampling(
-      PaintFlags::FilterQualityToSkSamplingOptions(FilterQuality()));
+      PaintFlags::FilterQualityToSkSamplingOptions(kDefaultFilterQuality));
   paint_record->push<DrawImageOp>(paint_image, 0.f, 0.f, sampling, nullptr);
   auto paint_record_shader = PaintShader::MakePaintRecord(
       paint_record, gfx::RectToSkRect(rect), SkTileMode::kRepeat,
@@ -729,21 +664,16 @@
   display_item_list->push<ScaleOp>(0.5f, 0.5f);
   PaintFlags raster_flags;
   raster_flags.setShader(paint_record_shader);
-  raster_flags.setFilterQuality(FilterQuality());
+  raster_flags.setFilterQuality(kDefaultFilterQuality);
   display_item_list->push<DrawRectOp>(gfx::RectToSkRect(rect), raster_flags);
   display_item_list->EndPaintOfUnpaired(rect);
   display_item_list->Finalize();
 
   auto actual = Raster(display_item_list, rect.size());
-  // Set the shader has animated images so gpu also goes through cc's image
-  // upload stack, instead of using skia.
-  RasterOptions expected_options(rect.size());
-  expected_options.shader_with_animated_images = paint_record_shader.get();
-  auto expected = RasterExpectedBitmap(display_item_list, expected_options);
-  ExpectEquals(actual, expected);
+  ExpectEquals(actual, FILE_PATH_LITERAL("oop_draw_record_shader.png"));
 }
 
-TEST_F(OopImagePixelTest, DrawRecordShaderTranslatedTileRect) {
+TEST_F(OopPixelTest, DrawRecordShaderTranslatedTileRect) {
   auto paint_record = sk_make_sp<PaintOpBuffer>();
 
   // Arbitrary offsets.  The DrawRectOp inside the PaintShader draws
@@ -786,29 +716,13 @@
   display_item_list->Finalize();
 
   auto actual = Raster(display_item_list, output_size);
-  auto expected = RasterExpectedBitmap(display_item_list, output_size);
-  ExpectEquals(actual, expected);
+  ExpectEquals(actual, FILE_PATH_LITERAL("oop_draw_record_shader_tiled.png"));
 }
 
-TEST_P(OopImagePixelTest, DrawImageWithTargetColorSpace) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
+TEST_F(OopPixelTest, DrawImageWithTargetColorSpace) {
+  constexpr gfx::Rect rect(100, 100);
 
-  gfx::Rect rect(10, 10);
-  gfx::Size image_size = GetImageSize();
-
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()),
-      SkBitmap::kZeroPixels_AllocFlag);
-
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size());
   const PaintImage::Id kSomeId = 32;
   auto builder =
       PaintImageBuilder::WithDefault().set_image(image, 0).set_id(kSomeId);
@@ -817,7 +731,7 @@
   auto display_item_list = base::MakeRefCounted<DisplayItemList>();
   display_item_list->StartPaint();
   SkSamplingOptions sampling(
-      PaintFlags::FilterQualityToSkSamplingOptions(FilterQuality()));
+      PaintFlags::FilterQualityToSkSamplingOptions(kDefaultFilterQuality));
   display_item_list->push<DrawImageOp>(paint_image, 0.f, 0.f, sampling,
                                        nullptr);
   display_item_list->EndPaintOfUnpaired(rect);
@@ -827,34 +741,27 @@
   options.color_space = gfx::ColorSpace::CreateDisplayP3D65();
 
   auto actual = Raster(display_item_list, options);
-  auto expected = RasterExpectedBitmap(display_item_list, options);
-  ExpectEquals(actual, expected);
+
+#if BUILDFLAG(IS_ANDROID)
+  // Android has slight differences in color.
+  FuzzyPixelOffByOneComparator comparator(/*discard_alpha=*/false);
+#else
+  ExactPixelComparator comparator(/*discard_alpha=*/false);
+#endif
+
+  ExpectEquals(actual, FILE_PATH_LITERAL("oop_image_target_color_space.png"),
+               comparator);
 
   // Verify some conversion occurred here and that actual != bitmap.
   EXPECT_NE(actual.getColor(0, 0), SK_ColorMAGENTA);
 }
 
-TEST_P(OopImagePixelTest, DrawImageWithSourceColorSpace) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
-
-  gfx::Rect rect(10, 10);
-  gfx::Size image_size = GetImageSize();
+TEST_F(OopPixelTest, DrawImageWithSourceColorSpace) {
+  constexpr gfx::Rect rect(100, 100);
 
   auto color_space = gfx::ColorSpace::CreateDisplayP3D65().ToSkColorSpace();
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height(),
-                                 color_space),
-      SkBitmap::kZeroPixels_AllocFlag);
 
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size(), color_space);
   const PaintImage::Id kSomeId = 32;
   auto builder =
       PaintImageBuilder::WithDefault().set_image(image, 0).set_id(kSomeId);
@@ -864,7 +771,7 @@
   auto display_item_list = base::MakeRefCounted<DisplayItemList>();
   display_item_list->StartPaint();
   SkSamplingOptions sampling(
-      PaintFlags::FilterQualityToSkSamplingOptions(FilterQuality()));
+      PaintFlags::FilterQualityToSkSamplingOptions(kDefaultFilterQuality));
   display_item_list->push<DrawImageOp>(paint_image, 0.f, 0.f, sampling,
                                        nullptr);
   display_item_list->EndPaintOfUnpaired(rect);
@@ -873,34 +780,25 @@
   RasterOptions options(rect.size());
 
   auto actual = Raster(display_item_list, options);
-  auto expected = RasterExpectedBitmap(display_item_list, options);
-  ExpectEquals(actual, expected);
 
-  // Colors get converted when being drawn to the bitmap.
-  EXPECT_NE(bitmap.getColor(0, 0), SK_ColorMAGENTA);
+#if BUILDFLAG(IS_ANDROID)
+  // Android has slight differences in color.
+  FuzzyPixelOffByOneComparator comparator(/*discard_alpha=*/false);
+#else
+  ExactPixelComparator comparator(/*discard_alpha=*/false);
+#endif
+
+  ExpectEquals(actual,
+               FILE_PATH_LITERAL("oop_draw_image_source_color_space.png"),
+               comparator);
 }
 
-TEST_P(OopImagePixelTest, DrawImageWithSourceAndTargetColorSpace) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
+TEST_F(OopPixelTest, DrawImageWithSourceAndTargetColorSpace) {
+  constexpr gfx::Rect rect(100, 100);
 
-  gfx::Rect rect(10, 10);
-
-  gfx::Size image_size = GetImageSize();
   auto color_space = gfx::ColorSpace::CreateXYZD50().ToSkColorSpace();
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height(),
-                                 color_space),
-      SkBitmap::kZeroPixels_AllocFlag);
 
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size(), color_space);
   const PaintImage::Id kSomeId = 32;
   auto builder =
       PaintImageBuilder::WithDefault().set_image(image, 0).set_id(kSomeId);
@@ -910,7 +808,7 @@
   auto display_item_list = base::MakeRefCounted<DisplayItemList>();
   display_item_list->StartPaint();
   SkSamplingOptions sampling(
-      PaintFlags::FilterQualityToSkSamplingOptions(FilterQuality()));
+      PaintFlags::FilterQualityToSkSamplingOptions(kDefaultFilterQuality));
   display_item_list->push<DrawImageOp>(paint_image, 0.f, 0.f, sampling,
                                        nullptr);
   display_item_list->EndPaintOfUnpaired(rect);
@@ -920,29 +818,22 @@
   options.color_space = gfx::ColorSpace::CreateDisplayP3D65();
 
   auto actual = Raster(display_item_list, options);
-  auto expected = RasterExpectedBitmap(display_item_list, options);
-  ExpectEquals(actual, expected);
+
+#if BUILDFLAG(IS_ANDROID)
+  // Android has slight differences in color.
+  FuzzyPixelOffByOneComparator comparator(/*discard_alpha=*/false);
+#else
+  ExactPixelComparator comparator(/*discard_alpha=*/false);
+#endif
+
+  ExpectEquals(actual, FILE_PATH_LITERAL("oop_draw_image_both_color_space.png"),
+               comparator);
 }
 
-TEST_P(OopImagePixelTest, DrawImageWithSetMatrix) {
-  SCOPED_TRACE(base::StringPrintf("UseTooLargeImage: %d, FilterQuality: %d\n",
-                                  UseTooLargeImage(), FilterQuality()));
+TEST_F(OopPixelTest, DrawImageWithSetMatrix) {
+  constexpr gfx::Rect rect(100, 100);
 
-  gfx::Rect rect(10, 10);
-  gfx::Size image_size = GetImageSize();
-
-  SkBitmap bitmap;
-  bitmap.allocPixelsFlags(
-      SkImageInfo::MakeN32Premul(image_size.width(), image_size.height()),
-      SkBitmap::kZeroPixels_AllocFlag);
-
-  SkCanvas canvas(bitmap, SkSurfaceProps{});
-  canvas.drawColor(SK_ColorMAGENTA);
-  SkPaint green;
-  green.setColor(SK_ColorGREEN);
-  canvas.drawRect(SkRect::MakeXYWH(1, 2, 3, 4), green);
-
-  sk_sp<SkImage> image = SkImage::MakeFromBitmap(bitmap);
+  sk_sp<SkImage> image = MakeSkImage(rect.size());
   const PaintImage::Id kSomeId = 32;
   auto builder =
       PaintImageBuilder::WithDefault().set_image(image, 0).set_id(kSomeId);
@@ -951,7 +842,7 @@
   auto display_item_list = base::MakeRefCounted<DisplayItemList>();
   display_item_list->StartPaint();
   SkSamplingOptions sampling(
-      PaintFlags::FilterQualityToSkSamplingOptions(FilterQuality()));
+      PaintFlags::FilterQualityToSkSamplingOptions(kDefaultFilterQuality));
   display_item_list->push<SetMatrixOp>(SkM44::Scale(0.5f, 0.5f));
   display_item_list->push<DrawImageOp>(paint_image, 0.f, 0.f, sampling,
                                        nullptr);
@@ -959,10 +850,7 @@
   display_item_list->Finalize();
 
   auto actual = Raster(display_item_list, rect.size());
-  auto expected = RasterExpectedBitmap(display_item_list, rect.size());
-  ExpectEquals(actual, expected);
-
-  EXPECT_EQ(actual.getColor(0, 0), SK_ColorMAGENTA);
+  ExpectEquals(actual, FILE_PATH_LITERAL("oop_draw_image_matrix.png"));
 }
 
 namespace {
@@ -1081,7 +969,7 @@
   // Make a non-empty but noop display list to avoid early outs.
   auto display_item_list = MakeNoopDisplayItemList();
 
-  auto oop_result = Raster(display_item_list, options);
+  auto result = Raster(display_item_list, options);
 
   SkBitmap bitmap;
   bitmap.allocPixelsFlags(
@@ -1104,7 +992,7 @@
     canvas.drawRect(SkRect::MakeXYWH(0, 6, 9, 2), green);
   }
 
-  ExpectEquals(oop_result, bitmap);
+  ExpectEquals(result, bitmap);
 }
 
 TEST_F(OopPixelTest, ClearingOpaqueCornerExactEdge) {
@@ -1217,7 +1105,7 @@
   // Make a non-empty but noop display list to avoid early outs.
   auto display_item_list = MakeNoopDisplayItemList();
 
-  auto oop_result = Raster(display_item_list, options);
+  auto result = Raster(display_item_list, options);
 
   SkBitmap bitmap;
   bitmap.allocPixelsFlags(
@@ -1238,7 +1126,7 @@
     canvas.drawRect(SkRect::MakeXYWH(0, 0, 1, 10), green);
   }
 
-  ExpectEquals(oop_result, bitmap);
+  ExpectEquals(result, bitmap);
 }
 
 TEST_P(OopClearPixelTest, ClearingOpaqueRightEdge) {
@@ -1272,7 +1160,7 @@
   // Make a non-empty but noop display list to avoid early outs.
   auto display_item_list = MakeNoopDisplayItemList();
 
-  auto oop_result = Raster(display_item_list, options);
+  auto result = Raster(display_item_list, options);
 
   SkBitmap bitmap;
   bitmap.allocPixelsFlags(
@@ -1293,7 +1181,7 @@
     canvas.drawRect(SkRect::MakeXYWH(2, 0, 2, 10), green);
   }
 
-  ExpectEquals(oop_result, bitmap);
+  ExpectEquals(result, bitmap);
 }
 
 TEST_P(OopClearPixelTest, ClearingOpaqueTopEdge) {
@@ -1326,7 +1214,7 @@
   // Make a non-empty but noop display list to avoid early outs.
   auto display_item_list = MakeNoopDisplayItemList();
 
-  auto oop_result = Raster(display_item_list, options);
+  auto result = Raster(display_item_list, options);
 
   SkBitmap bitmap;
   bitmap.allocPixelsFlags(
@@ -1348,7 +1236,7 @@
     canvas.drawRect(SkRect::MakeXYWH(0, 0, 10, 1), green);
   }
 
-  ExpectEquals(oop_result, bitmap);
+  ExpectEquals(result, bitmap);
 }
 
 TEST_P(OopClearPixelTest, ClearingOpaqueBottomEdge) {
@@ -1382,7 +1270,7 @@
   // Make a non-empty but noop display list to avoid early outs.
   auto display_item_list = MakeNoopDisplayItemList();
 
-  auto oop_result = Raster(display_item_list, options);
+  auto result = Raster(display_item_list, options);
 
   SkBitmap bitmap;
   bitmap.allocPixelsFlags(
@@ -1404,7 +1292,7 @@
     canvas.drawRect(SkRect::MakeXYWH(0, 4, 10, 2), green);
   }
 
-  ExpectEquals(oop_result, bitmap);
+  ExpectEquals(result, bitmap);
 }
 
 TEST_F(OopPixelTest, ClearingOpaqueInternal) {
@@ -2437,7 +2325,6 @@
                FILE_PATH_LITERAL("oop_record_shader_max_texture_size.png"));
 }
 
-INSTANTIATE_TEST_SUITE_P(P, OopImagePixelTest, ::testing::Bool());
 INSTANTIATE_TEST_SUITE_P(P, OopClearPixelTest, ::testing::Bool());
 INSTANTIATE_TEST_SUITE_P(P, OopPathPixelTest, ::testing::Bool());
 
diff --git a/cc/test/animation_timelines_test_common.cc b/cc/test/animation_timelines_test_common.cc
index 98db71a..8e319de 100644
--- a/cc/test/animation_timelines_test_common.cc
+++ b/cc/test/animation_timelines_test_common.cc
@@ -76,7 +76,8 @@
 
 TestHostClient::TestHostClient(ThreadInstance thread_instance)
     : host_(AnimationHost::CreateForTesting(thread_instance)),
-      mutators_need_commit_(false) {
+      mutators_need_commit_(false),
+      property_trees_(*this) {
   host_->SetMutatorHostClient(this);
 }
 
@@ -97,6 +98,7 @@
 bool TestHostClient::InProtectedSequence() const {
   return false;
 }
+void TestHostClient::WaitForProtectedSequenceCompletion() const {}
 
 bool TestHostClient::IsElementInPropertyTrees(ElementId element_id,
                                               ElementListType list_type) const {
diff --git a/cc/test/animation_timelines_test_common.h b/cc/test/animation_timelines_test_common.h
index 0cef757..c784c5af 100644
--- a/cc/test/animation_timelines_test_common.h
+++ b/cc/test/animation_timelines_test_common.h
@@ -114,9 +114,6 @@
 
   void ClearMutatedProperties();
 
-  bool IsOwnerThread() const override;
-  bool InProtectedSequence() const override;
-  void WaitForProtectedSequenceCompletion() const override {}
   bool IsElementInPropertyTrees(ElementId element_id,
                                 ElementListType list_type) const override;
 
@@ -167,6 +164,10 @@
 
   bool RunsOnCurrentThread() const override;
 
+  bool IsOwnerThread() const override;
+  bool InProtectedSequence() const override;
+  void WaitForProtectedSequenceCompletion() const override;
+
   bool mutators_need_commit() const { return mutators_need_commit_; }
   void set_mutators_need_commit(bool need) { mutators_need_commit_ = need; }
 
diff --git a/cc/test/layer_tree_json_parser.cc b/cc/test/layer_tree_json_parser.cc
index 6ca20dd..60f38f7 100644
--- a/cc/test/layer_tree_json_parser.cc
+++ b/cc/test/layer_tree_json_parser.cc
@@ -34,7 +34,8 @@
   const base::Value* bounds_list_value = val.FindListKey("Bounds");
   if (!bounds_list_value)
     return nullptr;
-  base::Value::ConstListView bounds_list = bounds_list_value->GetList();
+  base::Value::ConstListView bounds_list =
+      bounds_list_value->GetListDeprecated();
   if (bounds_list.size() < 2)
     return nullptr;
 
@@ -62,7 +63,8 @@
     const base::Value* aperture_list_value = val.FindListKey("ImageAperture");
     if (!aperture_list_value)
       return nullptr;
-    base::Value::ConstListView aperture_list = aperture_list_value->GetList();
+    base::Value::ConstListView aperture_list =
+        aperture_list_value->GetListDeprecated();
     if (aperture_list.size() < 4)
       return nullptr;
 
@@ -78,7 +80,7 @@
     if (!image_bounds_list_value)
       return nullptr;
     base::Value::ConstListView image_bounds_list =
-        image_bounds_list_value->GetList();
+        image_bounds_list_value->GetListDeprecated();
     if (image_bounds_list.size() < 2)
       return nullptr;
 
@@ -90,7 +92,8 @@
     const base::Value* border_list_value = val.FindListKey("Border");
     if (!border_list_value)
       return nullptr;
-    base::Value::ConstListView border_list = border_list_value->GetList();
+    base::Value::ConstListView border_list =
+        border_list_value->GetListDeprecated();
     if (border_list.size() < 4)
       return nullptr;
 
@@ -143,7 +146,7 @@
 
   if (touch_region_list_value) {
     base::Value::ConstListView touch_region_list =
-        touch_region_list_value->GetList();
+        touch_region_list_value->GetListDeprecated();
 
     TouchActionRegion touch_action_region;
     for (size_t i = 0; i + 3 < touch_region_list.size(); i += 4) {
@@ -166,7 +169,8 @@
   const base::Value* transform_list_value = val.FindListKey("Transform");
   if (!transform_list_value)
     return nullptr;
-  base::Value::ConstListView transform_list = transform_list_value->GetList();
+  base::Value::ConstListView transform_list =
+      transform_list_value->GetListDeprecated();
   if (transform_list.size() < 16)
     return nullptr;
 
@@ -189,7 +193,7 @@
   const base::Value* child_list_value = val.FindListKey("Children");
   if (!child_list_value)
     return nullptr;
-  for (const auto& value : child_list_value->GetList()) {
+  for (const auto& value : child_list_value->GetListDeprecated()) {
     new_layer->AddChild(ParseTreeFromValue(value, content_client));
   }
 
diff --git a/cc/trees/commit_state.cc b/cc/trees/commit_state.cc
index 50f6314..f979df0 100644
--- a/cc/trees/commit_state.cc
+++ b/cc/trees/commit_state.cc
@@ -56,8 +56,10 @@
   return event_listener_properties[static_cast<size_t>(listener_class)];
 }
 
-ThreadUnsafeCommitState::ThreadUnsafeCommitState(MutatorHost* mh)
-    : mutator_host(mh) {}
+ThreadUnsafeCommitState::ThreadUnsafeCommitState(
+    MutatorHost* mh,
+    const ProtectedSequenceSynchronizer& synchronizer)
+    : mutator_host(mh), property_trees(synchronizer) {}
 
 ThreadUnsafeCommitState::~ThreadUnsafeCommitState() = default;
 
diff --git a/cc/trees/commit_state.h b/cc/trees/commit_state.h
index d9f04b37..314974d 100644
--- a/cc/trees/commit_state.h
+++ b/cc/trees/commit_state.h
@@ -148,7 +148,8 @@
 };
 
 struct CC_EXPORT ThreadUnsafeCommitState {
-  explicit ThreadUnsafeCommitState(MutatorHost* mh);
+  ThreadUnsafeCommitState(MutatorHost* mh,
+                          const ProtectedSequenceSynchronizer& synchronizer);
   ~ThreadUnsafeCommitState();
 
   // TODO(szager/vmpstr): These methods are to support range-based 'for' loops,
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index a1612867..d21c4959 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -144,7 +144,7 @@
       scheduling_client_(params.scheduling_client),
       rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()),
       pending_commit_state_(std::make_unique<CommitState>()),
-      thread_unsafe_commit_state_(params.mutator_host),
+      thread_unsafe_commit_state_(params.mutator_host, *this),
       settings_(*params.settings),
       id_(s_layer_tree_host_sequence_number.GetNext() + 1),
       task_graph_runner_(params.task_graph_runner),
@@ -299,9 +299,8 @@
 }
 
 bool LayerTreeHost::IsOwnerThread() const {
-  return !task_runner_provider_->MainThreadTaskRunner() ||
-         task_runner_provider_->MainThreadTaskRunner()
-             ->RunsTasksInCurrentSequence();
+  return task_runner_provider_->MainThreadTaskRunner()
+      ->RunsTasksInCurrentSequence();
 }
 
 bool LayerTreeHost::InProtectedSequence() const {
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 1544dc8..b6672322 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -444,7 +444,7 @@
 
   // LTHI always has an active tree.
   active_tree_ = std::make_unique<LayerTreeImpl>(
-      this, new SyncedScale, new SyncedBrowserControls,
+      *this, new SyncedScale, new SyncedBrowserControls,
       new SyncedBrowserControls, new SyncedElasticOverscroll);
   active_tree_->property_trees()->set_is_active(true);
 
@@ -1770,7 +1770,7 @@
   if (active_tree_)
     active_tree_->DetachLayers();
   active_tree_ = std::make_unique<LayerTreeImpl>(
-      this, active_tree()->page_scale_factor(),
+      *this, active_tree()->page_scale_factor(),
       active_tree()->top_controls_shown_ratio(),
       active_tree()->bottom_controls_shown_ratio(),
       active_tree()->elastic_overscroll());
@@ -3268,7 +3268,7 @@
     recycle_tree_.swap(pending_tree_);
   } else {
     pending_tree_ = std::make_unique<LayerTreeImpl>(
-        this, active_tree()->page_scale_factor(),
+        *this, active_tree()->page_scale_factor(),
         active_tree()->top_controls_shown_ratio(),
         active_tree()->bottom_controls_shown_ratio(),
         active_tree()->elastic_overscroll());
@@ -4849,16 +4849,25 @@
     monitor->OnSetNeedsRedrawOnImpl();
 }
 
-// These ProtectedSequenceSynchronizer methods are only called in relation to
-// data owned by mutator_host_. These data are never used by a "non-owner"
-// thread, and hence have no protected sequence.
 bool LayerTreeHostImpl::IsOwnerThread() const {
-  DCHECK(task_runner_provider_->IsImplThread());
-  return true;
+  bool result;
+  if (task_runner_provider_->ImplThreadTaskRunner()) {
+    result = task_runner_provider_->ImplThreadTaskRunner()
+                 ->RunsTasksInCurrentSequence();
+  } else {
+    result = task_runner_provider_->MainThreadTaskRunner()
+                 ->RunsTasksInCurrentSequence();
+    // There's no impl thread, and we're not on the main thread; where are we?
+    DCHECK(result);
+  }
+  return result;
 }
+
+// LayerTreeHostImpl has no "protected sequence" (yet).
 bool LayerTreeHostImpl::InProtectedSequence() const {
   return false;
 }
+
 void LayerTreeHostImpl::WaitForProtectedSequenceCompletion() const {}
 
 bool LayerTreeHostImpl::IsElementInPropertyTrees(
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc
index ce487fa3..e1f1975 100644
--- a/cc/trees/layer_tree_host_impl_unittest.cc
+++ b/cc/trees/layer_tree_host_impl_unittest.cc
@@ -1470,7 +1470,7 @@
 
   // Create the pending tree containing only the root layer.
   CreatePendingTree();
-  PropertyTrees pending_property_trees;
+  PropertyTrees pending_property_trees(*host_impl_);
   pending_property_trees.set_sequence_number(
       host_impl_->active_tree()->property_trees()->sequence_number() + 1);
   host_impl_->pending_tree()->SetPropertyTrees(pending_property_trees);
@@ -1678,7 +1678,7 @@
       base::TimeTicks() + base::Milliseconds(42), base::Microseconds(18),
       gfx::PresentationFeedback::Flags::kVSync |
           gfx::PresentationFeedback::Flags::kHWCompletion);
-#if defined(OS_MAC)
+#if BUILDFLAG(IS_MAC)
   feedback.ca_layer_error_code = gfx::kCALayerFailedQuadBlendMode;
 #endif
   return feedback;
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index aecc2bd9..0ecddd7 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -141,15 +141,16 @@
 }
 
 LayerTreeImpl::LayerTreeImpl(
-    LayerTreeHostImpl* host_impl,
+    LayerTreeHostImpl& host_impl,
     scoped_refptr<SyncedScale> page_scale_factor,
     scoped_refptr<SyncedBrowserControls> top_controls_shown_ratio,
     scoped_refptr<SyncedBrowserControls> bottom_controls_shown_ratio,
     scoped_refptr<SyncedElasticOverscroll> elastic_overscroll)
-    : host_impl_(host_impl),
+    : host_impl_(&host_impl),
       source_frame_number_(-1),
       is_first_frame_after_commit_tracker_(-1),
       hud_layer_(nullptr),
+      property_trees_(host_impl),
       background_color_(0),
       last_scrolled_scroll_node_index_(kInvalidPropertyNodeId),
       page_scale_factor_(page_scale_factor),
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 2d0a86b..45d0031 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -105,7 +105,7 @@
   // layer to consider it as jittering.
   enum : int { kFixedPointHitsThreshold = 3 };
   LayerTreeImpl(
-      LayerTreeHostImpl* host_impl,
+      LayerTreeHostImpl& host_impl,
       scoped_refptr<SyncedScale> page_scale_factor,
       scoped_refptr<SyncedBrowserControls> top_controls_shown_ratio,
       scoped_refptr<SyncedBrowserControls> bottom_controls_shown_ratio,
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc
index 00ecd8b..1a08204 100644
--- a/cc/trees/property_tree.cc
+++ b/cc/trees/property_tree.cc
@@ -30,7 +30,8 @@
 namespace cc {
 
 template <typename T>
-PropertyTree<T>::PropertyTree() : needs_update_(false) {
+PropertyTree<T>::PropertyTree(PropertyTrees* property_trees)
+    : needs_update_(false), property_trees_(property_trees) {
   nodes_.push_back(T());
   back()->id = kRootPropertyNodeId;
   back()->parent_id = kInvalidPropertyNodeId;
@@ -52,8 +53,9 @@
                                     !state.potentially_animating[property]) || \
                                    needs_rebuild))
 
-TransformTree::TransformTree()
-    : page_scale_factor_(1.f),
+TransformTree::TransformTree(PropertyTrees* property_trees)
+    : PropertyTree<TransformNode>(property_trees),
+      page_scale_factor_(1.f),
       device_scale_factor_(1.f),
       device_transform_scale_factor_(1.f) {
   cached_data_.push_back(TransformCachedNodeData());
@@ -82,7 +84,7 @@
   element_id_to_node_index_.clear();
 
 #if DCHECK_IS_ON()
-  PropertyTree<T> tree;
+  PropertyTree<T> tree(nullptr);
   DCHECK(tree == *this);
 #endif
 }
@@ -686,7 +688,8 @@
   return sticky_position_data_[node->sticky_position_constraint_id];
 }
 
-EffectTree::EffectTree() {
+EffectTree::EffectTree(PropertyTrees* property_trees)
+    : PropertyTree<EffectNode>(property_trees) {
   render_surfaces_.push_back(nullptr);
 }
 
@@ -1179,6 +1182,9 @@
   return false;
 }
 
+ClipTree::ClipTree(PropertyTrees* property_trees)
+    : PropertyTree<ClipNode>(property_trees) {}
+
 void ClipTree::SetViewportClip(gfx::RectF viewport_rect) {
   if (size() < 2)
     return;
@@ -1220,8 +1226,9 @@
 }
 #endif
 
-ScrollTree::ScrollTree()
-    : currently_scrolling_node_id_(kInvalidPropertyNodeId),
+ScrollTree::ScrollTree(PropertyTrees* property_trees)
+    : PropertyTree<ScrollNode>(property_trees),
+      currently_scrolling_node_id_(kInvalidPropertyNodeId),
       scroll_offset_map_(ScrollTree::ScrollOffsetMap()) {}
 
 ScrollTree::~ScrollTree() = default;
@@ -1747,12 +1754,18 @@
 
 PropertyTreesCachedData::~PropertyTreesCachedData() = default;
 
-PropertyTrees::PropertyTrees() {
-  transform_tree_mutable().SetPropertyTrees(this);
-  effect_tree_mutable().SetPropertyTrees(this);
-  clip_tree_mutable().SetPropertyTrees(this);
-  scroll_tree_mutable().SetPropertyTrees(this);
-}
+PropertyTrees::PropertyTrees(const ProtectedSequenceSynchronizer& synchronizer)
+    : synchronizer_(synchronizer),
+      transform_tree_(this),
+      effect_tree_(this),
+      clip_tree_(this),
+      scroll_tree_(this),
+      needs_rebuild_(true),
+      changed_(false),
+      full_tree_damaged_(false),
+      is_main_thread_(true),
+      is_active_(false),
+      sequence_number_(0) {}
 
 PropertyTrees::~PropertyTrees() = default;
 
@@ -1806,7 +1819,7 @@
   increment_sequence_number();
 
 #if DCHECK_IS_ON()
-  PropertyTrees tree;
+  PropertyTrees tree(synchronizer());
   tree.transform_tree_mutable() = transform_tree();
   tree.effect_tree_mutable() = effect_tree();
   tree.clip_tree_mutable() = clip_tree();
@@ -1825,7 +1838,7 @@
   if (inner_viewport_container_bounds_delta() == bounds_delta)
     return;
 
-  inner_viewport_container_bounds_delta_ = bounds_delta;
+  inner_viewport_container_bounds_delta_.Write(synchronizer()) = bounds_delta;
 }
 
 void PropertyTrees::SetOuterViewportContainerBoundsDelta(
@@ -1833,7 +1846,7 @@
   if (outer_viewport_container_bounds_delta() == bounds_delta)
     return;
 
-  outer_viewport_container_bounds_delta_ = bounds_delta;
+  outer_viewport_container_bounds_delta_.Write(synchronizer()) = bounds_delta;
   transform_tree_mutable().UpdateOuterViewportContainerBoundsDelta();
 }
 
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h
index 78fd123..d7dc98f 100644
--- a/cc/trees/property_tree.h
+++ b/cc/trees/property_tree.h
@@ -134,7 +134,7 @@
   }
 
  protected:
-  PropertyTree();
+  explicit PropertyTree(PropertyTrees* property_trees);
   std::vector<T> nodes_;
 
  private:
@@ -157,7 +157,7 @@
 
 class CC_EXPORT TransformTree final : public PropertyTree<TransformNode> {
  public:
-  TransformTree();
+  explicit TransformTree(PropertyTrees* property_trees = nullptr);
 
   // These C++ special member functions cannot be implicit inline because
   // they are exported by CC_EXPORT. They will be instantiated in every
@@ -307,6 +307,7 @@
 
 class CC_EXPORT ClipTree final : public PropertyTree<ClipNode> {
  public:
+  explicit ClipTree(PropertyTrees* property_trees = nullptr);
 #if DCHECK_IS_ON()
   bool operator==(const ClipTree& other) const;
 #endif
@@ -317,7 +318,7 @@
 
 class CC_EXPORT EffectTree final : public PropertyTree<EffectNode> {
  public:
-  EffectTree();
+  explicit EffectTree(PropertyTrees* property_trees = nullptr);
   ~EffectTree();
 
   EffectTree& operator=(const EffectTree& from);
@@ -444,7 +445,7 @@
 
 class CC_EXPORT ScrollTree final : public PropertyTree<ScrollNode> {
  public:
-  ScrollTree();
+  explicit ScrollTree(PropertyTrees* property_trees = nullptr);
   ~ScrollTree();
 
   ScrollTree& operator=(const ScrollTree& from);
@@ -653,8 +654,12 @@
 
 class CC_EXPORT PropertyTrees final {
  public:
-  PropertyTrees();
+  explicit PropertyTrees(const ProtectedSequenceSynchronizer& synchronizer);
   PropertyTrees(const PropertyTrees& other) = delete;
+  void* operator new(size_t) = delete;
+  void* operator new(size_t, void*) = delete;
+  void* operator new[](size_t) = delete;
+  void* operator new[](size_t, void*) = delete;
   ~PropertyTrees();
 
   PropertyTrees& operator=(const PropertyTrees& from);
@@ -663,33 +668,59 @@
   bool operator==(const PropertyTrees& other) const;
 #endif
 
-  const ClipTree& clip_tree() const { return clip_tree_; }
-  ClipTree& clip_tree_mutable() { return clip_tree_; }
-  const EffectTree& effect_tree() const { return effect_tree_; }
-  EffectTree& effect_tree_mutable() { return effect_tree_; }
-  const ScrollTree& scroll_tree() const { return scroll_tree_; }
-  ScrollTree& scroll_tree_mutable() { return scroll_tree_; }
-  const TransformTree& transform_tree() const { return transform_tree_; }
-  TransformTree& transform_tree_mutable() { return transform_tree_; }
+  const ProtectedSequenceSynchronizer& synchronizer() const {
+    return synchronizer_;
+  }
 
-  void set_needs_rebuild(bool value) { needs_rebuild_ = value; }
-  bool needs_rebuild() const { return needs_rebuild_; }
+  const ClipTree& clip_tree() const { return clip_tree_.Read(synchronizer()); }
+  ClipTree& clip_tree_mutable() { return clip_tree_.Write(synchronizer()); }
+  const EffectTree& effect_tree() const {
+    return effect_tree_.Read(synchronizer());
+  }
+  EffectTree& effect_tree_mutable() {
+    return effect_tree_.Write(synchronizer());
+  }
+  const ScrollTree& scroll_tree() const {
+    return scroll_tree_.Read(synchronizer());
+  }
+  ScrollTree& scroll_tree_mutable() {
+    return scroll_tree_.Write(synchronizer());
+  }
+  const TransformTree& transform_tree() const {
+    return transform_tree_.Read(synchronizer());
+  }
+  TransformTree& transform_tree_mutable() {
+    return transform_tree_.Write(synchronizer());
+  }
 
-  void set_changed(bool value) { changed_ = value; }
-  bool changed() const { return changed_; }
+  void set_needs_rebuild(bool value) {
+    needs_rebuild_.Write(synchronizer()) = value;
+  }
+  bool needs_rebuild() const { return needs_rebuild_.Read(synchronizer()); }
 
-  void set_full_tree_damaged(bool value) { full_tree_damaged_ = value; }
-  bool full_tree_damaged() const { return full_tree_damaged_; }
+  void set_changed(bool value) { changed_.Write(synchronizer()) = value; }
+  bool changed() const { return changed_.Read(synchronizer()); }
 
-  void set_is_main_thread(bool value) { is_main_thread_ = value; }
-  bool is_main_thread() const { return is_main_thread_; }
+  void set_full_tree_damaged(bool value) {
+    full_tree_damaged_.Write(synchronizer()) = value;
+  }
+  bool full_tree_damaged() const {
+    return full_tree_damaged_.Read(synchronizer());
+  }
 
-  void set_is_active(bool value) { is_active_ = value; }
-  bool is_active() const { return is_active_; }
+  void set_is_main_thread(bool value) {
+    is_main_thread_.Write(synchronizer()) = value;
+  }
+  bool is_main_thread() const { return is_main_thread_.Read(synchronizer()); }
 
-  void set_sequence_number(int n) { sequence_number_ = n; }
-  void increment_sequence_number() { sequence_number_++; }
-  int sequence_number() const { return sequence_number_; }
+  void set_is_active(bool value) { is_active_.Write(synchronizer()) = value; }
+  bool is_active() const { return is_active_.Read(synchronizer()); }
+
+  void set_sequence_number(int n) {
+    sequence_number_.Write(synchronizer()) = n;
+  }
+  void increment_sequence_number() { sequence_number_.Write(synchronizer())++; }
+  int sequence_number() const { return sequence_number_.Read(synchronizer()); }
 
   void clear();
 
@@ -708,7 +739,7 @@
   void ResetAllChangeTracking();
 
   gfx::Vector2dF inner_viewport_container_bounds_delta() const {
-    return inner_viewport_container_bounds_delta_;
+    return inner_viewport_container_bounds_delta_.Read(synchronizer());
   }
   gfx::Vector2dF inner_viewport_scroll_bounds_delta() const {
     // Inner viewport scroll bounds are always the same as outer viewport
@@ -716,7 +747,7 @@
     return outer_viewport_container_bounds_delta();
   }
   gfx::Vector2dF outer_viewport_container_bounds_delta() const {
-    return outer_viewport_container_bounds_delta_;
+    return outer_viewport_container_bounds_delta_.Read(synchronizer());
   }
 
   std::unique_ptr<base::trace_event::TracedValue> AsTracedValue() const;
@@ -750,30 +781,34 @@
   bool HasElement(ElementId element_id) const;
 
  private:
-  TransformTree transform_tree_;
-  EffectTree effect_tree_;
-  ClipTree clip_tree_;
-  ScrollTree scroll_tree_;
+  const ProtectedSequenceSynchronizer& synchronizer_;
 
-  bool needs_rebuild_ = true;
+  ProtectedSequenceWritable<TransformTree> transform_tree_;
+  ProtectedSequenceWritable<EffectTree> effect_tree_;
+  ProtectedSequenceReadable<ClipTree> clip_tree_;
+  ProtectedSequenceReadable<ScrollTree> scroll_tree_;
+
+  ProtectedSequenceWritable<bool> needs_rebuild_;
   // Change tracking done on property trees needs to be preserved across commits
   // (when they are not rebuild). We cache a global bool which stores whether
   // we did any change tracking so that we can skip copying the change status
   // between property trees when this bool is false.
-  bool changed_ = false;
+  ProtectedSequenceWritable<bool> changed_;
   // We cache a global bool for full tree damages to avoid walking the entire
   // tree.
   // TODO(jaydasika): Changes to transform and effects that damage the entire
   // tree should be tracked by this bool. Currently, they are tracked by the
   // individual nodes.
-  bool full_tree_damaged_ = false;
-  bool is_main_thread_ = true;
-  bool is_active_ = false;
+  ProtectedSequenceWritable<bool> full_tree_damaged_;
+  ProtectedSequenceReadable<bool> is_main_thread_;
+  ProtectedSequenceReadable<bool> is_active_;
 
-  int sequence_number_ = 0;
+  ProtectedSequenceReadable<int> sequence_number_;
 
-  gfx::Vector2dF inner_viewport_container_bounds_delta_;
-  gfx::Vector2dF outer_viewport_container_bounds_delta_;
+  ProtectedSequenceReadable<gfx::Vector2dF>
+      inner_viewport_container_bounds_delta_;
+  ProtectedSequenceReadable<gfx::Vector2dF>
+      outer_viewport_container_bounds_delta_;
 
   const AnimationScaleData& GetAnimationScaleData(int transform_id);
 
@@ -782,7 +817,8 @@
   DrawTransformData& FetchDrawTransformsDataFromCache(int transform_id,
                                                       int effect_id) const;
 
-  // This can be mutable because it isn't copied by operator=();
+  // This can be mutable and not wrapped in ProtectedSequence* because it isn't
+  // copied by operator=().
   mutable PropertyTreesCachedData cached_data_;
 };
 
diff --git a/cc/trees/property_tree_unittest.cc b/cc/trees/property_tree_unittest.cc
index 95b9b73..e5da6f7f 100644
--- a/cc/trees/property_tree_unittest.cc
+++ b/cc/trees/property_tree_unittest.cc
@@ -23,8 +23,16 @@
 namespace cc {
 namespace {
 
+class FakeProtectedSequenceSynchronizer : public ProtectedSequenceSynchronizer {
+ public:
+  bool IsOwnerThread() const override { return true; }
+  bool InProtectedSequence() const override { return false; }
+  void WaitForProtectedSequenceCompletion() const override {}
+};
+
 TEST(PropertyTreeTest, ComputeTransformRoot) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.local.Translate(2, 2);
@@ -46,7 +54,8 @@
 }
 
 TEST(PropertyTreeTest, SetNeedsUpdate) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.id = tree.Insert(contents_root, 0);
@@ -60,7 +69,8 @@
 }
 
 TEST(PropertyTreeTest, ComputeTransformChild) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.local.Translate(2, 2);
@@ -102,7 +112,8 @@
 }
 
 TEST(PropertyTreeTest, ComputeTransformSibling) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.local.Translate(2, 2);
@@ -145,7 +156,8 @@
   // transform, we cannot use screen space transforms to compute change of
   // basis
   // transforms between these nodes.
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.local.Translate(2, 2);
@@ -184,7 +196,8 @@
 }
 
 TEST(PropertyTreeTest, TransformsWithFlattening) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   EffectTree& effect_tree = property_trees.effect_tree_mutable();
 
@@ -259,7 +272,8 @@
 }
 
 TEST(PropertyTreeTest, MultiplicationOrder) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.local.Translate(2, 2);
@@ -291,7 +305,8 @@
 }
 
 TEST(PropertyTreeTest, ComputeTransformWithUninvertibleTransform) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.id = tree.Insert(contents_root, 0);
@@ -319,7 +334,8 @@
 }
 
 TEST(PropertyTreeTest, ComputeTransformToTargetWithZeroSurfaceContentsScale) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
   contents_root.id = tree.Insert(contents_root, 0);
@@ -374,7 +390,8 @@
   // This tests that flattening is performed correctly when
   // destination and its ancestors are flat, but there are 3d transforms
   // and flattening between the source and destination.
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
 
   int parent = tree.Insert(TransformNode(), 0);
@@ -403,7 +420,8 @@
 TEST(PropertyTreeTest, ScreenSpaceOpacityUpdateTest) {
   // This tests that screen space opacity is updated for the subtree when
   // opacity of a node changes.
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   EffectTree& tree = property_trees.effect_tree_mutable();
 
   int parent = tree.Insert(EffectNode(), 0);
@@ -424,7 +442,8 @@
 TEST(PropertyTreeTest, SingularTransformSnapTest) {
   // This tests that to_target transform is not snapped when it has a singular
   // transform.
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   TransformTree& tree = property_trees.transform_tree_mutable();
   EffectTree& effect_tree = property_trees.effect_tree_mutable();
 
@@ -472,7 +491,8 @@
 TEST(EffectTreeTest, CopyOutputRequestsAreTransformed) {
   using viz::CopyOutputRequest;
 
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
 
   TransformTree& transform_tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
@@ -570,7 +590,8 @@
 TEST(EffectTreeTest, CopyOutputRequestsThatBecomeIllegalAreDropped) {
   using viz::CopyOutputRequest;
 
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
 
   TransformTree& transform_tree = property_trees.transform_tree_mutable();
   TransformNode contents_root;
@@ -603,7 +624,8 @@
 // scroll offset is near zero that can naively lead to a negative offset being
 // returned which is not desirable.
 TEST(ScrollTreeTest, GetPixelSnappedScrollOffsetNegativeOffset) {
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   ScrollTree& scroll_tree = property_trees.scroll_tree_mutable();
   TransformTree& transform_tree = property_trees.transform_tree_mutable();
 
@@ -633,7 +655,8 @@
   const bool use_fractional_deltas = false;
 
   // Set up main property trees.
-  PropertyTrees property_trees;
+  FakeProtectedSequenceSynchronizer synchronizer;
+  PropertyTrees property_trees(synchronizer);
   ScrollTree& main_scroll_tree = property_trees.scroll_tree_mutable();
   TransformTree& transform_tree = property_trees.transform_tree_mutable();
   ElementId element_id(5);
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index 6cb63bf..2aad57d6 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -1038,8 +1038,11 @@
     // The impl-side scroll deltas may be manipulated directly via the
     // InputHandler on the UI thread and the scale deltas may change when they
     // are clamped on the impl thread.
-    std::unique_ptr<CompositorCommitData> commit_data =
-        host_impl_->ProcessCompositorDeltas();
+    std::unique_ptr<CompositorCommitData> commit_data;
+    {
+      DebugScopedSetImplThread impl(task_runner_provider_);
+      commit_data = host_impl_->ProcessCompositorDeltas();
+    }
     layer_tree_host_->ApplyCompositorChanges(commit_data.get());
     did_apply_compositor_deltas_ = true;
   }
diff --git a/chrome/VERSION b/chrome/VERSION
index a8406360..7cd2ae35 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=100
 MINOR=0
-BUILD=4867
+BUILD=4868
 PATCH=0
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index dcab534..b0f14065 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -148,6 +148,7 @@
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfileEditorPreference.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditor.java",
+  "java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialog.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/CardEditor.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/CreditCardNumberFormattingTextWatcher.java",
   "java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferenceFragment.java",
@@ -415,7 +416,6 @@
   "java/src/org/chromium/chrome/browser/contextualsearch/RelatedSearchesStamp.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/RelatedSearchesUma.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/ResolvedSearchTerm.java",
-  "java/src/org/chromium/chrome/browser/contextualsearch/SecondTapMlOverride.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/SelectionClientManager.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/ShortTextRunSuppression.java",
   "java/src/org/chromium/chrome/browser/contextualsearch/SmallTextSuppression.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 669c0507..8311e72 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -71,6 +71,7 @@
   "javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillLocalCardEditorTest.java",
   "javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentTest.java",
   "javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragmentTest.java",
+  "javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditorTest.java",
   "javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillTestRule.java",
   "javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantPreferenceFragmentTest.java",
   "javatests/src/org/chromium/chrome/browser/background_sync/BackgroundSyncTest.java",
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
index 2370583..4aaf667 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCollectUserDataUiTest.java
@@ -1127,6 +1127,6 @@
                 creditCard.getYear(), creditCard.getBasicCardIssuerNetwork(),
                 creditCard.getIssuerIconDrawableId(), creditCard.getBillingAddressId(),
                 creditCard.getServerId(), creditCard.getInstrumentId(), creditCard.getNickname(),
-                creditCard.getCardArtUrl());
+                creditCard.getCardArtUrl(), creditCard.getVirtualCardEnrollmentState());
     }
 }
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillCreditCard.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillCreditCard.java
index 082f3644..a0619e7 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillCreditCard.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillCreditCard.java
@@ -9,6 +9,7 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.chrome.R;
+import org.chromium.components.autofill.VirtualCardEnrollmentState;
 import org.chromium.url.GURL;
 
 import java.util.HashMap;
@@ -64,13 +65,14 @@
     private final long mInstrumentId;
     private final String mNickname;
     private final GURL mCardArtUrl;
+    private final @VirtualCardEnrollmentState int mVirtualCardEnrollmentState;
 
     @CalledByNative
     public AssistantAutofillCreditCard(String guid, String origin, boolean isLocal,
             boolean isCached, String name, String number, String obfuscatedNumber, String month,
             String year, String basicCardIssuerNetwork, int issuerIconDrawableId,
             String billingAddressId, String serverId, long instrumentId, String nickname,
-            GURL cardArtUrl) {
+            GURL cardArtUrl, @VirtualCardEnrollmentState int virtualCardEnrollmentState) {
         mGUID = guid;
         mOrigin = origin;
         mIsLocal = isLocal;
@@ -87,6 +89,7 @@
         mInstrumentId = instrumentId;
         mNickname = nickname;
         mCardArtUrl = cardArtUrl;
+        mVirtualCardEnrollmentState = virtualCardEnrollmentState;
     }
 
     @CalledByNative
@@ -172,4 +175,9 @@
     public GURL getCardArtUrl() {
         return mCardArtUrl;
     }
+
+    @CalledByNative
+    public @VirtualCardEnrollmentState int getVirtualCardEnrollmentState() {
+        return mVirtualCardEnrollmentState;
+    }
 }
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java
index 0347a52..ffd36c2 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantAutofillUtilChrome.java
@@ -116,7 +116,7 @@
                 creditCard.getBasicCardIssuerNetwork(), creditCard.getIssuerIconDrawableId(),
                 creditCard.getBillingAddressId(), creditCard.getServerId(),
                 creditCard.getInstrumentId(), /* cardLabel= */ "", creditCard.getNickname(),
-                creditCard.getCardArtUrl());
+                creditCard.getCardArtUrl(), creditCard.getVirtualCardEnrollmentState());
     }
 
     /**
@@ -146,7 +146,7 @@
                 creditCard.getYear(), creditCard.getBasicCardIssuerNetwork(),
                 creditCard.getIssuerIconDrawableId(), creditCard.getBillingAddressId(),
                 creditCard.getServerId(), creditCard.getInstrumentId(), creditCard.getNickname(),
-                creditCard.getCardArtUrl());
+                creditCard.getCardArtUrl(), creditCard.getVirtualCardEnrollmentState());
     }
 
     /**
diff --git a/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_qr.xml b/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_qr.xml
index bb0e9a1..b775f03 100644
--- a/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_qr.xml
+++ b/chrome/android/features/cablev2_authenticator/java/res/layout-sw600dp/cablev2_qr.xml
@@ -66,12 +66,14 @@
       <CheckBox
           a:id="@+id/qr_link"
           a:checked="true"
+          a:contentDescription="@string/cablev2_qr_remember"
           a:layout_width="wrap_content"
           a:layout_height="wrap_content" />
 
       <TextView
           a:layout_width="wrap_content"
           a:layout_height="wrap_content"
+          a:importantForAccessibility="no"
           style="@style/TextAppearance.TextMedium.Primary"
           a:text="@string/cablev2_qr_remember" />
     </LinearLayout>
diff --git a/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_qr.xml b/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_qr.xml
index 04e0eff..fa8d071f 100644
--- a/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_qr.xml
+++ b/chrome/android/features/cablev2_authenticator/java/res/layout/cablev2_qr.xml
@@ -66,12 +66,14 @@
       <CheckBox
           a:id="@+id/qr_link"
           a:checked="true"
+          a:contentDescription="@string/cablev2_qr_remember"
           a:layout_width="wrap_content"
           a:layout_height="wrap_content" />
 
       <TextView
           a:layout_width="wrap_content"
           a:layout_height="wrap_content"
+          a:importantForAccessibility="no"
           style="@style/TextAppearance.TextMedium.Primary"
           a:text="@string/cablev2_qr_remember" />
     </LinearLayout>
diff --git a/chrome/android/java/res/layout/autofill_server_card_editor.xml b/chrome/android/java/res/layout/autofill_server_card_editor.xml
index d2d7854..332e37e 100644
--- a/chrome/android/java/res/layout/autofill_server_card_editor.xml
+++ b/chrome/android/java/res/layout/autofill_server_card_editor.xml
@@ -21,6 +21,30 @@
 
     <include layout="@layout/autofill_billing_address_dropdown" />
 
+    <LinearLayout
+        android:id="@+id/virtual_card_ui"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/pref_autofill_field_top_margin">
+
+        <TextView
+            android:id="@+id/virtual_card_enrollment_switch_label"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:paddingTop="@dimen/pref_autofill_touch_target_padding"
+            android:paddingBottom="@dimen/pref_autofill_touch_target_padding"
+            style="@style/PreferenceTitle"
+            android:text="@string/autofill_virtual_card_number_switch_label" />
+
+        <com.google.android.material.switchmaterial.SwitchMaterial
+            android:id="@+id/virtual_card_enrollment_switch"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingTop="@dimen/pref_autofill_touch_target_padding"
+            android:paddingBottom="@dimen/pref_autofill_touch_target_padding" />
+    </LinearLayout>
+
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
index c824b18..2a50b12 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -37,6 +37,7 @@
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ActivityState;
@@ -1237,7 +1238,9 @@
      * is kept up-to-date.
      */
     @Override
+    @RequiresApi(api = Build.VERSION_CODES.O)
     public void onPictureInPictureModeChanged(boolean inPicture, Configuration newConfig) {
+        super.onPictureInPictureModeChanged(inPicture, newConfig);
         if (inPicture) {
             ensurePictureInPictureController();
             mPictureInPictureController.onEnteredPictureInPictureMode();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl.java
index 96b671d..5d88470 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/omnibox/OmniboxPedalDelegateImpl.java
@@ -6,6 +6,8 @@
 
 import android.app.Activity;
 
+import androidx.annotation.DrawableRes;
+
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.accessibility.settings.AccessibilitySettings;
 import org.chromium.chrome.browser.app.ChromeActivity;
@@ -85,4 +87,29 @@
         }
         return;
     }
+
+    @Override
+    public @DrawableRes int getPedalIcon(@OmniboxPedalType int omniboxActionType) {
+        switch (omniboxActionType) {
+            case OmniboxPedalType.CLEAR_BROWSING_DATA:
+            case OmniboxPedalType.MANAGE_PASSWORDS:
+            case OmniboxPedalType.UPDATE_CREDIT_CARD:
+            case OmniboxPedalType.LAUNCH_INCOGNITO:
+            case OmniboxPedalType.RUN_CHROME_SAFETY_CHECK:
+            case OmniboxPedalType.MANAGE_SITE_SETTINGS:
+            case OmniboxPedalType.MANAGE_CHROME_SETTINGS:
+            case OmniboxPedalType.VIEW_CHROME_HISTORY:
+            case OmniboxPedalType.MANAGE_CHROME_ACCESSIBILITY:
+                return R.drawable.fre_product_logo;
+            case OmniboxPedalType.PLAY_CHROME_DINO_GAME:
+                return R.drawable.ic_dino;
+            default:
+                // Please confirm the icon for the new pedals in
+                // chrome/browser/ui/omnibox/omnibox_pedal_implementations.cc, if the new pedals use
+                // a spicial icon.
+                assert false : "New pedals need to confirm the icon and add the list above.";
+                break;
+        }
+        return R.drawable.fre_product_logo;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
index 1313d3c9..173adfa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -21,6 +21,7 @@
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileKey;
+import org.chromium.components.autofill.VirtualCardEnrollmentState;
 import org.chromium.components.image_fetcher.ImageFetcher;
 import org.chromium.components.image_fetcher.ImageFetcherConfig;
 import org.chromium.components.image_fetcher.ImageFetcherFactory;
@@ -559,16 +560,18 @@
         private String mCardLabel;
         private String mNickname;
         private GURL mCardArtUrl;
+        private final @VirtualCardEnrollmentState int mVirtualCardEnrollmentState;
 
         @CalledByNative("CreditCard")
         public static CreditCard create(String guid, String origin, boolean isLocal,
                 boolean isCached, String name, String number, String mObfuscatedNumber,
                 String month, String year, String basicCardIssuerNetwork, int iconId,
                 String billingAddressId, String serverId, long instrumentId, String cardLabel,
-                String nickname, GURL cardArtUrl) {
+                String nickname, GURL cardArtUrl,
+                @VirtualCardEnrollmentState int virtualCardEnrollmentState) {
             return new CreditCard(guid, origin, isLocal, isCached, name, number, mObfuscatedNumber,
                     month, year, basicCardIssuerNetwork, iconId, billingAddressId, serverId,
-                    instrumentId, cardLabel, nickname, cardArtUrl);
+                    instrumentId, cardLabel, nickname, cardArtUrl, virtualCardEnrollmentState);
         }
 
         public CreditCard(String guid, String origin, boolean isLocal, boolean isCached,
@@ -577,15 +580,16 @@
                 String serverId) {
             this(guid, origin, isLocal, isCached, name, number, obfuscatedNumber, month, year,
                     basicCardIssuerNetwork, issuerIconDrawableId, billingAddressId, serverId,
-                    /* instrumentId= */ 0,
-                    /* cardLabel= */ obfuscatedNumber, /* nickname= */ "", /* cardArtUrl= */ null);
+                    /* instrumentId= */ 0, /* cardLabel= */ obfuscatedNumber, /* nickname= */ "",
+                    /* cardArtUrl= */ null,
+                    /* virtualCardEnrollmentState= */ VirtualCardEnrollmentState.UNSPECIFIED);
         }
 
         public CreditCard(String guid, String origin, boolean isLocal, boolean isCached,
                 String name, String number, String obfuscatedNumber, String month, String year,
                 String basicCardIssuerNetwork, int issuerIconDrawableId, String billingAddressId,
                 String serverId, long instrumentId, String cardLabel, String nickname,
-                GURL cardArtUrl) {
+                GURL cardArtUrl, @VirtualCardEnrollmentState int virtualCardEnrollmentState) {
             mGUID = guid;
             mOrigin = origin;
             mIsLocal = isLocal;
@@ -603,6 +607,7 @@
             mCardLabel = cardLabel;
             mNickname = nickname;
             mCardArtUrl = cardArtUrl;
+            mVirtualCardEnrollmentState = virtualCardEnrollmentState;
         }
 
         public CreditCard() {
@@ -700,6 +705,11 @@
             return mCardArtUrl;
         }
 
+        @CalledByNative("CreditCard")
+        public @VirtualCardEnrollmentState int getVirtualCardEnrollmentState() {
+            return mVirtualCardEnrollmentState;
+        }
+
         public void setGUID(String guid) {
             mGUID = guid;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditor.java
index 179ff67d..ed65a6d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditor.java
@@ -10,22 +10,33 @@
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.appcompat.widget.SwitchCompat;
+
 import org.chromium.base.annotations.UsedByReflection;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeStringConstants;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.payments.SettingsAutofillAndPaymentsObserver;
+import org.chromium.components.autofill.VirtualCardEnrollmentState;
+import org.chromium.components.browser_ui.modaldialog.AppModalPresenter;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 
 /**
  * Server credit card settings.
  */
-public class AutofillServerCardEditor extends AutofillCreditCardEditor {
+public class AutofillServerCardEditor
+        extends AutofillCreditCardEditor implements CompoundButton.OnCheckedChangeListener {
     private View mLocalCopyLabel;
     private View mClearLocalCopy;
+    private SwitchCompat mVirtualCardEnrollmentSwitch;
 
     @UsedByReflection("AutofillPaymentMethodsFragment.java")
     public AutofillServerCardEditor() {}
@@ -50,6 +61,19 @@
             }
         });
 
+        final LinearLayout mVirtualCardContainerLayout =
+                (LinearLayout) v.findViewById(R.id.virtual_card_ui);
+        mVirtualCardEnrollmentSwitch =
+                (SwitchCompat) v.findViewById(R.id.virtual_card_enrollment_switch);
+        if (showVirtualCardEnrollmentSwitch()) {
+            mVirtualCardContainerLayout.setVisibility(View.VISIBLE);
+            mVirtualCardEnrollmentSwitch.setChecked(
+                    mCard.getVirtualCardEnrollmentState() == VirtualCardEnrollmentState.ENROLLED);
+            mVirtualCardEnrollmentSwitch.setOnCheckedChangeListener(this);
+        } else {
+            mVirtualCardContainerLayout.setVisibility(View.GONE);
+        }
+
         mLocalCopyLabel = v.findViewById(R.id.local_copy_label);
         mClearLocalCopy = v.findViewById(R.id.clear_local_copy);
 
@@ -77,6 +101,24 @@
         parent.removeView(mClearLocalCopy);
     }
 
+    private boolean showVirtualCardEnrollmentSwitch() {
+        return (ChromeFeatureList.isEnabled(
+                        ChromeFeatureList.AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT)
+                && (mCard.getVirtualCardEnrollmentState() == VirtualCardEnrollmentState.ENROLLED
+                        || mCard.getVirtualCardEnrollmentState()
+                                == VirtualCardEnrollmentState.UNENROLLED_AND_ELIGIBLE));
+    }
+
+    /**
+     * Sets the mVirtualCardEnrollmentSwitch checked state without triggering the
+     * enrollment/unenrollment action.
+     */
+    private void setVirtualCardEnrollmentSwitchCheckedState(boolean isChecked) {
+        mVirtualCardEnrollmentSwitch.setOnCheckedChangeListener(null);
+        mVirtualCardEnrollmentSwitch.setChecked(isChecked);
+        mVirtualCardEnrollmentSwitch.setOnCheckedChangeListener(this);
+    }
+
     @Override
     protected int getLayoutId() {
         return R.layout.autofill_server_card_editor;
@@ -88,6 +130,26 @@
     }
 
     @Override
+    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+        if (isChecked) {
+            // TODO (crbug/1281695): Implement enroll dialog.
+        } else {
+            final ModalDialogManager modalDialogManager = new ModalDialogManager(
+                    new AppModalPresenter(getActivity()), ModalDialogType.APP);
+            AutofillVirtualCardUnenrollmentDialog dialog =
+                    new AutofillVirtualCardUnenrollmentDialog(
+                            getActivity(), modalDialogManager, unenrollRequested -> {
+                                if (unenrollRequested) {
+                                    // TODO(crbug/1281695): Implement unenroll action.
+                                } else {
+                                    setVirtualCardEnrollmentSwitchCheckedState(true);
+                                }
+                            });
+            dialog.show();
+        }
+    }
+
+    @Override
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
         if (parent == mBillingAddress && position != mInitialBillingAddressPos) {
             ((Button) getView().findViewById(R.id.button_primary)).setEnabled(true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialog.java
new file mode 100644
index 0000000..bdc09853
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialog.java
@@ -0,0 +1,96 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill.settings;
+
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.provider.Browser;
+import android.text.SpannableString;
+import android.view.View;
+
+import androidx.browser.customtabs.CustomTabsIntent;
+
+import org.chromium.base.Callback;
+import org.chromium.base.IntentUtils;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.LaunchIntentDispatcher;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modaldialog.SimpleModalDialogController;
+import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.text.NoUnderlineClickableSpan;
+import org.chromium.ui.text.SpanApplier;
+import org.chromium.ui.text.SpanApplier.SpanInfo;
+
+/**
+ * Dialog that confirms whether the user wishes to unenroll their card from Virtual Cards.
+ */
+public class AutofillVirtualCardUnenrollmentDialog {
+    // LINT.IfChange
+    private static final String VIRTUAL_CARD_ENROLLMENT_SUPPORT_URL =
+            "https://support.google.com/googlepay/answer/11234179?hl=en";
+    // LINT.ThenChange(//components/autofill/core/browser/payments/payments_service_url.cc)
+
+    private final Context mContext;
+    private final ModalDialogManager mModalDialogManager;
+    private final Callback<Boolean> mResultHandler;
+
+    public AutofillVirtualCardUnenrollmentDialog(Context context,
+            ModalDialogManager modalDialogManager, Callback<Boolean> resultHandler) {
+        mContext = context;
+        mModalDialogManager = modalDialogManager;
+        mResultHandler = resultHandler;
+    }
+
+    /**
+     * Shows an AutofillVirtualCardUnenrollmentDialog.
+     */
+    public void show() {
+        SimpleModalDialogController modalDialogController =
+                new SimpleModalDialogController(mModalDialogManager, result -> {
+                    mResultHandler.onResult(result == DialogDismissalCause.POSITIVE_BUTTON_CLICKED);
+                });
+        PropertyModel.Builder builder =
+                new PropertyModel.Builder(ModalDialogProperties.ALL_KEYS)
+                        .with(ModalDialogProperties.CONTROLLER, modalDialogController)
+                        .with(ModalDialogProperties.TITLE,
+                                mContext.getString(
+                                        R.string.autofill_credit_card_editor_virtual_card_unenroll_dialog_title))
+                        .with(ModalDialogProperties.MESSAGE, buildUnenrollMessageWithLink())
+                        .with(ModalDialogProperties.POSITIVE_BUTTON_TEXT,
+                                mContext.getString(
+                                        R.string.autofill_credit_card_editor_virtual_card_unenroll_dialog_positive_button_label))
+                        .with(ModalDialogProperties.NEGATIVE_BUTTON_TEXT,
+                                mContext.getString(android.R.string.cancel));
+
+        mModalDialogManager.showDialog(builder.build(), ModalDialogManager.ModalDialogType.APP);
+    }
+
+    private SpannableString buildUnenrollMessageWithLink() {
+        return SpanApplier.applySpans(
+                mContext.getString(
+                        R.string.autofill_credit_card_editor_virtual_card_unenroll_dialog_message,
+                        VIRTUAL_CARD_ENROLLMENT_SUPPORT_URL),
+                new SpanInfo("<link1>", "</link1>",
+                        new NoUnderlineClickableSpan(
+                                mContext.getResources(), createOpenMyActivityCallback())));
+    }
+
+    private Callback<View> createOpenMyActivityCallback() {
+        return (widget) -> {
+            CustomTabsIntent customTabIntent =
+                    new CustomTabsIntent.Builder().setShowTitle(true).build();
+            customTabIntent.intent.setData(Uri.parse(VIRTUAL_CARD_ENROLLMENT_SUPPORT_URL));
+            Intent intent = LaunchIntentDispatcher.createCustomTabActivityIntent(
+                    mContext, customTabIntent.intent);
+            intent.setPackage(mContext.getPackageName());
+            intent.putExtra(Browser.EXTRA_APPLICATION_ID, mContext.getPackageName());
+            IntentUtils.addTrustedIntentExtras(intent);
+            IntentUtils.safeStartActivity(mContext, intent);
+        };
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
index de615fc..3747248 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
@@ -203,7 +203,8 @@
 
         BuildInfo.setFirebaseAppId(FirebaseConfig.getFirebaseAppId());
 
-        if (!isIsolatedProcess) {
+        // WebView installs its own PureJavaExceptionHandler.
+        if (!isIsolatedProcess && !isWebViewProcess()) {
             // Incremental install disables process isolation, so things in this block will
             // actually be run for incremental apks, but not normal apks.
             PureJavaExceptionHandler.installHandler(() -> {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
index 7d07054c..b4afddc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFieldTrial.java
@@ -72,7 +72,6 @@
             ContextualSearchSwitch.IS_PAGE_CONTENT_NOTIFICATION_DISABLED,
             ContextualSearchSwitch.IS_UKM_RANKER_LOGGING_DISABLED,
             ContextualSearchSwitch.IS_CONTEXTUAL_SEARCH_ML_TAP_SUPPRESSION_ENABLED,
-            ContextualSearchSwitch.IS_CONTEXTUAL_SEARCH_SECOND_TAP_ML_OVERRIDE_ENABLED,
             ContextualSearchSwitch.IS_CONTEXTUAL_SEARCH_TAP_DISABLE_OVERRIDE_ENABLED,
             ContextualSearchSwitch.IS_SEND_BASE_PAGE_URL_DISABLED})
     @Retention(RetentionPolicy.SOURCE)
@@ -141,17 +140,15 @@
         int IS_UKM_RANKER_LOGGING_DISABLED = 17;
         /** Whether or not ML-based Tap suppression is enabled. */
         int IS_CONTEXTUAL_SEARCH_ML_TAP_SUPPRESSION_ENABLED = 18;
-        /** Whether or not to override an ML-based Tap suppression on a second tap. */
-        int IS_CONTEXTUAL_SEARCH_SECOND_TAP_ML_OVERRIDE_ENABLED = 19;
         /**
          * Whether or not to override tap-disable for users that have never opened the
          * panel.
          */
-        int IS_CONTEXTUAL_SEARCH_TAP_DISABLE_OVERRIDE_ENABLED = 20;
+        int IS_CONTEXTUAL_SEARCH_TAP_DISABLE_OVERRIDE_ENABLED = 19;
         /** Whether sending the URL of the page viewed by the user is disabled. */
-        int IS_SEND_BASE_PAGE_URL_DISABLED = 21;
+        int IS_SEND_BASE_PAGE_URL_DISABLED = 20;
 
-        int NUM_ENTRIES = 22;
+        int NUM_ENTRIES = 21;
     }
 
     @VisibleForTesting
@@ -180,7 +177,6 @@
             "disable_page_content_notification", // IS_PAGE_CONTENT_NOTIFICATION_DISABLED
             "disable_ukm_ranker_logging", // IS_UKM_RANKER_LOGGING_DISABLED
             ChromeFeatureList.CONTEXTUAL_SEARCH_ML_TAP_SUPPRESSION, // (related to Chrome Feature)
-            ChromeFeatureList.CONTEXTUAL_SEARCH_SECOND_TAP, // (related to Chrome Feature)
             ChromeFeatureList.CONTEXTUAL_SEARCH_TAP_DISABLE_OVERRIDE, // (related to Chrome Feature)
             "disable_send_url" // IS_SEND_BASE_PAGE_URL_DISABLED
     };
@@ -259,7 +255,6 @@
         if (sSwitches[value] == null) {
             switch (value) {
                 case ContextualSearchSwitch.IS_CONTEXTUAL_SEARCH_ML_TAP_SUPPRESSION_ENABLED:
-                case ContextualSearchSwitch.IS_CONTEXTUAL_SEARCH_SECOND_TAP_ML_OVERRIDE_ENABLED:
                 case ContextualSearchSwitch.IS_CONTEXTUAL_SEARCH_TAP_DISABLE_OVERRIDE_ENABLED:
                     sSwitches[value] =
                             ChromeFeatureList.isEnabled(ContextualSearchSwitchNames[value]);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
index 51c1cb4..e00f1218 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
@@ -1028,15 +1028,6 @@
     }
 
     /**
-     * Log whether results were seen due to a Tap that was allowed to override an ML suppression.
-     * @param wasSearchContentViewSeen If the panel was opened.
-     */
-    static void logSecondTapMlOverrideResultsSeen(boolean wasSearchContentViewSeen) {
-        RecordHistogram.recordBooleanHistogram(
-                "Search.ContextualSearchSecondTapMlOverrideSeen", wasSearchContentViewSeen);
-    }
-
-    /**
      * Logs whether results were seen based on the duration of the Tap, for both short and long
      * durations.
      * @param wasSearchContentViewSeen If the panel was opened.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/SecondTapMlOverride.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/SecondTapMlOverride.java
deleted file mode 100644
index 491c6c4..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/SecondTapMlOverride.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// 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.contextualsearch;
-
-import org.chromium.chrome.browser.contextualsearch.ContextualSearchFieldTrial.ContextualSearchSwitch;
-
-/**
- * Provides a {@link ContextualSearchHeuristic} that allows a second tap near a previous
- * ML-suppressed tap to override suppression.
- */
-class SecondTapMlOverride extends ContextualSearchHeuristic {
-    // Tap must be between about 1/4 second and 3 seconds after the previous tap.
-    private static final long TIME_THRESHOLD_MAX_NANOSECONDS = 3_000_000_000L;
-    private static final long TIME_THRESHOLD_MIN_NANOSECONDS = 200_000_000L;
-    // Tap must be within 30 dips of the previous tap.
-    private static final int TAP_RADIUS_DPS = 30;
-
-    private final boolean mIsSecondTapEnabled;
-    private final float mPxToDp;
-    private final boolean mIsConditionSatisfied; // whether to override suppression or not.
-
-    /**
-     * Constructs a heuristic to decide if a Second Tap should override ML suppression or not.
-     * @param controller The Selection Controller.
-     * @param previousTapState The specifics regarding the previous Tap.
-     * @param x The x coordinate of the current tap.
-     * @param y The y coordinate of the current tap.
-     */
-    SecondTapMlOverride(ContextualSearchSelectionController controller,
-            ContextualSearchTapState previousTapState, int x, int y) {
-        mIsSecondTapEnabled = ContextualSearchFieldTrial.getSwitch(
-                ContextualSearchSwitch.IS_CONTEXTUAL_SEARCH_SECOND_TAP_ML_OVERRIDE_ENABLED);
-        mPxToDp = controller.getPxToDp();
-
-        mIsConditionSatisfied = previousTapState != null && previousTapState.wasMlSuppressed()
-                && shouldOverrideSecondTap(previousTapState, x, y);
-    }
-
-    @Override
-    protected boolean isConditionSatisfiedAndEnabled() {
-        return false;
-    }
-
-    @Override
-    protected boolean shouldOverrideMlTapSuppression() {
-        return mIsSecondTapEnabled && mIsConditionSatisfied;
-    }
-
-    @Override
-    protected void logRankerTapSuppression(ContextualSearchInteractionRecorder logger) {
-        logger.logFeature(ContextualSearchInteractionRecorder.Feature.IS_SECOND_TAP_OVERRIDE,
-                shouldOverrideMlTapSuppression());
-    }
-
-    @Override
-    protected void logResultsSeen(boolean wasSearchContentViewSeen, boolean wasActivatedByTap) {
-        if (wasActivatedByTap && shouldOverrideMlTapSuppression()) {
-            ContextualSearchUma.logSecondTapMlOverrideResultsSeen(wasSearchContentViewSeen);
-        }
-    }
-
-    /**
-     * Determines whether a second tap at the given coordinates should override ML suppression.
-     * @param tapState The specifics regarding the previous Tap.
-     * @param x The x coordinate of the current tap.
-     * @param y The y coordinate of the current tap.
-     * @return whether a second tap at the given coordinates should override or not.
-     */
-    private boolean shouldOverrideSecondTap(ContextualSearchTapState tapState, int x, int y) {
-        // The second tap needs to be close to the first tap in both time and space.
-        // Recent enough?
-        long timeSinceLastTap = System.nanoTime() - tapState.tapTimeNanoseconds();
-        if (timeSinceLastTap < TIME_THRESHOLD_MIN_NANOSECONDS
-                || timeSinceLastTap > TIME_THRESHOLD_MAX_NANOSECONDS) {
-            return false;
-        }
-
-        // Within our radius?
-        float deltaXDp = (tapState.getX() - x) * mPxToDp;
-        float deltaYDp = (tapState.getY() - y) * mPxToDp;
-        // Use x^2 * y^2 = r^2
-        float distanceSquaredDp = deltaXDp * deltaXDp + deltaYDp * deltaYDp;
-        return distanceSquaredDp <= TAP_RADIUS_DPS * TAP_RADIUS_DPS;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/TapSuppressionHeuristics.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/TapSuppressionHeuristics.java
index 3c7c95d..fc43d1c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/TapSuppressionHeuristics.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/TapSuppressionHeuristics.java
@@ -44,8 +44,6 @@
         mHeuristics.add(new BarOverlapTapSuppression(selectionController, y));
         mHeuristics.add(new ShortTextRunSuppression(contextualSearchContext, elementRunLength));
         mHeuristics.add(new SmallTextSuppression(fontSizeDips));
-        // Second Tap ML Override.
-        mHeuristics.add(new SecondTapMlOverride(selectionController, previousTapState, x, y));
         // Quick Answer that appears in the Caption via the JS API.
         QuickAnswersHeuristic quickAnswersHeuristic = new QuickAnswersHeuristic();
         setQuickAnswersHeuristic(quickAnswersHeuristic);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java
index b55b198..ff87911 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.crash;
 
+import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.MainDex;
 import org.chromium.base.annotations.UsedByReflection;
 import org.chromium.base.task.PostTask;
@@ -19,9 +20,12 @@
 @UsedByReflection("SplitCompatApplication.java")
 public class ChromePureJavaExceptionReporter extends PureJavaExceptionReporter {
     private static final String CHROME_CRASH_PRODUCT_NAME = "Chrome_Android";
+    private static final String FILE_PREFIX = "chromium-browser-minidump-";
 
     @UsedByReflection("SplitCompatApplication.java")
-    public ChromePureJavaExceptionReporter() {}
+    public ChromePureJavaExceptionReporter() {
+        super(ContextUtils.getApplicationContext().getCacheDir());
+    }
 
     @Override
     protected String getProductName() {
@@ -33,6 +37,11 @@
         LogcatExtractionRunnable.uploadMinidump(minidump, true);
     }
 
+    @Override
+    protected String getMinidumpPrefix() {
+        return FILE_PREFIX;
+    }
+
     /**
      * Report and upload the device info and stack trace as if it was a crash. Runs synchronously
      * and results in I/O on the main thread.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
index b705531..3aea3fa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -91,6 +91,7 @@
     public static final long UNKNOWN_BYTES_RECEIVED = -1;
 
     private static final Set<String> sFirstSeenDownloadIds = new HashSet<String>();
+    private static final Set<String> sInProgressCCTDownloadIds = new HashSet<String>();
 
     private static DownloadManagerService sDownloadManagerService;
     private static boolean sIsNetworkListenerDisabled;
@@ -210,6 +211,23 @@
     }
 
     /**
+     * Methods to modify the set of downloads currently being downloaded through the new CCT
+     * downloads UI.
+     * @param guid GUID of the offline item.
+     */
+    public static void addCCTDownload(String guid) {
+        sInProgressCCTDownloadIds.add(guid);
+    }
+
+    public static boolean inProgressCCTDownloadsContains(String guid) {
+        return sInProgressCCTDownloadIds.contains(guid);
+    }
+
+    public static void removeCCTDownload(String guid) {
+        sInProgressCCTDownloadIds.remove(guid);
+    }
+
+    /**
      * For tests only: sets the DownloadManagerService.
      * @param service An instance of DownloadManagerService.
      * @return Null or a currently set instance of DownloadManagerService.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
index 5bc6bafc2..538ada5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java
@@ -467,10 +467,26 @@
         return false;
     }
 
+    /**
+     * Opens a completed download.
+     * @param filePath File path on disk of the download to open.
+     * @param mimeType MIME type of the downloaded file.
+     * @param downloadGuid Unique GUID of the download.
+     * @param otrProfileID User's OTRProfileID.
+     * @param originalUrl URL which initially triggered the download itself.
+     * @param referer URL of the page which redirected to the download URL.
+     * @param source Where this download was initiated from.
+     */
     @CalledByNative
-    static void openDownload(String filePath, String mimeType, String downloadGuid,
+    public static void openDownload(String filePath, String mimeType, String downloadGuid,
             OTRProfileID otrProfileID, String originalUrl, String referer,
             @DownloadOpenSource int source) {
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.CCT_NEW_DOWNLOAD_TAB)
+                && source == DownloadOpenSource.UNKNOWN
+                && DownloadManagerService.inProgressCCTDownloadsContains(downloadGuid)) {
+            DownloadManagerService.removeCCTDownload(downloadGuid);
+            return;
+        }
         boolean canOpen = DownloadUtils.openFile(filePath, mimeType, downloadGuid, otrProfileID,
                 originalUrl, referer, source, ContextUtils.getApplicationContext());
         if (!canOpen) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
index d1ede0a..af1aa4a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
@@ -15,11 +15,14 @@
 import android.content.IntentFilter;
 import android.content.res.Configuration;
 import android.graphics.drawable.Icon;
+import android.os.Build;
 import android.util.Rational;
 import android.view.View;
 import android.view.View.OnLayoutChangeListener;
 import android.view.ViewGroup;
 
+import androidx.annotation.RequiresApi;
+
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
 import org.chromium.base.MathUtils;
@@ -195,8 +198,10 @@
     }
 
     @Override
+    @RequiresApi(api = Build.VERSION_CODES.O)
     public void onPictureInPictureModeChanged(
             boolean isInPictureInPictureMode, Configuration newConfig) {
+        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
         if (!isInPictureInPictureMode) this.finish();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
index 698c9a98..798fd51 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -199,7 +199,7 @@
                 VoiceToolbarButtonController::isToolbarMicEnabled, new DummyJankTracker(),
                 /*ExploreIconState*/(pixelSize, callback) ->{},
                 /*userEducationHelper=*/null, /*merchantTrustSignalsCoordinatorSupplier=*/null,
-                new OmniboxPedalDelegateImpl(this));
+                new OmniboxPedalDelegateImpl(this), null);
         // clang-format on
         mLocationBarCoordinator.setUrlBarFocusable(true);
         mLocationBarCoordinator.setShouldShowMicButtonWhenUnfocused(true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index 2a573f7..7ba981f4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -624,9 +624,10 @@
                     exploreIconProvider,
                     new UserEducationHelper(mActivity, mHandler),
                     merchantTrustSignalsCoordinatorSupplier,
-                    omniboxPedalDelegate);
+                    omniboxPedalDelegate, mControlsVisibilityDelegate);
             // clang-format on
             toolbarLayout.setLocationBarCoordinator(locationBarCoordinator);
+            toolbarLayout.setBrowserControlsVisibilityDelegate(mControlsVisibilityDelegate);
             mLocationBar = locationBarCoordinator;
         }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditorTest.java
new file mode 100644
index 0000000..22e794e
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditorTest.java
@@ -0,0 +1,190 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill.settings;
+
+import static androidx.test.espresso.Espresso.onView;
+import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.isChecked;
+import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
+import static androidx.test.espresso.matcher.ViewMatchers.isNotChecked;
+import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
+import static androidx.test.espresso.matcher.ViewMatchers.withId;
+import static androidx.test.espresso.matcher.ViewMatchers.withText;
+
+import android.os.Bundle;
+
+import androidx.test.espresso.matcher.ViewMatchers.Visibility;
+import androidx.test.filters.MediumTest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.util.Batch;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.autofill.AutofillTestHelper;
+import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.settings.SettingsActivityTestRule;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.components.autofill.VirtualCardEnrollmentState;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Instrumentation tests for AutofillServerCardEditor.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@Batch(Batch.PER_CLASS)
+public class AutofillServerCardEditorTest {
+    @Rule
+    public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor();
+    @Rule
+    public final AutofillTestRule rule = new AutofillTestRule();
+    @Rule
+    public final SettingsActivityTestRule<AutofillServerCardEditor> mSettingsActivityTestRule =
+            new SettingsActivityTestRule<>(AutofillServerCardEditor.class);
+
+    private static final CreditCard SAMPLE_VIRTUAL_CARD_ENROLLED_CARD = new CreditCard(
+            /* guid= */ "1", /* origin= */ "", /* isLocal= */ false, /* isCached= */ true,
+            /* name= */ "John Doe", /* number= */ "4444333322221111", /* obfuscatedNumber= */ "",
+            /* month= */ "5", AutofillTestHelper.nextYear(), /* basicCardIssuerNetwork = */ "visa",
+            /* issuerIconDrawableId= */ 0, /* billingAddressId= */ "", /* serverId= */ "",
+            /* instrumentId= */ 0, /* cardLabel= */ "", /* nickname= */ "", /* cardArtUrl= */ null,
+            /* virtualCardEnrollmentState= */ VirtualCardEnrollmentState.ENROLLED);
+
+    private static final CreditCard SAMPLE_VIRTUAL_CARD_UNENROLLED_AND_ELIGIBLE_CARD =
+            new CreditCard(/* guid= */ "2", /* origin= */ "", /* isLocal= */ false,
+                    /* isCached= */ true, /* name= */ "John Doe", /* number= */ "4444333322221111",
+                    /* obfuscatedNumber= */ "", /* month= */ "5", AutofillTestHelper.nextYear(),
+                    /* basicCardIssuerNetwork = */ "visa", /* issuerIconDrawableId= */ 0,
+                    /* billingAddressId= */ "", /* serverId= */ "", /* instrumentId= */ 0,
+                    /* cardLabel= */ "", /* nickname= */ "", /* cardArtUrl= */ null,
+                    /* virtualCardEnrollmentState= */
+                    VirtualCardEnrollmentState.UNENROLLED_AND_ELIGIBLE);
+
+    private static final CreditCard SAMPLE_VIRTUAL_CARD_UNENROLLED_AND_NOT_ELIGIBLE_CARD =
+            new CreditCard(/* guid= */ "3", /* origin= */ "", /* isLocal= */ false,
+                    /* isCached= */ true, /* name= */ "John Doe", /* number= */ "4444333322221111",
+                    /* obfuscatedNumber= */ "", /* month= */ "5", AutofillTestHelper.nextYear(),
+                    /* basicCardIssuerNetwork = */ "visa", /* issuerIconDrawableId= */ 0,
+                    /* billingAddressId= */ "", /* serverId= */ "", /* instrumentId= */ 0,
+                    /* cardLabel= */ "", /* nickname= */ "", /* cardArtUrl= */ null,
+                    /* virtualCardEnrollmentState= */
+                    VirtualCardEnrollmentState.UNENROLLED_AND_NOT_ELIGIBLE);
+
+    private AutofillTestHelper mAutofillTestHelper;
+
+    @Before
+    public void setUp() {
+        mAutofillTestHelper = new AutofillTestHelper();
+    }
+
+    @After
+    public void tearDown() throws TimeoutException {
+        mAutofillTestHelper.clearAllDataForTesting();
+    }
+
+    @Test
+    @MediumTest
+    @Features.EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT})
+    public void virtualCardEnrolled_virtualCardSwitchOn() throws Exception {
+        mAutofillTestHelper.addServerCreditCard(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD);
+
+        mSettingsActivityTestRule.startSettingsActivity(
+                fragmentArgs(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD.getGUID()));
+
+        onView(withId(R.id.virtual_card_ui)).check(matches(isDisplayed()));
+        onView(withId(R.id.virtual_card_enrollment_switch)).check(matches(isChecked()));
+    }
+
+    @Test
+    @MediumTest
+    @Features.EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT})
+    public void virtualCardUnenrolledAndEligible_virtualCardSwitchOff() throws Exception {
+        mAutofillTestHelper.addServerCreditCard(SAMPLE_VIRTUAL_CARD_UNENROLLED_AND_ELIGIBLE_CARD);
+
+        mSettingsActivityTestRule.startSettingsActivity(
+                fragmentArgs(SAMPLE_VIRTUAL_CARD_UNENROLLED_AND_ELIGIBLE_CARD.getGUID()));
+
+        onView(withId(R.id.virtual_card_ui)).check(matches(isDisplayed()));
+        onView(withId(R.id.virtual_card_enrollment_switch)).check(matches(isNotChecked()));
+    }
+
+    @Test
+    @MediumTest
+    @Features.EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT})
+    public void virtualCardUnenrolledAndNotEligible_virtualCardLayoutNotShown() throws Exception {
+        mAutofillTestHelper.addServerCreditCard(
+                SAMPLE_VIRTUAL_CARD_UNENROLLED_AND_NOT_ELIGIBLE_CARD);
+
+        mSettingsActivityTestRule.startSettingsActivity(
+                fragmentArgs(SAMPLE_VIRTUAL_CARD_UNENROLLED_AND_NOT_ELIGIBLE_CARD.getGUID()));
+
+        onView(withId(R.id.virtual_card_ui))
+                .check(matches(withEffectiveVisibility(Visibility.GONE)));
+    }
+
+    @Test
+    @MediumTest
+    @Features.DisableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT})
+    public void updateEnrollmentFeatureDisabled_virtualCardLayoutNotShown() throws Exception {
+        mAutofillTestHelper.addServerCreditCard(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD);
+
+        mSettingsActivityTestRule.startSettingsActivity(
+                fragmentArgs(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD.getGUID()));
+
+        onView(withId(R.id.virtual_card_ui))
+                .check(matches(withEffectiveVisibility(Visibility.GONE)));
+    }
+
+    @Test
+    @MediumTest
+    @Features.EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT})
+    public void virtualCardEnrolled_virtualCardSwitchedOff_dialogShown() throws Exception {
+        mAutofillTestHelper.addServerCreditCard(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD);
+
+        mSettingsActivityTestRule.startSettingsActivity(
+                fragmentArgs(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD.getGUID()));
+
+        onView(withId(R.id.virtual_card_ui)).check(matches(isDisplayed()));
+        onView(withId(R.id.virtual_card_enrollment_switch)).check(matches(isChecked()));
+
+        onView(withId(R.id.virtual_card_enrollment_switch)).perform(click());
+        onView(withText(R.string.autofill_credit_card_editor_virtual_card_unenroll_dialog_title))
+                .check(matches(isDisplayed()));
+    }
+
+    @Test
+    @MediumTest
+    @Features.EnableFeatures({ChromeFeatureList.AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT})
+    public void virtualCardEnrolled_virtualCardSwitchedOff_UnenrollCancelled() throws Exception {
+        mAutofillTestHelper.addServerCreditCard(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD);
+
+        mSettingsActivityTestRule.startSettingsActivity(
+                fragmentArgs(SAMPLE_VIRTUAL_CARD_ENROLLED_CARD.getGUID()));
+
+        onView(withId(R.id.virtual_card_ui)).check(matches(isDisplayed()));
+        onView(withId(R.id.virtual_card_enrollment_switch)).check(matches(isChecked()));
+
+        onView(withId(R.id.virtual_card_enrollment_switch)).perform(click());
+        onView(withText(R.string.autofill_credit_card_editor_virtual_card_unenroll_dialog_title))
+                .check(matches(isDisplayed()));
+
+        onView(withText(android.R.string.cancel)).perform(click());
+        onView(withId(R.id.virtual_card_enrollment_switch)).check(matches(isChecked()));
+    }
+
+    private Bundle fragmentArgs(String guid) {
+        Bundle args = new Bundle();
+        args.putString(AutofillEditorBase.AUTOFILL_GUID, guid);
+        return args;
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index 964bbcb..b7eaf69 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -1519,7 +1519,8 @@
     @Test
     @SmallTest
     @Feature({"ContextualSearch"})
-    // Ranker is only used for Tap triggering.
+    @DisabledTest(message = "https://crbug.com/1291065")
+    // TODO(donnd): remove with Ranker support.
     public void testResolvingSearchRankerLogging() throws Exception {
         FeatureList.setTestFeatures(ENABLE_NONE);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java
index 80d21ebd..e44d932b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadManagerServiceTest.java
@@ -16,7 +16,9 @@
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.Batch;
@@ -27,6 +29,7 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.test.ChromeBrowserTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.offline_items_collection.ContentId;
 import org.chromium.components.offline_items_collection.OfflineItem.Progress;
 import org.chromium.components.offline_items_collection.OfflineItemProgressUnit;
@@ -227,6 +230,9 @@
         }
     }
 
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
     private DownloadManagerServiceForTest mService;
 
     @After
@@ -412,4 +418,32 @@
         notifier.waitTillExpectedCallsComplete();
         Assert.assertTrue("All downloads should be updated.", matchSet.mMatches.isEmpty());
     }
+
+    @Test
+    @MediumTest
+    @Feature({"Download"})
+    @Features.EnableFeatures({ChromeFeatureList.CCT_NEW_DOWNLOAD_TAB})
+    public void testCCTDownloads() {
+        Assert.assertTrue(ChromeFeatureList.isEnabled(ChromeFeatureList.CCT_NEW_DOWNLOAD_TAB));
+        if (useDownloadOfflineContentProvider()) return;
+        MockDownloadNotifier notifier = new MockDownloadNotifier();
+        createDownloadManagerService(notifier, UPDATE_DELAY_FOR_TEST);
+        TestThreadUtils.runOnUiThreadBlocking(
+                (Runnable) () -> DownloadManagerService.setDownloadManagerService(mService));
+        // Try calling download completed directly.
+        DownloadInfo successful = getDownloadInfo();
+        notifier.expect(MethodID.DOWNLOAD_SUCCESSFUL, successful);
+
+        // Add the download to the inProgressCCTDownloads set before the download starts.
+        DownloadManagerService.addCCTDownload(successful.getDownloadGuid());
+        Assert.assertTrue(DownloadManagerService.inProgressCCTDownloadsContains(
+                successful.getDownloadGuid()));
+
+        mService.onDownloadCompleted(successful);
+        notifier.waitTillExpectedCallsComplete();
+
+        // Check that the download has been removed from the set after downloading successfully.
+        Assert.assertFalse(DownloadManagerService.inProgressCCTDownloadsContains(
+                successful.getDownloadGuid()));
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewRenderTest.java
index 748a9dd..e434201 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewRenderTest.java
@@ -94,8 +94,6 @@
                     ToolbarTestUtils.OFFLINE_STATUS, mSearchEngineLogoUtils);
             // clang-format on
             mLocationBarModel.setTab(null, /*  incognito= */ false);
-            mStatusView.setLocationBarDataProvider(mLocationBarModel);
-            mStatusView.setSearchEngineLogoUtils(mSearchEngineLogoUtils);
             mStatusModel = new PropertyModel.Builder(StatusProperties.ALL_KEYS).build();
             PropertyModelChangeProcessor.create(mStatusModel, mStatusView, new StatusViewBinder());
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java
index 62a4cd9..3d5f5b21 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/status/StatusViewTest.java
@@ -34,12 +34,9 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.omnibox.NewTabPageDelegate;
 import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils;
 import org.chromium.chrome.browser.omnibox.status.StatusProperties.StatusIconResource;
-import org.chromium.chrome.browser.toolbar.LocationBarModel;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
-import org.chromium.chrome.test.util.ToolbarTestUtils;
 import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -77,12 +74,6 @@
                                   .inflate(R.layout.location_status, view, true)
                                   .findViewById(R.id.location_bar_status);
             mStatusView.setCompositeTouchDelegate(new CompositeTouchDelegate(view));
-            // clang-format off
-            mStatusView.setLocationBarDataProvider(new LocationBarModel(
-                    mStatusView.getContext(), NewTabPageDelegate.EMPTY, (url) -> url.getSpec(),
-                    (window) -> null, ToolbarTestUtils.OFFLINE_STATUS, mSearchEngineLogoUtils));
-            // clang-format on
-            mStatusView.setSearchEngineLogoUtils(mSearchEngineLogoUtils);
             mStatusModel = new PropertyModel.Builder(StatusProperties.ALL_KEYS).build();
             mStatusMCP = PropertyModelChangeProcessor.create(
                     mStatusModel, mStatusView, new StatusViewBinder());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java
index 37ec39f..55643e1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java
@@ -63,6 +63,9 @@
     @Mock
     HeaderProcessor mMockHeaderProcessor;
 
+    @Mock
+    OmniboxPedalDelegate mMockOmniboxPedalDelegate;
+
     DropdownItemViewInfoListBuilder mBuilder;
 
     @Before
@@ -79,7 +82,7 @@
         when(mMockHeaderProcessor.getViewTypeId()).thenReturn(OmniboxSuggestionUiType.HEADER);
 
         mBuilder = new DropdownItemViewInfoListBuilder(
-                () -> null, (url) -> false, (pixelSize, callback) -> {});
+                () -> null, (url) -> false, (pixelSize, callback) -> {}, mMockOmniboxPedalDelegate);
         mBuilder.registerSuggestionProcessor(mMockSuggestionProcessor);
         mBuilder.setHeaderProcessorForTest(mMockHeaderProcessor);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java
index a4fe4e69..104d858 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/editurl/EditUrlSuggestionUnitTest.java
@@ -204,6 +204,7 @@
     @Test
     @SmallTest
     @UiThreadTest
+    @FlakyTest(message = "https://crbug.com/1293353")
     public void testWhatYouTypedWrongUrl_Incognito() {
         verifyWhatYouTypedWrongUrl(/* isIncognito */ true);
     }
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
index 6072b55b..c4d7720 100644
--- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
+++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
@@ -33,6 +33,7 @@
 import org.robolectric.Shadows;
 import org.robolectric.android.controller.ActivityController;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowActivityManager;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowPackageManager;
@@ -54,6 +55,7 @@
 /** Tests launching WebAPK. */
 @RunWith(LocalRobolectricTestRunner.class)
 @Config(manifest = Config.NONE, shadows = {CustomAndroidOsShadowAsyncTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public final class LaunchTest {
     /** Values based on manifest specified in GN file. */
     private static final String BROWSER_PACKAGE_NAME = "com.google.android.apps.chrome";
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java
index bb4cdd5..a394e0b 100644
--- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java
+++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java
@@ -29,6 +29,7 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowActivityManager;
 import org.robolectric.shadows.ShadowApplication;
 import org.robolectric.shadows.ShadowPackageManager;
@@ -47,6 +48,7 @@
 @Config(manifest = Config.NONE,
         shadows = {SplashActivityTest.MockLaunchHostBrowserSelector.class,
                 CustomAndroidOsShadowAsyncTask.class})
+@LooperMode(LooperMode.Mode.LEGACY)
 public final class SplashActivityTest {
     public static final String BROWSER_PACKAGE_NAME = "com.google.android.apps.chrome";
 
diff --git a/chrome/app/access_code_cast_strings.grdp b/chrome/app/access_code_cast_strings.grdp
index f734a26..3e34e32 100644
--- a/chrome/app/access_code_cast_strings.grdp
+++ b/chrome/app/access_code_cast_strings.grdp
@@ -2,7 +2,7 @@
 <!-- Access Code Cast-specific strings (included from generated_resources.grd). -->
 <grit-part>
   <message name="IDS_ACCESS_CODE_CAST_ACCESS_CODE_MESSAGE" desc="Text shown in the access code cast dialog that describes that the access code is found on a Chromecast device">
-    Enter the access code shown on the Chromecast or TV.
+    Enter the access code shown on the Chromecast or TV to start casting your screen.
   </message>
   <message name="IDS_ACCESS_CODE_CAST_BACK" desc="Label for the 'back' button to return to the previous screen">
     Back
@@ -13,17 +13,17 @@
   <message name="IDS_ACCESS_CODE_CAST_CONNECT" desc="Button text to connect to a cast device by typing an access code which is a string consisting of letters, or by scanning a qr code">
     Connect with a code
   </message>
-  <message name="IDS_ACCESS_CODE_CAST_DIALOG_TITLE" desc="Title for access code cast dialog, for casting to a display that is managed">
-    Cast to a managed device
+  <message name="IDS_ACCESS_CODE_CAST_DIALOG_TITLE" desc="Title for access code cast dialog, for casting to a display that is controlled with a typed code">
+    Connect with a code to cast
   </message>
   <message name="IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE" desc="Error message for incorrect access code">
-    Access code not recognized
+    You've entered an incorrect access code. Try again.
   </message>
   <message name="IDS_ACCESS_CODE_CAST_ERROR_NETWORK" desc="Error message for network communication issues">
-    Network communication issues
+    Can't connect to the internet. Try again.
   </message>
   <message name="IDS_ACCESS_CODE_CAST_ERROR_PERMISSION" desc="Error message for insufficient permission">
-    You don't have permission to cast to this display
+    You aren't allowed to cast to this device.
   </message>
   <message name="IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS" desc="Error message for too many cast attempts">
     You have entered an incorrect access code too many times. Try again later
@@ -31,6 +31,9 @@
   <message name="IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN" desc="Error message for an unknown casting error">
     Something went wrong. Try again later
   </message>
+  <message name="IDS_ACCESS_CODE_CAST_SUBMIT" desc="Text for the button that when pressed submits an access code to attempt to start casting">
+    Submit
+  </message>
   <message name="IDS_ACCESS_CODE_CAST_USE_CAMERA" desc="Label for the button to use the device camera to scan a QR code">
     Use QR code instead
   </message>
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ACCESS_CODE_MESSAGE.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ACCESS_CODE_MESSAGE.png.sha1
index 0f68a9f..3661999 100644
--- a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ACCESS_CODE_MESSAGE.png.sha1
+++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ACCESS_CODE_MESSAGE.png.sha1
@@ -1 +1 @@
-065951dab6f85059a5990435d4f1857d6d21264e
\ No newline at end of file
+257cabdd5f9646c3e03ceead7d7aab1f756730f6
\ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_DIALOG_TITLE.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_DIALOG_TITLE.png.sha1
index 0f68a9f..3661999 100644
--- a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_DIALOG_TITLE.png.sha1
+++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_DIALOG_TITLE.png.sha1
@@ -1 +1 @@
-065951dab6f85059a5990435d4f1857d6d21264e
\ No newline at end of file
+257cabdd5f9646c3e03ceead7d7aab1f756730f6
\ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE.png.sha1
index 0520832..7648db8c 100644
--- a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE.png.sha1
+++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_ACCESS_CODE.png.sha1
@@ -1 +1 @@
-82fcd737f7ca942388ec8e9e7e1022577b5dcf69
\ No newline at end of file
+e5c348497c4ea9801f9ca256807fb6fab779b1bc
\ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_NETWORK.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_NETWORK.png.sha1
index 1ec150a8..c7b8d50 100644
--- a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_NETWORK.png.sha1
+++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_NETWORK.png.sha1
@@ -1 +1 @@
-c6cb096868098d1e3098dd4224a4affb4ed545c0
\ No newline at end of file
+f3efd23b84df0431ea877275ec0f4444f92bcd18
\ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_PERMISSION.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_PERMISSION.png.sha1
index 19b9f142..f27178a 100644
--- a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_PERMISSION.png.sha1
+++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_ERROR_PERMISSION.png.sha1
@@ -1 +1 @@
-20d67c01bcb924082fbecdd92b554bf7ce8f9985
\ No newline at end of file
+0c9ba837506b71a081ca4dfe4a58ed48aa3d9654
\ No newline at end of file
diff --git a/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_SUBMIT.png.sha1 b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_SUBMIT.png.sha1
new file mode 100644
index 0000000..3661999
--- /dev/null
+++ b/chrome/app/access_code_cast_strings_grdp/IDS_ACCESS_CODE_CAST_SUBMIT.png.sha1
@@ -0,0 +1 @@
+257cabdd5f9646c3e03ceead7d7aab1f756730f6
\ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 32805d0e6..00ed59b 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -6663,6 +6663,9 @@
       <message name="IDS_TAB_GROUPS_NAMED_GROUP_TOOLTIP" desc="Dynamic tooltip to display on hover over named tab group.">
         <ph name="GROUP_NAME">$1<ex>New Group</ex></ph> - <ph name="GROUP_CONTENT_STRING">$2<ex>"New Tab" and one other</ex></ph>
       </message>
+      <message name="IDS_TAB_AUDIO_MUTING_PROMO" desc="Text shown on the promotional UI appearing next to the tab alert indicator.">
+        Click the speaker icon to mute this tab
+      </message>
       <if expr="use_titlecase">
         <message name="IDS_PROMO_DISMISS_BUTTON" desc="Text shown on the button for the user to acknowledge that they understand the message">
           Got It
@@ -11875,12 +11878,18 @@
         =1 {Checking this file with your organization's security policies...}
       other {Checking these files with your organization's security policies...}}
     </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_PRINT_PENDING_MESSAGE" desc="Message shown in tab modal dialog while performing a deep scan of a printed document to see if it complies with enterprise policies">
+      Checking this document with your organization's security policies...
+    </message>
     <message name="IDS_DEEP_SCANNING_DIALOG_SUCCESS_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of data when it complies with enterprise policies">
       {NUM_FILES, plural,
         =0 {Security checks are done. Your data will be uploaded.}
         =1 {Security checks are done. Your file will be uploaded.}
       other {Security checks are done. Your files will be uploaded.}}
     </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_PRINT_SUCCESS_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of a printed document when it complies with enterprise policies">
+        Security checks are done. Your document will be printed.
+    </message>
     <message name="IDS_DEEP_SCANNING_DIALOG_UPLOAD_FAILURE_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of uploaded data when it doesn't comply with enterprise security policies">
       {NUM_FILES, plural,
         =0 {This data has sensitive or dangerous content. Remove this content and try again.}
@@ -11893,6 +11902,9 @@
         =1 {This file has sensitive or dangerous content}
       other {These files have sensitive or dangerous content}}
     </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_PRINT_WARNING_MESSAGE" desc="Message shown in tab modal dialog after performing a deep scan of a printed document when it doesn't comply with enterprise security policies">
+        This document has sensitive content.
+    </message>
     <message name="IDS_DEEP_SCANNING_DIALOG_TIMEOUT_MESSAGE" desc="Message shown in tab modal dialog after a deep scan times out.">
       Something went wrong. Scanning could not be completed. Please try again.
     </message>
@@ -11910,6 +11922,9 @@
         =1 {This file is too big for a security check. You can upload files up to 50 MB.}
       other {Some of these files are too big for a security check. You can upload files up to 50 MB.}}
     </message>
+    <message name="IDS_DEEP_SCANNING_DIALOG_LARGE_PRINT_FAILURE_MESSAGE" desc="Message shown in the tab modal dialog when the printed document to be scanned is too large according to the enterprise policies">
+        This document is too big for a security check. You can print documents of up to 50 MB.
+    </message>
     <message name="IDS_DEEP_SCANNING_DIALOG_ENCRYPTED_FILE_FAILURE_MESSAGE" desc="Message shown in the tab modal dialog when the uploaded file to be scanned is encrypted and when this is not allowed by enterprise policies">
       {NUM_FILES, plural,
         =1 {This file is encrypted. Ask its owner to decrypt.}
@@ -12256,6 +12271,13 @@
         Continue
       </message>
     </if>
+
+    <!-- Input overlay strings -->
+    <if expr="chromeos_ash">
+      <message name="IDS_INPUT_OVERLAY_MENU_ENTRY_BUTTON" desc="Button to access Input Overlay's settings menu.">
+        Game Control
+      </message>
+    </if>
   </messages>
 </release>
 </grit>
diff --git a/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_LARGE_PRINT_FAILURE_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_LARGE_PRINT_FAILURE_MESSAGE.png.sha1
new file mode 100644
index 0000000..ae1a74d
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_LARGE_PRINT_FAILURE_MESSAGE.png.sha1
@@ -0,0 +1 @@
+9e6a0dc07de646649355f3598f84bd4a1829144b
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_PENDING_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_PENDING_MESSAGE.png.sha1
new file mode 100644
index 0000000..63f7429
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_PENDING_MESSAGE.png.sha1
@@ -0,0 +1 @@
+cfb49b7f183c91dda22b9092cfc74d2114cce904
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_SUCCESS_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_SUCCESS_MESSAGE.png.sha1
new file mode 100644
index 0000000..73876ba
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_SUCCESS_MESSAGE.png.sha1
@@ -0,0 +1 @@
+8897a2f02542f959f9b8366c60ad6d2b51d6ff28
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_WARNING_MESSAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_WARNING_MESSAGE.png.sha1
new file mode 100644
index 0000000..bf92716b
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DEEP_SCANNING_DIALOG_PRINT_WARNING_MESSAGE.png.sha1
@@ -0,0 +1 @@
+6d8494be88bf19b95962abb59a6e08251299df4f
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_INPUT_OVERLAY_MENU_ENTRY_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_INPUT_OVERLAY_MENU_ENTRY_BUTTON.png.sha1
new file mode 100644
index 0000000..781b3cab
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_INPUT_OVERLAY_MENU_ENTRY_BUTTON.png.sha1
@@ -0,0 +1 @@
+5d81a9d207512cdc27f9715cc9c54bf66113a3ef
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_TAB_AUDIO_MUTING_PROMO.png.sha1 b/chrome/app/generated_resources_grd/IDS_TAB_AUDIO_MUTING_PROMO.png.sha1
new file mode 100644
index 0000000..b7afbdf
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_TAB_AUDIO_MUTING_PROMO.png.sha1
@@ -0,0 +1 @@
+9004760431a80f17e5661d5581b50ab37609647b
\ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index e0e0523..7be97710 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -1358,6 +1358,31 @@
   <message name="IDS_SETTINGS_PRIVACY_SANDBOX_COOKIES_DIALOG_MORE" desc="Label on the button in the dialog shown to users when they interacted with cookies to make them aware of the Privacy Sandbox.">
     More
   </message>
+  <!-- TODO(crbug.com/1286276) These strings are not final yet and therefore marked as translateable="false" -->
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_TITLE" translateable="false" desc="Title of the Trails section of the privacy sandbox settings.">
+    Trials
+  </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_SUMMARY" translateable="false" desc="Summary of the Trails section of the privacy sandbox settings.">
+    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
+  </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_TITLE" translateable="false" desc="Title of the Ad Personalization section of the privacy sandbox settings.">
+    Browser-based ad personalization
+  </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_SUMMARY" translateable="false" desc="Summary of the Ad Personalization section of the privacy sandbox settings.">
+    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
+  </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_TITLE" translateable="false" desc="Title of the Ad Measurement section of the privacy sandbox settings.">
+    Ad measurement
+  </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_SUMMARY" translateable="false" desc="Summary of the Ad Measurement section of the privacy sandbox settings.">
+    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
+  </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_TITLE" translateable="false" desc="Title of the Spam and Fraud section of the privacy sandbox settings.">
+    Spam &#38; fraud reduction
+  </message>
+  <message name="IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_SUMMARY" translateable="false" desc="Summary of the Spam and Fraud section of the privacy sandbox settings.">
+    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
+  </message>
 
   <!-- Privacy Review -->
   <message name="IDS_SETTINGS_PRIVACY_REVIEW_LABEL" desc="Label of the row in the Chrome privacy and security settings page that leads to the privacy review.">
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 95b6a1ae..99c8c9a 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -341,6 +341,8 @@
     "component_updater/subresource_filter_component_installer.h",
     "component_updater/trust_token_key_commitments_component_installer.cc",
     "component_updater/trust_token_key_commitments_component_installer.h",
+    "component_updater/updater_state.cc",
+    "component_updater/updater_state.h",
     "consent_auditor/consent_auditor_factory.cc",
     "consent_auditor/consent_auditor_factory.h",
     "content_index/content_index_metrics.cc",
@@ -5179,6 +5181,7 @@
       "lacros/download_controller_client_lacros.h",
       "lacros/drivefs_cache.cc",
       "lacros/drivefs_cache.h",
+      "lacros/external_protocol_dialog.cc",
       "lacros/feedback_util.cc",
       "lacros/feedback_util.h",
       "lacros/field_trial_observer.cc",
@@ -5280,6 +5283,10 @@
       "apps/intent_helper/chromeos_intent_picker_helpers.h",
       "apps/intent_helper/metrics/intent_handling_metrics.cc",
       "apps/intent_helper/metrics/intent_handling_metrics.h",
+      "chromeos/arc/arc_external_protocol_dialog.cc",
+      "chromeos/arc/arc_external_protocol_dialog.h",
+      "chromeos/arc/arc_web_contents_data.cc",
+      "chromeos/arc/arc_web_contents_data.h",
       "chromeos/arc/open_with_menu.cc",
       "chromeos/arc/open_with_menu.h",
       "chromeos/arc/start_smart_selection_action_menu.cc",
@@ -5340,6 +5347,7 @@
       "component_updater/recovery_improved_component_installer_win.cc",
       "component_updater/sw_reporter_installer_win.cc",
       "component_updater/sw_reporter_installer_win.h",
+      "component_updater/updater_state_win.cc",
       "download/download_status_updater_win.cc",
       "download/trusted_sources_manager_win.cc",
       "enterprise/signals/device_info_fetcher_win.cc",
@@ -5610,6 +5618,7 @@
       "chrome_browser_application_mac.mm",
       "chrome_browser_main_mac.h",
       "chrome_browser_main_mac.mm",
+      "component_updater/updater_state_mac.mm",
       "download/download_status_updater_mac.mm",
       "download/drag_download_item_mac.mm",
       "enterprise/signals/device_info_fetcher_mac.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9359be7..bf533e476 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1511,7 +1511,7 @@
      "hover)",
      kRealboxMatchOmniboxThemeVar1, base::size(kRealboxMatchOmniboxThemeVar1),
      nullptr},
-    {"(NTP background on steady state and Omnibox steady state background on "
+    {"(NTP background on steady state and Omnibox active state background on "
      "hover)",
      kRealboxMatchOmniboxThemeVar2, base::size(kRealboxMatchOmniboxThemeVar2),
      nullptr}};
@@ -2890,10 +2890,6 @@
      flag_descriptions::kContextualSearchRankerQueryName,
      flag_descriptions::kContextualSearchRankerQueryDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(assist_ranker::kContextualSearchRankerQuery)},
-    {"contextual-search-second-tap",
-     flag_descriptions::kContextualSearchSecondTapName,
-     flag_descriptions::kContextualSearchSecondTapDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(chrome::android::kContextualSearchSecondTap)},
     {"contextual-search-twv-impl",
      flag_descriptions::kContextualSearchThinWebViewImplementationName,
      flag_descriptions::kContextualSearchThinWebViewImplementationDescription,
@@ -3685,6 +3681,9 @@
      flag_descriptions::kCrostiniVirtualKeyboardSupportName,
      flag_descriptions::kCrostiniVirtualKeyboardSupportDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kCrostiniVirtualKeyboardSupport)},
+    {"bruschetta", flag_descriptions::kBruschettaName,
+     flag_descriptions::kBruschettaDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(chromeos::features::kBruschetta)},
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 #if (BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || \
      BUILDFLAG(IS_ANDROID)) &&                        \
@@ -4512,6 +4511,9 @@
     {"files-trash", flag_descriptions::kFilesTrashName,
      flag_descriptions::kFilesTrashDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(chromeos::features::kFilesTrash)},
+    {"files-web-drive-office", flag_descriptions::kFilesWebDriveOfficeName,
+     flag_descriptions::kFilesWebDriveOfficeDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(chromeos::features::kFilesWebDriveOffice)},
     {"force-spectre-v2-mitigation",
      flag_descriptions::kForceSpectreVariant2MitigationName,
      flag_descriptions::kForceSpectreVariant2MitigationDescription, kOsCrOS,
@@ -5300,6 +5302,11 @@
      flag_descriptions::kStoreHoursAndroidDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kStoreHoursAndroid)},
 
+    {"suppress-toolbar-captures",
+     flag_descriptions::kSuppressToolbarCapturesName,
+     flag_descriptions::kSuppressToolbarCapturesDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kSuppressToolbarCaptures)},
+
     {"enable-tab-grid-layout", flag_descriptions::kTabGridLayoutAndroidName,
      flag_descriptions::kTabGridLayoutAndroidDescription, kOsAndroid,
      FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kTabGridLayoutAndroid,
@@ -5420,14 +5427,14 @@
 #if !BUILDFLAG(IS_ANDROID)
     {"enable-accessibility-live-caption",
      flag_descriptions::kEnableAccessibilityLiveCaptionName,
-     flag_descriptions::kEnableAccessibilityLiveCaptionDescription, kOsDesktop,
+     flag_descriptions::kEnableAccessibilityLiveCaptionDescription, kOsAll,
      FEATURE_VALUE_TYPE(media::kLiveCaption)},
+#endif  // !BUILDFLAG(IS_ANDROID)
 
     {"enable-auto-disable-accessibility",
      flag_descriptions::kEnableAutoDisableAccessibilityName,
      flag_descriptions::kEnableAutoDisableAccessibilityDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kAutoDisableAccessibility)},
-#endif  // !BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_ANDROID)
     {"cct-incognito", flag_descriptions::kCCTIncognitoName,
@@ -6437,6 +6444,10 @@
          "PhotoPickerVideoSupportFeatureVariations")},
 #endif  // BUILDFLAG(IS_ANDROID)
 
+    {"full-user-agent", flag_descriptions::kFullUserAgentName,
+     flag_descriptions::kFullUserAgentDescription, kOsDesktop | kOsAndroid,
+     FEATURE_VALUE_TYPE(blink::features::kFullUserAgent)},
+
     {"reduce-user-agent", flag_descriptions::kReduceUserAgentName,
      flag_descriptions::kReduceUserAgentDescription, kOsDesktop | kOsAndroid,
      FEATURE_VALUE_TYPE(blink::features::kReduceUserAgent)},
@@ -6572,6 +6583,11 @@
      flag_descriptions::kNearbySharingOnePageOnboardingName,
      flag_descriptions::kNearbySharingOnePageOnboardingDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(features::kNearbySharingOnePageOnboarding)},
+    {"nearby-sharing-receive-wifi-credentials",
+     flag_descriptions::kNearbySharingReceiveWifiCredentialsName,
+     flag_descriptions::kNearbySharingReceiveWifiCredentialsDescription,
+     kOsCrOS,
+     FEATURE_VALUE_TYPE(features::kNearbySharingReceiveWifiCredentials)},
     {"nearby-sharing-self-share",
      flag_descriptions::kNearbySharingSelfShareName,
      flag_descriptions::kNearbySharingSelfShareDescription, kOsCrOS,
diff --git a/chrome/browser/accessibility/accessibility_ui.cc b/chrome/browser/accessibility/accessibility_ui.cc
index 7a8ca652..f402fc2 100644
--- a/chrome/browser/accessibility/accessibility_ui.cc
+++ b/chrome/browser/accessibility/accessibility_ui.cc
@@ -429,7 +429,7 @@
 
 void AccessibilityUIMessageHandler::ToggleAccessibility(
     const base::ListValue* args) {
-  const base::Value& data = args->GetList()[0];
+  const base::Value& data = args->GetListDeprecated()[0];
   CHECK(data.is_dict());
 
   int process_id = *data.FindIntPath(kProcessIdField);
@@ -481,7 +481,7 @@
 }
 
 void AccessibilityUIMessageHandler::SetGlobalFlag(const base::ListValue* args) {
-  const base::Value& data = args->GetList()[0];
+  const base::Value& data = args->GetListDeprecated()[0];
   CHECK(data.is_dict());
 
   const std::string* flag_name_str_p = data.FindStringPath(kFlagNameField);
@@ -562,7 +562,7 @@
 
 void AccessibilityUIMessageHandler::RequestWebContentsTree(
     const base::ListValue* args) {
-  const base::Value& data = args->GetList()[0];
+  const base::Value& data = args->GetListDeprecated()[0];
   CHECK(data.is_dict());
 
   std::string request_type, allow, allow_empty, deny;
@@ -609,7 +609,7 @@
 
 void AccessibilityUIMessageHandler::RequestNativeUITree(
     const base::ListValue* args) {
-  const base::Value& data = args->GetList()[0];
+  const base::Value& data = args->GetListDeprecated()[0];
   CHECK(data.is_dict());
 
   std::string request_type, allow, allow_empty, deny;
@@ -653,7 +653,7 @@
 void AccessibilityUIMessageHandler::RequestWidgetsTree(
     const base::ListValue* args) {
 #if defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_ASH)
-  const base::Value& data = args->GetList()[0];
+  const base::Value& data = args->GetListDeprecated()[0];
   CHECK(data.is_dict());
 
   std::string request_type, allow, allow_empty, deny;
@@ -712,7 +712,7 @@
 
 void AccessibilityUIMessageHandler::RequestAccessibilityEvents(
     const base::ListValue* args) {
-  const base::Value& data = args->GetList()[0];
+  const base::Value& data = args->GetListDeprecated()[0];
   CHECK(data.is_dict());
 
   int process_id = *data.FindIntPath(kProcessIdField);
diff --git a/chrome/browser/alternative_error_page_override_info_browsertest.cc b/chrome/browser/alternative_error_page_override_info_browsertest.cc
index f9cce27..cf225e6 100644
--- a/chrome/browser/alternative_error_page_override_info_browsertest.cc
+++ b/chrome/browser/alternative_error_page_override_info_browsertest.cc
@@ -36,7 +36,8 @@
     web_app::test::InstallPwaForCurrentUrl(browser());
     content::BrowserContext* context = browser()->profile();
 
-    return browser_client.GetAlternativeErrorPageOverrideInfo(app_url, context);
+    return browser_client.GetAlternativeErrorPageOverrideInfo(
+        app_url, context, net::ERR_INTERNET_DISCONNECTED);
   }
 
  private:
@@ -60,7 +61,8 @@
 
   // Expect mojom struct with default background and theme colors.
   EXPECT_TRUE(info);
-  EXPECT_EQ(*info->alternative_error_page_params.FindKey("background_color"),
+  EXPECT_EQ(*info->alternative_error_page_params.FindKey(
+                "customized_background_color"),
             base::Value(skia::SkColorToHexString(SK_ColorWHITE)));
   EXPECT_EQ(*info->alternative_error_page_params.FindKey("theme_color"),
             base::Value(skia::SkColorToHexString(SK_ColorBLACK)));
@@ -76,7 +78,8 @@
   // Expect mojom struct with customized theme color and default background
   // color.
   EXPECT_TRUE(info);
-  EXPECT_EQ(*info->alternative_error_page_params.FindKey("background_color"),
+  EXPECT_EQ(*info->alternative_error_page_params.FindKey(
+                "customized_background_color"),
             base::Value(skia::SkColorToHexString(SK_ColorWHITE)));
   EXPECT_EQ(
       *info->alternative_error_page_params.FindKey("theme_color"),
@@ -93,7 +96,8 @@
   // Expect mojom struct with default theme color and customized background
   // color.
   EXPECT_TRUE(info);
-  EXPECT_EQ(*info->alternative_error_page_params.FindKey("background_color"),
+  EXPECT_EQ(*info->alternative_error_page_params.FindKey(
+                "customized_background_color"),
             base::Value(skia::SkColorToHexString(SK_ColorBLUE)));
   EXPECT_EQ(*info->alternative_error_page_params.FindKey("theme_color"),
             base::Value(skia::SkColorToHexString(SK_ColorBLACK)));
@@ -110,7 +114,8 @@
   content::BrowserContext* context = browser()->profile();
 
   content::mojom::AlternativeErrorPageOverrideInfoPtr info =
-      browser_client.GetAlternativeErrorPageOverrideInfo(app_url, context);
+      browser_client.GetAlternativeErrorPageOverrideInfo(
+          app_url, context, net::ERR_INTERNET_DISCONNECTED);
 
   // Expect mojom struct to be null.
   EXPECT_FALSE(info);
@@ -172,7 +177,8 @@
   content::BrowserContext* context = browser()->profile();
 
   content::mojom::AlternativeErrorPageOverrideInfoPtr info =
-      browser_client.GetAlternativeErrorPageOverrideInfo(app_url, context);
+      browser_client.GetAlternativeErrorPageOverrideInfo(
+          app_url, context, net::ERR_INTERNET_DISCONNECTED);
 
   // Expect mojom struct customized with HTML page title.
   EXPECT_TRUE(info);
@@ -189,7 +195,8 @@
 
   // Expect mojom struct with custom theme and background color.
   EXPECT_TRUE(info);
-  EXPECT_EQ(*info->alternative_error_page_params.FindKey("background_color"),
+  EXPECT_EQ(*info->alternative_error_page_params.FindKey(
+                "customized_background_color"),
             base::Value(skia::SkColorToHexString(SK_ColorYELLOW)));
   EXPECT_EQ(*info->alternative_error_page_params.FindKey("theme_color"),
             base::Value(skia::SkColorToHexString(SK_ColorGREEN)));
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc b/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc
index 0b191a9..7322de3 100644
--- a/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc
+++ b/chrome/browser/android/autofill_assistant/ui_controller_android_utils.cc
@@ -707,7 +707,8 @@
       ConvertUTF8ToJavaString(env, credit_card.server_id()),
       credit_card.instrument_id(),
       ConvertUTF16ToJavaString(env, credit_card.nickname()),
-      url::GURLAndroid::FromNativeGURL(env, credit_card.card_art_url()));
+      url::GURLAndroid::FromNativeGURL(env, credit_card.card_art_url()),
+      static_cast<jint>(credit_card.virtual_card_enrollment_state()));
 }
 
 void PopulateAutofillCreditCardFromJava(
@@ -771,6 +772,10 @@
     credit_card->set_card_art_url(
         *url::GURLAndroid::ToNativeGURL(env, jcard_art_url));
   }
+  credit_card->set_virtual_card_enrollment_state(
+      static_cast<autofill::CreditCard::VirtualCardEnrollmentState>(
+          Java_AssistantAutofillCreditCard_getVirtualCardEnrollmentState(
+              env, jcredit_card)));
 }
 
 }  // namespace ui_controller_android_utils
diff --git a/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc b/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc
index 89a98237..f6b7463 100644
--- a/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc
+++ b/chrome/browser/android/bookmarks/partner_bookmarks_shim.cc
@@ -258,7 +258,7 @@
   if (!list)
     return;
 
-  for (const auto& entry : list->GetList()) {
+  for (const auto& entry : list->GetListDeprecated()) {
     const base::DictionaryValue* dict = nullptr;
     if (!entry.GetAsDictionary(&dict)) {
       NOTREACHED();
diff --git a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
index 9d2be54..685dd5aa 100644
--- a/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
+++ b/chrome/browser/android/contextualsearch/contextual_search_delegate.cc
@@ -472,7 +472,7 @@
         dict->FindListKey(kContextualSearchMentionsKey);
     // Note that because we've deserialized the json and it's not used later, we
     // can just take the list without worrying about putting it back.
-    if (mentions_list && mentions_list->GetList().size() >= 2)
+    if (mentions_list && mentions_list->GetListDeprecated().size() >= 2)
       ExtractMentionsStartEnd(std::move(*mentions_list).TakeListDeprecated(),
                               mention_start, mention_end);
   }
diff --git a/chrome/browser/android/explore_sites/catalog.cc b/chrome/browser/android/explore_sites/catalog.cc
index ac2763f..8bc1a5f 100644
--- a/chrome/browser/android/explore_sites/catalog.cc
+++ b/chrome/browser/android/explore_sites/catalog.cc
@@ -21,7 +21,7 @@
     return nullptr;
 
   std::vector<NTPCatalog::Category> catalog_categories;
-  for (const auto& category : categories->GetList()) {
+  for (const auto& category : categories->GetListDeprecated()) {
     if (!category.is_dict()) {
       return nullptr;
     }
diff --git a/chrome/browser/android/oom_intervention/oom_intervention_decider.cc b/chrome/browser/android/oom_intervention/oom_intervention_decider.cc
index e84479d5..08383ec 100644
--- a/chrome/browser/android/oom_intervention/oom_intervention_decider.cc
+++ b/chrome/browser/android/oom_intervention/oom_intervention_decider.cc
@@ -138,7 +138,7 @@
 
   // Migrate `kBlacklist` to `kBlocklist`.
   auto* old_pref_value = prefs_->GetList(kBlacklist);
-  if (!old_pref_value->GetList().empty()) {
+  if (!old_pref_value->GetListDeprecated().empty()) {
     prefs_->Set(kBlocklist, *old_pref_value);
     ListPrefUpdate update(prefs_, kBlacklist);
     update->ClearList();
@@ -148,7 +148,7 @@
     return;
 
   base::Value::ConstListView declined_list =
-      prefs_->GetList(kDeclinedHostList)->GetList();
+      prefs_->GetList(kDeclinedHostList)->GetListDeprecated();
   if (!declined_list.empty()) {
     const std::string& last_declined = declined_list.back().GetString();
     if (!IsInList(kBlocklist, last_declined))
@@ -157,7 +157,8 @@
 }
 
 bool OomInterventionDecider::IsOptedOut(const std::string& host) const {
-  if (prefs_->GetList(kBlocklist)->GetList().size() >= kMaxBlocklistSize)
+  if (prefs_->GetList(kBlocklist)->GetListDeprecated().size() >=
+      kMaxBlocklistSize)
     return true;
 
   return IsInList(kBlocklist, host);
@@ -165,7 +166,7 @@
 
 bool OomInterventionDecider::IsInList(const char* list_name,
                                       const std::string& host) const {
-  for (const auto& value : prefs_->GetList(list_name)->GetList()) {
+  for (const auto& value : prefs_->GetList(list_name)->GetListDeprecated()) {
     if (value.GetString() == host)
       return true;
   }
@@ -178,8 +179,8 @@
     return;
   ListPrefUpdate update(prefs_, list_name);
   update->Append(host);
-  if (update->GetList().size() > kMaxListSize)
-    update->EraseListIter(update->GetList().begin());
+  if (update->GetListDeprecated().size() > kMaxListSize)
+    update->EraseListIter(update->GetListDeprecated().begin());
 
   // Save the list immediately because we typically modify lists under high
   // memory pressure, in which the browser process can be killed by the OS
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
index 71ac8140..96e740f 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.cc
+++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -36,6 +36,7 @@
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
 #include "chrome/browser/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h"
+#include "chrome/browser/prefetch/prefetch_prefs.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager_factory.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
@@ -448,8 +449,11 @@
   return true;
 }
 
-bool TabWebContentsDelegateAndroid::IsPrerender2Supported() {
-  return true;
+bool TabWebContentsDelegateAndroid::IsPrerender2Supported(
+    content::WebContents& web_contents) {
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents.GetBrowserContext());
+  return prefetch::IsSomePreloadingEnabled(*profile->GetPrefs());
 }
 
 std::unique_ptr<content::WebContents>
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.h b/chrome/browser/android/tab_web_contents_delegate_android.h
index efbab10..4080152 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.h
+++ b/chrome/browser/android/tab_web_contents_delegate_android.h
@@ -96,7 +96,7 @@
       content::WebContents* web_contents) override;
   void ExitPictureInPicture() override;
   bool IsBackForwardCacheSupported() override;
-  bool IsPrerender2Supported() override;
+  bool IsPrerender2Supported(content::WebContents& web_contents) override;
   std::unique_ptr<content::WebContents> ActivatePortalWebContents(
       content::WebContents* predecessor_contents,
       std::unique_ptr<content::WebContents> portal_contents) override;
diff --git a/chrome/browser/apps/app_discovery_service/recommended_arc_app_fetcher.cc b/chrome/browser/apps/app_discovery_service/recommended_arc_app_fetcher.cc
index 3cd35f8..74a1e95 100644
--- a/chrome/browser/apps/app_discovery_service/recommended_arc_app_fetcher.cc
+++ b/chrome/browser/apps/app_discovery_service/recommended_arc_app_fetcher.cc
@@ -37,7 +37,7 @@
     return;
   }
 
-  base::Value::ConstListView apps = app_value->GetList();
+  base::Value::ConstListView apps = app_value->GetListDeprecated();
   if (apps.empty()) {
     std::move(callback_).Run({});
     return;
diff --git a/chrome/browser/apps/app_service/intent_util.cc b/chrome/browser/apps/app_service/intent_util.cc
index 0291ee1..85f9d018 100644
--- a/chrome/browser/apps/app_service/intent_util.cc
+++ b/chrome/browser/apps/app_service/intent_util.cc
@@ -43,6 +43,7 @@
 #include "chrome/browser/ui/app_list/arc/intent.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "chrome/common/extensions/api/file_browser_handlers/file_browser_handler.h"
+#include "components/arc/intent_helper/arc_intent_helper_bridge.h"
 #include "components/arc/intent_helper/intent_constants.h"
 #include "components/arc/intent_helper/intent_filter.h"
 #include "storage/browser/file_system/file_system_url.h"
@@ -111,6 +112,40 @@
   return intent_filter;
 }
 
+apps::IntentFilters CreateShareIntentFiltersFromShareTarget(
+    const apps::ShareTarget& share_target) {
+  apps::IntentFilters filters;
+
+  if (!share_target.params.text.empty()) {
+    // The share target accepts navigator.share() calls with text.
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        CreateMimeTypeShareFilter({kTextPlain})));
+  }
+
+  std::vector<std::string> content_types;
+  for (const auto& files_entry : share_target.params.files) {
+    for (const auto& file_type : files_entry.accept) {
+      // Skip any file_type that is not a MIME type.
+      if (file_type.empty() || file_type[0] == '.' ||
+          std::count(file_type.begin(), file_type.end(), '/') != 1) {
+        continue;
+      }
+
+      content_types.push_back(file_type);
+    }
+  }
+
+  if (!content_types.empty()) {
+    const std::vector<std::string> intent_actions(
+        {kIntentActionSend, kIntentActionSendMultiple});
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        CreateFileFilter(intent_actions, content_types, {})));
+  }
+
+  return filters;
+}
+
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppShareIntentFilters(
     const apps::ShareTarget& share_target) {
   std::vector<apps::mojom::IntentFilterPtr> filters;
@@ -142,6 +177,30 @@
   return filters;
 }
 
+apps::IntentFilters CreateIntentFiltersFromFileHandlers(
+    const apps::FileHandlers& file_handlers) {
+  apps::IntentFilters filters;
+  for (const apps::FileHandler& handler : file_handlers) {
+    std::vector<std::string> mime_types;
+    std::vector<std::string> file_extensions;
+    std::string action_url = handler.action.spec();
+    // TODO(petermarshall): Use GetFileExtensionsFromFileHandlers /
+    // GetMimeTypesFromFileHandlers?
+    for (const apps::FileHandler::AcceptEntry& accept_entry : handler.accept) {
+      mime_types.push_back(accept_entry.mime_type);
+      for (const std::string& extension : accept_entry.file_extensions) {
+        file_extensions.push_back(extension);
+      }
+    }
+    filters.push_back(
+        apps::ConvertMojomIntentFilterToIntentFilter(CreateFileFilter(
+            {kIntentActionView}, mime_types, file_extensions, action_url)));
+  }
+
+  return filters;
+}
+
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppFileHandlerIntentFilters(
     const apps::FileHandlers& file_handlers) {
   std::vector<apps::mojom::IntentFilterPtr> filters;
@@ -300,6 +359,61 @@
   return intent_filter;
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+apps::IntentFilters CreateIntentFiltersFromArcBridge(
+    const std::string& package_name,
+    arc::ArcIntentHelperBridge* intent_helper_bridge) {
+  apps::IntentFilters filters;
+  const std::vector<arc::IntentFilter>& arc_intent_filters =
+      intent_helper_bridge->GetIntentFilterForPackage(package_name);
+  for (const auto& arc_intent_filter : arc_intent_filters) {
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        apps_util::ConvertArcToAppServiceIntentFilter(arc_intent_filter)));
+  }
+  return filters;
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+apps::IntentFilters CreateIntentFiltersForWebApp(
+    const web_app::AppId& app_id,
+    bool is_note_taking_web_app,
+    const GURL& app_scope,
+    const apps::ShareTarget* app_share_target,
+    const apps::FileHandlers* enabled_file_handlers) {
+  apps::IntentFilters filters;
+
+  if (!app_scope.is_empty()) {
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        CreateIntentFilterForUrlScope(app_scope)));
+  }
+
+  if (app_share_target) {
+    base::Extend(filters,
+                 CreateShareIntentFiltersFromShareTarget(*app_share_target));
+  }
+
+  if (enabled_file_handlers) {
+    base::Extend(filters,
+                 CreateIntentFiltersFromFileHandlers(*enabled_file_handlers));
+  }
+
+  if (is_note_taking_web_app) {
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        CreateNoteTakingIntentFilter()));
+  }
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  if (ash::features::IsProjectorEnabled() &&
+      app_id == ash::kChromeUITrustedProjectorSwaAppId) {
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        CreateIntentFilterForUrlScope(
+            GURL(ash::kChromeUIUntrustedProjectorPwaUrl))));
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+  return filters;
+}
+
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppIntentFilters(
     const web_app::AppId& app_id,
     bool is_note_taking_web_app,
@@ -336,6 +450,40 @@
   return filters;
 }
 
+apps::IntentFilters CreateIntentFiltersForChromeApp(
+    const extensions::Extension* extension) {
+  const extensions::FileHandlersInfo* file_handlers =
+      extensions::FileHandlers::GetFileHandlers(extension);
+  if (!file_handlers) {
+    return {};
+  }
+
+  // Check that the extension can be launched with files. This includes all
+  // platform apps and allowlisted extensions.
+  if (!CanLaunchViaEvent(extension)) {
+    return {};
+  }
+
+  apps::IntentFilters filters;
+  for (const apps::FileHandlerInfo& handler : *file_handlers) {
+    // "share_with", "add_to" and "pack_with" are ignored in the Files app
+    // frontend.
+    if (handler.verb != apps::file_handler_verbs::kOpenWith) {
+      continue;
+    }
+    std::vector<std::string> mime_types(handler.types.begin(),
+                                        handler.types.end());
+    std::vector<std::string> file_extensions(handler.extensions.begin(),
+                                             handler.extensions.end());
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        CreateFileFilter({kIntentActionView}, mime_types, file_extensions,
+                         handler.id, handler.include_directories)));
+    filters.back()->activity_label = extension->name();
+  }
+
+  return filters;
+}
+
 std::vector<apps::mojom::IntentFilterPtr> CreateChromeAppIntentFilters(
     const extensions::Extension* extension) {
   const extensions::FileHandlersInfo* file_handlers =
@@ -366,6 +514,35 @@
   return filters;
 }
 
+apps::IntentFilters CreateIntentFiltersForExtension(
+    const extensions::Extension* extension) {
+#if !BUILDFLAG(IS_CHROMEOS_ASH)
+  return {};
+#else
+  FileBrowserHandler::List* handler_list =
+      FileBrowserHandler::GetHandlers(extension);
+  if (!handler_list) {
+    return {};
+  }
+
+  apps::IntentFilters filters;
+  for (const std::unique_ptr<FileBrowserHandler>& handler : *handler_list) {
+    std::vector<std::string> patterns;
+    for (const URLPattern& pattern : handler->file_url_patterns()) {
+      // "filesystem:chrome-extension://*/*.txt"
+      std::string path = "filesystem:chrome-extension://*" + pattern.path();
+      base::ReplaceChars(path, ".", R"(\.)", &path);
+      base::ReplaceChars(path, "*", ".*", &path);
+      // "filesystem:chrome-extension://.*/.*\.txt"
+      patterns.push_back(path);
+    }
+    filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        CreateFileURLFilter(patterns, handler->id(), handler->title())));
+  }
+  return filters;
+#endif
+}
+
 std::vector<apps::mojom::IntentFilterPtr> CreateExtensionIntentFilters(
     const extensions::Extension* extension) {
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/apps/app_service/intent_util.h b/chrome/browser/apps/app_service/intent_util.h
index d6d1a82e..f17a1cd 100644
--- a/chrome/browser/apps/app_service/intent_util.h
+++ b/chrome/browser/apps/app_service/intent_util.h
@@ -14,6 +14,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
+#include "components/services/app_service/public/cpp/intent_filter.h"
 #include "components/services/app_service/public/mojom/types.mojom-forward.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -26,6 +27,7 @@
 #include "ash/components/arc/mojom/intent_helper.mojom-forward.h"
 
 namespace arc {
+class ArcIntentHelperBridge;
 class IntentFilter;
 }
 #endif
@@ -59,9 +61,27 @@
     const std::string& activity_name = "",
     bool include_directories = false);
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// Create intent filters from `package_name` and `intent_helper_bridge`.
+apps::IntentFilters CreateIntentFiltersFromArcBridge(
+    const std::string& package_name,
+    arc::ArcIntentHelperBridge* intent_helper_bridge);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+// Create intent filters for `app_id`. The `app_scope` is needed because
+// currently the correct app scope is not provided through WebApp API for
+// shortcuts.
+apps::IntentFilters CreateIntentFiltersForWebApp(
+    const web_app::AppId& app_id,
+    bool is_note_taking_web_app,
+    const GURL& app_scope,
+    const apps::ShareTarget* app_share_target,
+    const apps::FileHandlers* enabled_file_handlers);
+
 // Create intent filters for |web_app|.
 // The |scope| is needed because currently the correct app scope is not
 // provided through WebApp API for shortcuts.
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
 std::vector<apps::mojom::IntentFilterPtr> CreateWebAppIntentFilters(
     const web_app::AppId& app_id,
     bool is_note_taking_web_app,
@@ -71,11 +91,23 @@
 
 // Create intent filters for a Chrome app (extension-based) e.g. for
 // file_handlers.
+apps::IntentFilters CreateIntentFiltersForChromeApp(
+    const extensions::Extension* extension);
+
+// Create intent filters for a Chrome app (extension-based) e.g. for
+// file_handlers.
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
 std::vector<apps::mojom::IntentFilterPtr> CreateChromeAppIntentFilters(
     const extensions::Extension* extension);
 
 // Create intent filters for an Extension (is_extension() == true) e.g. for
 // file_browser_handlers.
+apps::IntentFilters CreateIntentFiltersForExtension(
+    const extensions::Extension* extension);
+
+// Create intent filters for an Extension (is_extension() == true) e.g. for
+// file_browser_handlers.
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
 std::vector<apps::mojom::IntentFilterPtr> CreateExtensionIntentFilters(
     const extensions::Extension* extension);
 
diff --git a/chrome/browser/apps/app_service/intent_util_unittest.cc b/chrome/browser/apps/app_service/intent_util_unittest.cc
index 0001e84f..8c10ed3 100644
--- a/chrome/browser/apps/app_service/intent_util_unittest.cc
+++ b/chrome/browser/apps/app_service/intent_util_unittest.cc
@@ -23,6 +23,7 @@
 #include "components/arc/intent_helper/intent_constants.h"
 #include "components/arc/intent_helper/intent_filter.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
+#include "components/services/app_service/public/cpp/intent_filter.h"
 #include "components/services/app_service/public/cpp/intent_filter_util.h"
 #include "components/services/app_service/public/cpp/intent_util.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
@@ -50,10 +51,11 @@
 class TestingProfile;
 #endif
 
-using apps::mojom::Condition;
-using apps::mojom::ConditionType;
-using apps::mojom::IntentFilterPtr;
-using apps::mojom::PatternMatchType;
+using apps::Condition;
+using apps::ConditionType;
+using apps::IntentFilterPtr;
+using apps::IntentFilters;
+using apps::PatternMatchType;
 
 class IntentUtilsTest : public testing::Test {
  protected:
@@ -176,13 +178,13 @@
             apps_util::CreateLaunchIntent("com.android.vending", intent));
 }
 
-TEST_F(IntentUtilsTest, CreateWebAppIntentFilters_WebApp_HasUrlFilter) {
+TEST_F(IntentUtilsTest, CreateIntentFiltersForWebApp_WebApp_HasUrlFilter) {
   auto web_app = web_app::test::CreateWebApp();
   DCHECK(web_app->start_url().is_valid());
   GURL scope = web_app->start_url().GetWithoutFilename();
   web_app->SetScope(scope);
 
-  std::vector<IntentFilterPtr> filters = apps_util::CreateWebAppIntentFilters(
+  IntentFilters filters = apps_util::CreateIntentFiltersForWebApp(
       web_app->app_id(), /*is_note_taking_web_app*/ false, scope,
       /*app_share_target*/ nullptr, /*enabled_file_handlers*/ nullptr);
 
@@ -228,6 +230,62 @@
               PatternMatchType::kPrefix);
     EXPECT_EQ(condition.condition_values[0]->value, scope.path());
   }
+}
+
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
+TEST_F(IntentUtilsTest, CreateWebAppIntentFilters_WebApp_HasUrlFilter) {
+  auto web_app = web_app::test::CreateWebApp();
+  DCHECK(web_app->start_url().is_valid());
+  GURL scope = web_app->start_url().GetWithoutFilename();
+  web_app->SetScope(scope);
+
+  std::vector<apps::mojom::IntentFilterPtr> filters =
+      apps_util::CreateWebAppIntentFilters(
+          web_app->app_id(), /*is_note_taking_web_app*/ false, scope,
+          /*app_share_target*/ nullptr, /*enabled_file_handlers*/ nullptr);
+
+  ASSERT_EQ(filters.size(), 1);
+  apps::mojom::IntentFilterPtr& filter = filters[0];
+  EXPECT_FALSE(filter->activity_name.has_value());
+  EXPECT_FALSE(filter->activity_label.has_value());
+  ASSERT_EQ(filter->conditions.size(), 4U);
+
+  {
+    const apps::mojom::Condition& condition = *filter->conditions[0];
+    EXPECT_EQ(condition.condition_type, apps::mojom::ConditionType::kAction);
+    ASSERT_EQ(condition.condition_values.size(), 1U);
+    EXPECT_EQ(condition.condition_values[0]->match_type,
+              apps::mojom::PatternMatchType::kNone);
+    EXPECT_EQ(condition.condition_values[0]->value,
+              apps_util::kIntentActionView);
+  }
+
+  {
+    const apps::mojom::Condition& condition = *filter->conditions[1];
+    EXPECT_EQ(condition.condition_type, apps::mojom::ConditionType::kScheme);
+    ASSERT_EQ(condition.condition_values.size(), 1U);
+    EXPECT_EQ(condition.condition_values[0]->match_type,
+              apps::mojom::PatternMatchType::kNone);
+    EXPECT_EQ(condition.condition_values[0]->value, scope.scheme());
+  }
+
+  {
+    const apps::mojom::Condition& condition = *filter->conditions[2];
+    EXPECT_EQ(condition.condition_type, apps::mojom::ConditionType::kHost);
+    ASSERT_EQ(condition.condition_values.size(), 1U);
+    EXPECT_EQ(condition.condition_values[0]->match_type,
+              apps::mojom::PatternMatchType::kNone);
+    EXPECT_EQ(condition.condition_values[0]->value, scope.host());
+  }
+
+  {
+    const apps::mojom::Condition& condition = *filter->conditions[3];
+    EXPECT_EQ(condition.condition_type, apps::mojom::ConditionType::kPattern);
+    ASSERT_EQ(condition.condition_values.size(), 1U);
+    EXPECT_EQ(condition.condition_values[0]->match_type,
+              apps::mojom::PatternMatchType::kPrefix);
+    EXPECT_EQ(condition.condition_values[0]->value, scope.path());
+  }
 
   EXPECT_TRUE(apps_util::IntentMatchesFilter(
       apps_util::CreateIntentFromUrl(web_app->start_url()), filter));
@@ -236,7 +294,7 @@
       apps_util::CreateIntentFromUrl(GURL("https://bar.com")), filter));
 }
 
-TEST_F(IntentUtilsTest, CreateWebAppIntentFilters_FileHandlers) {
+TEST_F(IntentUtilsTest, CreateIntentFiltersForWebApp_FileHandlers) {
   auto web_app = web_app::test::CreateWebApp();
   DCHECK(web_app->start_url().is_valid());
   GURL scope = web_app->start_url().GetWithoutFilename();
@@ -252,7 +310,7 @@
   file_handlers.push_back(std::move(file_handler));
   web_app->SetFileHandlers(file_handlers);
 
-  std::vector<IntentFilterPtr> filters = apps_util::CreateWebAppIntentFilters(
+  IntentFilters filters = apps_util::CreateIntentFiltersForWebApp(
       web_app->app_id(), /*is_note_taking_web_app*/ false, scope,
       /*app_share_target*/ nullptr, &file_handlers);
 
@@ -279,6 +337,75 @@
   EXPECT_EQ(file_cond.condition_values[1]->value, ".txt");
 }
 
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
+TEST_F(IntentUtilsTest, CreateWebAppIntentFilters_FileHandlers) {
+  auto web_app = web_app::test::CreateWebApp();
+  DCHECK(web_app->start_url().is_valid());
+  GURL scope = web_app->start_url().GetWithoutFilename();
+  web_app->SetScope(scope);
+
+  apps::FileHandler::AcceptEntry accept_entry;
+  accept_entry.mime_type = "text/plain";
+  accept_entry.file_extensions.insert(".txt");
+  apps::FileHandler file_handler;
+  file_handler.action = GURL("https://example.com/path/handler.html");
+  file_handler.accept.push_back(std::move(accept_entry));
+  apps::FileHandlers file_handlers;
+  file_handlers.push_back(std::move(file_handler));
+  web_app->SetFileHandlers(file_handlers);
+
+  std::vector<apps::mojom::IntentFilterPtr> filters =
+      apps_util::CreateWebAppIntentFilters(
+          web_app->app_id(), /*is_note_taking_web_app*/ false, scope,
+          /*app_share_target*/ nullptr, &file_handlers);
+
+  ASSERT_EQ(filters.size(), 2);
+  // 1st filter is URL filter.
+
+  // File filter - View action
+  const apps::mojom::IntentFilterPtr& file_filter = filters[1];
+  ASSERT_EQ(file_filter->conditions.size(), 2);
+  const apps::mojom::Condition& view_cond = *file_filter->conditions[0];
+  EXPECT_EQ(view_cond.condition_type, apps::mojom::ConditionType::kAction);
+  ASSERT_EQ(view_cond.condition_values.size(), 1);
+  EXPECT_EQ(view_cond.condition_values[0]->value, apps_util::kIntentActionView);
+
+  // File filter - mime & file extension match
+  const apps::mojom::Condition& file_cond = *file_filter->conditions[1];
+  EXPECT_EQ(file_cond.condition_type, apps::mojom::ConditionType::kFile);
+  ASSERT_EQ(file_cond.condition_values.size(), 2);
+  EXPECT_EQ(file_cond.condition_values[0]->match_type,
+            apps::mojom::PatternMatchType::kMimeType);
+  EXPECT_EQ(file_cond.condition_values[0]->value, "text/plain");
+  EXPECT_EQ(file_cond.condition_values[1]->match_type,
+            apps::mojom::PatternMatchType::kFileExtension);
+  EXPECT_EQ(file_cond.condition_values[1]->value, ".txt");
+}
+
+TEST_F(IntentUtilsTest, CreateIntentFiltersForWebApp_NoteTakingApp) {
+  auto web_app = web_app::test::CreateWebApp();
+  DCHECK(web_app->start_url().is_valid());
+  GURL scope = web_app->start_url().GetWithoutFilename();
+  web_app->SetScope(scope);
+  GURL new_note_url = scope.Resolve("/new_note.html");
+  web_app->SetNoteTakingNewNoteUrl(new_note_url);
+
+  IntentFilters filters = apps_util::CreateIntentFiltersForWebApp(
+      web_app->app_id(), /*is_note_taking_web_app*/ true, scope,
+      /*app_share_target*/ nullptr, /*enabled_file_handlers*/ nullptr);
+
+  ASSERT_EQ(filters.size(), 2);
+
+  // 2nd filter is note-taking filter.
+  ASSERT_EQ(filters[1]->conditions.size(), 1);
+  const Condition& condition = *filters[1]->conditions[0];
+  EXPECT_EQ(condition.condition_type, ConditionType::kAction);
+  ASSERT_EQ(condition.condition_values.size(), 1);
+  EXPECT_EQ(condition.condition_values[0]->value,
+            apps_util::kIntentActionCreateNote);
+}
+
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
 TEST_F(IntentUtilsTest, CreateWebAppIntentFilters_NoteTakingApp) {
   auto web_app = web_app::test::CreateWebApp();
   DCHECK(web_app->start_url().is_valid());
@@ -287,9 +414,10 @@
   GURL new_note_url = scope.Resolve("/new_note.html");
   web_app->SetNoteTakingNewNoteUrl(new_note_url);
 
-  std::vector<IntentFilterPtr> filters = apps_util::CreateWebAppIntentFilters(
-      web_app->app_id(), /*is_note_taking_web_app*/ true, scope,
-      /*app_share_target*/ nullptr, /*enabled_file_handlers*/ nullptr);
+  std::vector<apps::mojom::IntentFilterPtr> filters =
+      apps_util::CreateWebAppIntentFilters(
+          web_app->app_id(), /*is_note_taking_web_app*/ true, scope,
+          /*app_share_target*/ nullptr, /*enabled_file_handlers*/ nullptr);
 
   ASSERT_EQ(filters.size(), 2);
 
@@ -299,8 +427,8 @@
 
   // 2nd filter is note-taking filter.
   ASSERT_EQ(filters[1]->conditions.size(), 1);
-  const Condition& condition = *filters[1]->conditions[0];
-  EXPECT_EQ(condition.condition_type, ConditionType::kAction);
+  const apps::mojom::Condition& condition = *filters[1]->conditions[0];
+  EXPECT_EQ(condition.condition_type, apps::mojom::ConditionType::kAction);
   ASSERT_EQ(condition.condition_values.size(), 1);
   EXPECT_EQ(condition.condition_values[0]->value,
             apps_util::kIntentActionCreateNote);
@@ -308,7 +436,7 @@
       apps_util::CreateCreateNoteIntent(), filters[1]));
 }
 
-TEST_F(IntentUtilsTest, CreateChromeAppIntentFilters_FileHandlers) {
+TEST_F(IntentUtilsTest, CreateIntentFiltersForChromeApp_FileHandlers) {
   // Foo app provides file handler for text/plain and all file types.
   extensions::ExtensionBuilder foo_app;
   foo_app.SetManifest(
@@ -346,8 +474,7 @@
   foo_app.SetID("abcdzxcv");
   scoped_refptr<const extensions::Extension> foo = foo_app.Build();
 
-  std::vector<IntentFilterPtr> filters =
-      apps_util::CreateChromeAppIntentFilters(foo.get());
+  IntentFilters filters = apps_util::CreateIntentFiltersForChromeApp(foo.get());
 
   ASSERT_EQ(filters.size(), 2);
 
@@ -389,6 +516,170 @@
   EXPECT_EQ(file_cond2.condition_values[1]->value, "txt");
 }
 
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
+TEST_F(IntentUtilsTest, CreateChromeAppIntentFilters_FileHandlers) {
+  // Foo app provides file handler for text/plain and all file types.
+  extensions::ExtensionBuilder foo_app;
+  foo_app.SetManifest(
+      extensions::DictionaryBuilder()
+          .Set("name", "Foo")
+          .Set("version", "1.0.0")
+          .Set("manifest_version", 2)
+          .Set("app", extensions::DictionaryBuilder()
+                          .Set("background",
+                               extensions::DictionaryBuilder()
+                                   .Set("scripts", extensions::ListBuilder()
+                                                       .Append("background.js")
+                                                       .Build())
+                                   .Build())
+                          .Build())
+          .Set(
+              "file_handlers",
+              extensions::DictionaryBuilder()
+                  .Set("any",
+                       extensions::DictionaryBuilder()
+                           .Set("types",
+                                extensions::ListBuilder().Append("*/*").Build())
+                           .Build())
+                  .Set("text",
+                       extensions::DictionaryBuilder()
+                           .Set("types", extensions::ListBuilder()
+                                             .Append("text/plain")
+                                             .Build())
+                           .Set("extensions",
+                                extensions::ListBuilder().Append("txt").Build())
+                           .Set("verb", "open_with")
+                           .Build())
+                  .Build())
+          .Build());
+  foo_app.SetID("abcdzxcv");
+  scoped_refptr<const extensions::Extension> foo = foo_app.Build();
+
+  std::vector<apps::mojom::IntentFilterPtr> filters =
+      apps_util::CreateChromeAppIntentFilters(foo.get());
+
+  ASSERT_EQ(filters.size(), 2);
+
+  // "any" filter - View action
+  const apps::mojom::IntentFilterPtr& mime_filter = filters[0];
+  ASSERT_EQ(mime_filter->conditions.size(), 2);
+  const apps::mojom::Condition& view_cond = *mime_filter->conditions[0];
+  EXPECT_EQ(view_cond.condition_type, apps::mojom::ConditionType::kAction);
+  ASSERT_EQ(view_cond.condition_values.size(), 1);
+  EXPECT_EQ(view_cond.condition_values[0]->value, apps_util::kIntentActionView);
+
+  // "any" filter - mime type match
+  const apps::mojom::Condition& file_cond = *mime_filter->conditions[1];
+  EXPECT_EQ(file_cond.condition_type, apps::mojom::ConditionType::kFile);
+  ASSERT_EQ(file_cond.condition_values.size(), 1);
+  EXPECT_EQ(file_cond.condition_values[0]->match_type,
+            apps::mojom::PatternMatchType::kMimeType);
+  EXPECT_EQ(file_cond.condition_values[0]->value, "*/*");
+
+  // Text filter - View action
+  const apps::mojom::IntentFilterPtr& mime_filter2 = filters[1];
+  ASSERT_EQ(mime_filter2->conditions.size(), 2);
+  const apps::mojom::Condition& view_cond2 = *mime_filter2->conditions[0];
+  EXPECT_EQ(view_cond2.condition_type, apps::mojom::ConditionType::kAction);
+  ASSERT_EQ(view_cond2.condition_values.size(), 1);
+  EXPECT_EQ(view_cond2.condition_values[0]->value,
+            apps_util::kIntentActionView);
+
+  // Text filter - mime type match
+  const apps::mojom::Condition& file_cond2 = *mime_filter2->conditions[1];
+  EXPECT_EQ(file_cond2.condition_type, apps::mojom::ConditionType::kFile);
+  ASSERT_EQ(file_cond2.condition_values.size(), 2);
+  EXPECT_EQ(file_cond2.condition_values[0]->match_type,
+            apps::mojom::PatternMatchType::kMimeType);
+  EXPECT_EQ(file_cond2.condition_values[0]->value, "text/plain");
+  // Text filter - file extension match
+  EXPECT_EQ(file_cond2.condition_values[1]->match_type,
+            apps::mojom::PatternMatchType::kFileExtension);
+  EXPECT_EQ(file_cond2.condition_values[1]->value, "txt");
+}
+
+TEST_F(IntentUtilsTest, CreateIntentFiltersForExtension_FileHandlers) {
+  // Foo extension provides file_browser_handlers for html and anything.
+  extensions::ExtensionBuilder foo_ext;
+  foo_ext.SetManifest(
+      extensions::DictionaryBuilder()
+          .Set("name", "Foo")
+          .Set("version", "1.0.0")
+          .Set("manifest_version", 2)
+          .Set(
+              "background",
+              extensions::DictionaryBuilder()
+                  .Set(
+                      "scripts",
+                      extensions::ListBuilder().Append("background.js").Build())
+                  .Set("persistent", false)
+                  .Build())
+          .Set(
+              "file_browser_handlers",
+              extensions::ListBuilder()
+                  .Append(
+                      extensions::DictionaryBuilder()
+                          .Set("id", "open")
+                          .Set("default_title", "Open me!")
+                          .Set("file_filters", extensions::ListBuilder()
+                                                   .Append("filesystem:*.html")
+                                                   .Build())
+                          .Build())
+                  .Append(extensions::DictionaryBuilder()
+                              .Set("id", "open_all")
+                              .Set("default_title", "Open anything!")
+                              .Set("file_filters", extensions::ListBuilder()
+                                                       .Append("filesystem:*.*")
+                                                       .Build())
+                              .Build())
+                  .Build())
+          .Set("permissions",
+               extensions::ListBuilder().Append("fileBrowserHandler").Build())
+          .Build());
+
+  foo_ext.SetID("abcdzxcv");
+  scoped_refptr<const extensions::Extension> foo = foo_ext.Build();
+
+  IntentFilters filters = apps_util::CreateIntentFiltersForExtension(foo.get());
+
+  ASSERT_EQ(filters.size(), 2);
+
+  // "html" filter - View action
+  const IntentFilterPtr& mime_filter = filters[0];
+  ASSERT_EQ(mime_filter->conditions.size(), 2);
+  const Condition& view_cond = *mime_filter->conditions[0];
+  EXPECT_EQ(view_cond.condition_type, ConditionType::kAction);
+  ASSERT_EQ(view_cond.condition_values.size(), 1);
+  EXPECT_EQ(view_cond.condition_values[0]->value, apps_util::kIntentActionView);
+
+  // "html" filter - glob match
+  const Condition& file_cond = *mime_filter->conditions[1];
+  EXPECT_EQ(file_cond.condition_type, ConditionType::kFile);
+  ASSERT_EQ(file_cond.condition_values.size(), 1);
+  EXPECT_EQ(file_cond.condition_values[0]->match_type, PatternMatchType::kGlob);
+  EXPECT_EQ(file_cond.condition_values[0]->value,
+            R"(filesystem:chrome-extension://.*/.*\.html)");
+
+  // "any" filter - View action
+  const IntentFilterPtr& mime_filter2 = filters[1];
+  ASSERT_EQ(mime_filter2->conditions.size(), 2);
+  const Condition& view_cond2 = *mime_filter2->conditions[0];
+  EXPECT_EQ(view_cond2.condition_type, ConditionType::kAction);
+  ASSERT_EQ(view_cond2.condition_values.size(), 1);
+  EXPECT_EQ(view_cond2.condition_values[0]->value,
+            apps_util::kIntentActionView);
+
+  // "any" filter - glob match
+  const Condition& file_cond2 = *mime_filter2->conditions[1];
+  EXPECT_EQ(file_cond2.condition_type, ConditionType::kFile);
+  ASSERT_EQ(file_cond2.condition_values.size(), 1);
+  EXPECT_EQ(file_cond2.condition_values[0]->match_type,
+            PatternMatchType::kGlob);
+  EXPECT_EQ(file_cond2.condition_values[0]->value,
+            R"(filesystem:chrome-extension://.*/.*\..*)");
+}
+
+// TODO(crbug.com/1253250): Remove after migrating to non-mojo AppService.
 TEST_F(IntentUtilsTest, CreateExtensionIntentFilters_FileHandlers) {
   // Foo extension provides file_browser_handlers for html and anything.
   extensions::ExtensionBuilder foo_ext;
@@ -431,42 +722,43 @@
   foo_ext.SetID("abcdzxcv");
   scoped_refptr<const extensions::Extension> foo = foo_ext.Build();
 
-  std::vector<IntentFilterPtr> filters =
+  std::vector<apps::mojom::IntentFilterPtr> filters =
       apps_util::CreateExtensionIntentFilters(foo.get());
 
   ASSERT_EQ(filters.size(), 2);
 
   // "html" filter - View action
-  const IntentFilterPtr& mime_filter = filters[0];
+  const apps::mojom::IntentFilterPtr& mime_filter = filters[0];
   ASSERT_EQ(mime_filter->conditions.size(), 2);
-  const Condition& view_cond = *mime_filter->conditions[0];
-  EXPECT_EQ(view_cond.condition_type, ConditionType::kAction);
+  const apps::mojom::Condition& view_cond = *mime_filter->conditions[0];
+  EXPECT_EQ(view_cond.condition_type, apps::mojom::ConditionType::kAction);
   ASSERT_EQ(view_cond.condition_values.size(), 1);
   EXPECT_EQ(view_cond.condition_values[0]->value, apps_util::kIntentActionView);
 
   // "html" filter - glob match
-  const Condition& file_cond = *mime_filter->conditions[1];
-  EXPECT_EQ(file_cond.condition_type, ConditionType::kFile);
+  const apps::mojom::Condition& file_cond = *mime_filter->conditions[1];
+  EXPECT_EQ(file_cond.condition_type, apps::mojom::ConditionType::kFile);
   ASSERT_EQ(file_cond.condition_values.size(), 1);
-  EXPECT_EQ(file_cond.condition_values[0]->match_type, PatternMatchType::kGlob);
+  EXPECT_EQ(file_cond.condition_values[0]->match_type,
+            apps::mojom::PatternMatchType::kGlob);
   EXPECT_EQ(file_cond.condition_values[0]->value,
             R"(filesystem:chrome-extension://.*/.*\.html)");
 
   // "any" filter - View action
-  const IntentFilterPtr& mime_filter2 = filters[1];
+  const apps::mojom::IntentFilterPtr& mime_filter2 = filters[1];
   ASSERT_EQ(mime_filter2->conditions.size(), 2);
-  const Condition& view_cond2 = *mime_filter2->conditions[0];
-  EXPECT_EQ(view_cond2.condition_type, ConditionType::kAction);
+  const apps::mojom::Condition& view_cond2 = *mime_filter2->conditions[0];
+  EXPECT_EQ(view_cond2.condition_type, apps::mojom::ConditionType::kAction);
   ASSERT_EQ(view_cond2.condition_values.size(), 1);
   EXPECT_EQ(view_cond2.condition_values[0]->value,
             apps_util::kIntentActionView);
 
   // "any" filter - glob match
-  const Condition& file_cond2 = *mime_filter2->conditions[1];
-  EXPECT_EQ(file_cond2.condition_type, ConditionType::kFile);
+  const apps::mojom::Condition& file_cond2 = *mime_filter2->conditions[1];
+  EXPECT_EQ(file_cond2.condition_type, apps::mojom::ConditionType::kFile);
   ASSERT_EQ(file_cond2.condition_values.size(), 1);
   EXPECT_EQ(file_cond2.condition_values[0]->match_type,
-            PatternMatchType::kGlob);
+            apps::mojom::PatternMatchType::kGlob);
   EXPECT_EQ(file_cond2.condition_values[0]->value,
             R"(filesystem:chrome-extension://.*/.*\..*)");
 }
@@ -488,7 +780,7 @@
                                      std::move(authorities1),
                                      std::move(patterns), {kScheme}, {});
 
-  IntentFilterPtr app_service_filter1 =
+  apps::mojom::IntentFilterPtr app_service_filter1 =
       apps_util::ConvertArcToAppServiceIntentFilter(filter_with_path);
 
   std::vector<arc::IntentFilter::AuthorityEntry> authorities2;
@@ -497,7 +789,7 @@
                                         std::move(authorities2), {}, {kScheme},
                                         {});
 
-  IntentFilterPtr app_service_filter2 =
+  apps::mojom::IntentFilterPtr app_service_filter2 =
       apps_util::ConvertArcToAppServiceIntentFilter(filter_without_path);
 
   ASSERT_EQ(app_service_filter1, app_service_filter2);
@@ -523,7 +815,7 @@
                                      std::move(authorities),
                                      std::move(patterns), {kScheme}, {});
 
-  IntentFilterPtr app_service_filter =
+  apps::mojom::IntentFilterPtr app_service_filter =
       apps_util::ConvertArcToAppServiceIntentFilter(filter_with_path);
 
   for (auto& condition : app_service_filter->conditions) {
@@ -565,7 +857,7 @@
                                std::move(authorities), std::move(patterns),
                                {kScheme}, {});
 
-  IntentFilterPtr app_service_filter =
+  apps::mojom::IntentFilterPtr app_service_filter =
       apps_util::ConvertArcToAppServiceIntentFilter(arc_filter);
 
   for (auto& condition : app_service_filter->conditions) {
diff --git a/chrome/browser/apps/app_service/publishers/arc_apps.cc b/chrome/browser/apps/app_service/publishers/arc_apps.cc
index bb3bea6..e4fdf1ed 100644
--- a/chrome/browser/apps/app_service/publishers/arc_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/arc_apps.cc
@@ -50,6 +50,7 @@
 #include "components/app_restore/full_restore_utils.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/icon_types.h"
+#include "components/services/app_service/public/cpp/intent_filter.h"
 #include "components/services/app_service/public/cpp/intent_filter_util.h"
 #include "components/services/app_service/public/cpp/intent_util.h"
 #include "components/services/app_service/public/cpp/permission.h"
@@ -483,48 +484,60 @@
   return window_info;
 }
 
-apps::mojom::OptionalBool IsResizeLocked(ArcAppListPrefs* prefs,
-                                         const std::string& app_id) {
-  // Set kUnknown to resize lock state until the Mojo connection to ARC++ has
-  // been established. This prevents Chrome and ARC++ from having inconsistent
+absl::optional<bool> GetResizeLocked(ArcAppListPrefs* prefs,
+                                     const std::string& app_id) {
+  // Set null to resize lock state until the Mojo connection to ARC++ has been
+  // established. This prevents Chrome and ARC++ from having inconsistent
   // states.
   auto* arc_service_manager = arc::ArcServiceManager::Get();
   if (!arc_service_manager) {
-    return apps::mojom::OptionalBool::kUnknown;
+    return absl::nullopt;
   }
 
   // If we don't have the connection (e.g. for non-supported Android versions),
-  // returns unknown.
+  // returns null.
   auto* compatibility_mode =
       arc_service_manager->arc_bridge_service()->compatibility_mode();
   if (!compatibility_mode->IsConnected()) {
-    return apps::mojom::OptionalBool::kUnknown;
+    return absl::nullopt;
   }
 
   // Check if |SetResizeLockState| is available to see if Android is ready to
   // be synchronized. Otherwise we need to hide the corresponding setting by
-  // returning unknown.
+  // returning null.
   auto* instance =
       ARC_GET_INSTANCE_FOR_METHOD(compatibility_mode, SetResizeLockState);
   if (!instance) {
-    return apps::mojom::OptionalBool::kUnknown;
+    return absl::nullopt;
   }
 
   auto resize_lock_state = prefs->GetResizeLockState(app_id);
   switch (resize_lock_state) {
     case arc::mojom::ArcResizeLockState::ON:
-      return apps::mojom::OptionalBool::kTrue;
+      return true;
     case arc::mojom::ArcResizeLockState::OFF:
-      return apps::mojom::OptionalBool::kFalse;
+      return false;
     case arc::mojom::ArcResizeLockState::UNDEFINED:
     case arc::mojom::ArcResizeLockState::READY:
     // FULLY_LOCKED means the resize-lock-related features are not available
     // including the resizability toggle in the app management page.
     case arc::mojom::ArcResizeLockState::FULLY_LOCKED:
-      return apps::mojom::OptionalBool::kUnknown;
+      return absl::nullopt;
   }
 }
 
+// TODO(crbug.com/1253250): Remove and use GetResizeLocked.
+apps::mojom::OptionalBool IsResizeLocked(ArcAppListPrefs* prefs,
+                                         const std::string& app_id) {
+  auto resize_locked = GetResizeLocked(prefs, app_id);
+  if (!resize_locked.has_value()) {
+    return apps::mojom::OptionalBool::kUnknown;
+  }
+
+  return resize_locked.value() ? apps::mojom::OptionalBool::kTrue
+                               : apps::mojom::OptionalBool::kFalse;
+}
+
 bool IsWebAppShellPackage(Profile* profile,
                           const ArcAppListPrefs::AppInfo& app_info) {
   ash::ApkWebAppService* apk_web_app_service =
@@ -1582,6 +1595,17 @@
   app->has_badge = app_notifications_.HasNotification(app_id);
   app->paused = paused_apps_.IsPaused(app_id);
 
+  auto* intent_helper_bridge =
+      arc::ArcIntentHelperBridge::GetForBrowserContext(profile_);
+  if (intent_helper_bridge &&
+      app_info.package_name !=
+          arc::ArcIntentHelperBridge::kArcIntentHelperPackageName) {
+    app->intent_filters = apps_util::CreateIntentFiltersFromArcBridge(
+        app_info.package_name, intent_helper_bridge);
+  }
+
+  app->resize_locked = GetResizeLocked(prefs, app_id);
+
   // TODO(crbug.com/1253250): Add other fields for the App struct.
   return app;
 }
diff --git a/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc b/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc
index 1a2d9e9..719875db 100644
--- a/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc
+++ b/chrome/browser/apps/app_service/publishers/arc_apps_unittest.cc
@@ -23,6 +23,7 @@
 #include "components/arc/intent_helper/intent_constants.h"
 #include "components/arc/intent_helper/intent_filter.h"
 #include "components/arc/test/fake_intent_helper_instance.h"
+#include "components/services/app_service/public/cpp/intent_util.h"
 #include "components/services/app_service/public/cpp/preferred_apps_list_handle.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -46,6 +47,43 @@
   filters.push_back(std::move(filter));
   return filters;
 }
+
+apps::IntentFilters CreateIntentFilters(
+    const std::vector<std::string>& authorities) {
+  apps::IntentFilters filters;
+  apps::IntentFilterPtr filter = std::make_unique<apps::IntentFilter>();
+
+  apps::ConditionValues values1;
+  values1.push_back(std::make_unique<apps::ConditionValue>(
+      apps_util::kIntentActionView, apps::PatternMatchType::kNone));
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kAction, std::move(values1)));
+
+  apps::ConditionValues values2;
+  values2.push_back(std::make_unique<apps::ConditionValue>(
+      "https", apps::PatternMatchType::kNone));
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kScheme, std::move(values2)));
+
+  apps::ConditionValues values;
+  for (const std::string& authority : authorities) {
+    values.push_back(std::make_unique<apps::ConditionValue>(
+        authority, apps::PatternMatchType::kNone));
+  }
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kHost, std::move(values)));
+
+  apps::ConditionValues values3;
+  values3.push_back(std::make_unique<apps::ConditionValue>(
+      "/", apps::PatternMatchType::kPrefix));
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kPattern, std::move(values3)));
+
+  filters.push_back(std::move(filter));
+
+  return filters;
+}
+
 }  // namespace
 
 class ArcAppsPublisherTest : public testing::Test {
@@ -84,6 +122,23 @@
 
   void TearDown() override { arc_test_.TearDown(); }
 
+  void VerifyIntentFilters(const std::string& app_id,
+                           const std::vector<std::string>& authorities) {
+    apps::IntentFilters source = CreateIntentFilters(authorities);
+
+    apps::IntentFilters target;
+    apps::AppServiceProxyFactory::GetForProfile(profile())
+        ->AppRegistryCache()
+        .ForApp(app_id, [&target](const apps::AppUpdate& update) {
+          target = update.GetIntentFilters();
+        });
+
+    EXPECT_EQ(source.size(), target.size());
+    for (int i = 0; i < static_cast<int>(source.size()); i++) {
+      EXPECT_EQ(*source[i], *target[i]);
+    }
+  }
+
   void FlushMojoCalls() { app_service_test_.FlushMojoCalls(); }
 
   TestingProfile* profile() { return &profile_; }
@@ -125,6 +180,7 @@
   // installed.
   intent_helper()->OnIntentFiltersUpdatedForPackage(
       package_name, CreateFilterList(package_name, {kTestAuthority}));
+  VerifyIntentFilters(app_id, {kTestAuthority});
   std::vector<arc::mojom::SupportedLinksPtr> added_links;
   added_links.emplace_back(base::in_place, package_name,
                            CreateFilterList(package_name, {kTestAuthority}));
@@ -149,6 +205,7 @@
   arc_test()->app_instance()->SendRefreshAppList(fake_apps);
   intent_helper()->OnIntentFiltersUpdatedForPackage(
       package_name, CreateFilterList(package_name, {kTestAuthority}));
+  VerifyIntentFilters(app_id, {kTestAuthority});
   FlushMojoCalls();
 
   apps::AppServiceProxyFactory::GetForProfile(profile())
@@ -176,6 +233,7 @@
   // installed.
   intent_helper()->OnIntentFiltersUpdatedForPackage(
       package_name, CreateFilterList(package_name, {kTestAuthority}));
+  VerifyIntentFilters(app_id, {kTestAuthority});
   std::vector<arc::mojom::SupportedLinksPtr> added_links;
   added_links.emplace_back(base::in_place, package_name,
                            CreateFilterList(package_name, {kTestAuthority}));
@@ -205,6 +263,7 @@
   // installed.
   intent_helper()->OnIntentFiltersUpdatedForPackage(
       package_name, CreateFilterList(package_name, {kTestAuthority}));
+  VerifyIntentFilters(app_id, {kTestAuthority});
   std::vector<arc::mojom::SupportedLinksPtr> added_links;
   added_links.emplace_back(base::in_place, package_name,
                            CreateFilterList(package_name, {kTestAuthority}));
@@ -220,6 +279,7 @@
   intent_helper()->OnIntentFiltersUpdatedForPackage(
       package_name,
       CreateFilterList(package_name, {kTestAuthority, kTestAuthority2}));
+  VerifyIntentFilters(app_id, {kTestAuthority, kTestAuthority2});
   std::vector<arc::mojom::SupportedLinksPtr> added_links2;
   added_links2.emplace_back(
       base::in_place, package_name,
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
index b76f7199..65d94b1 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
@@ -67,6 +67,7 @@
 #include "components/app_restore/full_restore_utils.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/services/app_service/public/cpp/instance.h"
+#include "components/services/app_service/public/cpp/intent_filter.h"
 #include "components/services/app_service/public/cpp/intent_filter_util.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "content/public/browser/clear_site_data_utils.h"
@@ -823,6 +824,15 @@
   app->has_badge = app_notifications_.HasNotification(extension->id());
   app->paused = paused;
 
+  bool is_quickoffice =
+      extension->is_extension() &&
+      extension->id() == extension_misc::kQuickOfficeComponentExtensionId;
+  if (extension->is_app() || is_quickoffice) {
+    app->intent_filters = apps_util::CreateIntentFiltersForChromeApp(extension);
+  } else if (extension->is_extension()) {
+    app->intent_filters = apps_util::CreateIntentFiltersForExtension(extension);
+  }
+
   return app;
 }
 
@@ -1003,7 +1013,7 @@
     const std::string& app_id,
     bool is_disabled_mode_changed) {
   const bool is_disabled = base::Contains(
-      disabled_system_features_pref->GetList(), base::Value(feature));
+      disabled_system_features_pref->GetListDeprecated(), base::Value(feature));
   // Sometimes the policy is updated before the app is installed, so this way
   // the disabled_apps_ is updated regardless the Publish should happen or not
   // and the app will be published with the correct readiness upon its
diff --git a/chrome/browser/apps/app_service/publishers/publisher_unittest.cc b/chrome/browser/apps/app_service/publishers/publisher_unittest.cc
index deaf7b6bb..c9ccaf7 100644
--- a/chrome/browser/apps/app_service/publishers/publisher_unittest.cc
+++ b/chrome/browser/apps/app_service/publishers/publisher_unittest.cc
@@ -24,10 +24,12 @@
 #include "components/app_constants/constants.h"
 #include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/icon_types.h"
+#include "components/services/app_service/public/cpp/intent_util.h"
 #include "components/services/app_service/public/cpp/permission.h"
 #include "components/services/app_service/public/cpp/publisher_base.h"
 #include "components/services/app_service/public/mojom/types.mojom.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "url/gurl.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "ash/components/arc/test/fake_app_instance.h"
@@ -50,6 +52,7 @@
 
 const base::Time kLastLaunchTime = base::Time::Now();
 const base::Time kInstallTime = base::Time::Now();
+const char kUrl[] = "https://example.com/";
 
 #if !BUILDFLAG(IS_CHROMEOS_LACROS)
 scoped_refptr<extensions::Extension> MakeExtensionApp(
@@ -147,6 +150,40 @@
   return true;
 }
 
+apps::IntentFilters CreateIntentFilters() {
+  const GURL url(kUrl);
+  apps::IntentFilters filters;
+  apps::IntentFilterPtr filter = std::make_unique<apps::IntentFilter>();
+
+  apps::ConditionValues values1;
+  values1.push_back(std::make_unique<apps::ConditionValue>(
+      apps_util::kIntentActionView, apps::PatternMatchType::kNone));
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kAction, std::move(values1)));
+
+  apps::ConditionValues values2;
+  values2.push_back(std::make_unique<apps::ConditionValue>(
+      url.scheme(), apps::PatternMatchType::kNone));
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kScheme, std::move(values2)));
+
+  apps::ConditionValues values3;
+  values3.push_back(std::make_unique<apps::ConditionValue>(
+      url.host(), apps::PatternMatchType::kNone));
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kHost, std::move(values3)));
+
+  apps::ConditionValues values4;
+  values4.push_back(std::make_unique<apps::ConditionValue>(
+      url.path(), apps::PatternMatchType::kPrefix));
+  filter->conditions.push_back(std::make_unique<apps::Condition>(
+      apps::ConditionType::kPattern, std::move(values4)));
+
+  filters.push_back(std::move(filter));
+
+  return filters;
+}
+
 }  // namespace
 
 namespace apps {
@@ -185,7 +222,7 @@
   }
 
   std::string CreateWebApp(const std::string& app_name) {
-    const GURL kAppUrl("https://example.com/");
+    const GURL kAppUrl(kUrl);
 
     auto web_app_info = std::make_unique<WebAppInstallInfo>();
     web_app_info->title = base::UTF8ToUTF16(app_name);
@@ -210,6 +247,7 @@
       EXPECT_EQ(source, target);
     }
   }
+
   void VerifyApp(AppType app_type,
                  const std::string& app_id,
                  const std::string& name,
@@ -276,6 +314,22 @@
               cache.states_[app_id]->readiness);
   }
 
+  void VerifyIntentFilters(const std::string& app_id) {
+    apps::IntentFilters source = CreateIntentFilters();
+
+    apps::IntentFilters target;
+    apps::AppServiceProxyFactory::GetForProfile(profile())
+        ->AppRegistryCache()
+        .ForApp(app_id, [&target](const apps::AppUpdate& update) {
+          target = update.GetIntentFilters();
+        });
+
+    EXPECT_EQ(source.size(), target.size());
+    for (int i = 0; i < static_cast<int>(source.size()); i++) {
+      EXPECT_EQ(*source[i], *target[i]);
+    }
+  }
+
  private:
   raw_ptr<web_app::TestWebAppUrlLoader> url_loader_ = nullptr;
 };
@@ -571,6 +625,7 @@
             /*show_in_search=*/true, /*show_in_management=*/true,
             /*handles_intents=*/true, /*allow_uninstall=*/true,
             /*has_badge=*/false, /*paused=*/false);
+  VerifyIntentFilters(app_id);
 }
 
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h
index 537f86b..d04149f4 100644
--- a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h
+++ b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h
@@ -9,7 +9,7 @@
 #include "chrome/browser/apps/intent_helper/apps_navigation_types.h"
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h"
+#include "chrome/browser/chromeos/arc/arc_external_protocol_dialog.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 namespace content {
@@ -129,6 +129,7 @@
   static void RecordIntentPickerIconEvent(IntentPickerIconEvent event);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
+  // TODO(crbug.com/1275075): Support metrices in Lacros.
   static void RecordExternalProtocolMetrics(arc::Scheme scheme,
                                             apps::PickerEntryType entry_type,
                                             bool accepted,
diff --git a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics_unittest.cc b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics_unittest.cc
index 639631b..f6169889 100644
--- a/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics_unittest.cc
+++ b/chrome/browser/apps/intent_helper/metrics/intent_handling_metrics_unittest.cc
@@ -19,7 +19,7 @@
 #include "ash/components/arc/metrics/arc_metrics_service.h"
 #include "ash/components/arc/metrics/stability_metrics_manager.h"
 #include "ash/components/arc/session/arc_service_manager.h"
-#include "chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h"
+#include "chrome/browser/chromeos/arc/arc_external_protocol_dialog.h"
 #include "components/arc/intent_helper/arc_intent_helper_bridge.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
diff --git a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
index 6cc4f74..23e3e54 100644
--- a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
+++ b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.cc
@@ -762,7 +762,8 @@
   base::ListValue* attached_images_list = NULL;
   result_dictionary->GetList(kAttachedImagesBlobInfoKey, &attached_images_list);
   DCHECK(attached_images_list);
-  DCHECK_LT(attached_images_list->GetList().size(), attached_images->size());
+  DCHECK_LT(attached_images_list->GetListDeprecated().size(),
+            attached_images->size());
 
   metadata::AttachedImage* current_image =
       &(*attached_images)[blob_uuids->size()];
diff --git a/chrome/browser/apps/platform_apps/app_browsertest.cc b/chrome/browser/apps/platform_apps/app_browsertest.cc
index e9065d895..b7d9836 100644
--- a/chrome/browser/apps/platform_apps/app_browsertest.cc
+++ b/chrome/browser/apps/platform_apps/app_browsertest.cc
@@ -1238,8 +1238,16 @@
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
 
+// Test is highly flaky on Windows.  https://crbug.com/1082010
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_WindowDotPrintShouldBringUpPrintPreview \
+  DISABLED_WindowDotPrintShouldBringUpPrintPreview
+#else
+#define MAYBE_WindowDotPrintShouldBringUpPrintPreview \
+  WindowDotPrintShouldBringUpPrintPreview
+#endif
 IN_PROC_BROWSER_TEST_F(PlatformAppBrowserTest,
-                       WindowDotPrintShouldBringUpPrintPreview) {
+                       MAYBE_WindowDotPrintShouldBringUpPrintPreview) {
   ScopedPreviewTestDelegate preview_delegate;
   ASSERT_TRUE(RunExtensionTest("platform_apps/print_api",
                                {.launch_as_platform_app = true}))
diff --git a/chrome/browser/apps/platform_apps/app_browsertest_util.cc b/chrome/browser/apps/platform_apps/app_browsertest_util.cc
index 2f853e8b..71c2ab5a 100644
--- a/chrome/browser/apps/platform_apps/app_browsertest_util.cc
+++ b/chrome/browser/apps/platform_apps/app_browsertest_util.cc
@@ -208,7 +208,7 @@
   std::unique_ptr<base::ListValue> result(
       utils::ToList(utils::RunFunctionAndReturnSingleResult(function.get(),
                                                             "[]", browser())));
-  return result->GetList().size();
+  return result->GetListDeprecated().size();
 }
 
 bool PlatformAppBrowserTest::RunGetWindowFunctionForExtension(
diff --git a/chrome/browser/apps/user_type_filter.cc b/chrome/browser/apps/user_type_filter.cc
index ca308cc3..48ba8d4e 100644
--- a/chrome/browser/apps/user_type_filter.cc
+++ b/chrome/browser/apps/user_type_filter.cc
@@ -59,7 +59,7 @@
   }
 
   bool user_type_match = false;
-  for (const auto& it : value->GetList()) {
+  for (const auto& it : value->GetListDeprecated()) {
     if (!it.is_string()) {
       LOG(ERROR) << "Invalid user type value for " << app_id << ".";
       return false;
diff --git a/chrome/browser/ash/accessibility/dictation_browsertest.cc b/chrome/browser/ash/accessibility/dictation_browsertest.cc
index 455a08f6..4ef9c53d 100644
--- a/chrome/browser/ash/accessibility/dictation_browsertest.cc
+++ b/chrome/browser/ash/accessibility/dictation_browsertest.cc
@@ -1145,8 +1145,8 @@
 }
 
 // Ensures that a metric is recorded when a macro succeeds.
-// TODO(1247299): Add a test to ensure that a metric is recorded when a macro
-// fails.
+// TODO(crbug.com/1288964): Add a test to ensure that a metric is recorded when
+// a macro fails.
 IN_PROC_BROWSER_TEST_P(DictationCommandsExtensionTest, MacroSucceededMetric) {
   base::HistogramTester histogram_tester_;
   SendFinalSpeechResultAndWaitForTextAreaValue(
diff --git a/chrome/browser/ash/app_mode/arc/arc_kiosk_app_service.cc b/chrome/browser/ash/app_mode/arc/arc_kiosk_app_service.cc
index cf0f710b..3fc6531 100644
--- a/chrome/browser/ash/app_mode/arc/arc_kiosk_app_service.cc
+++ b/chrome/browser/ash/app_mode/arc/arc_kiosk_app_service.cc
@@ -159,7 +159,7 @@
     return;
   }
 
-  for (const auto& detail : details->GetList()) {
+  for (const auto& detail : details->GetListDeprecated()) {
     const base::Value* const reason =
         detail.FindKeyOfType("nonComplianceReason", base::Value::Type::INTEGER);
     if (!reason || reason->GetInt() != kNonComplianceReasonAppNotInstalled)
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
index 654f563..1dbb49e55 100644
--- a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
+++ b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
@@ -181,9 +181,9 @@
     ASSERT_EQ(event.event_name,
               extensions::api::app_runtime::OnLaunched::kEventName);
     ASSERT_TRUE(event.event_args);
-    ASSERT_EQ(1u, event.event_args->GetList().size());
+    ASSERT_EQ(1u, event.event_args->GetListDeprecated().size());
 
-    const base::Value& launch_data = event.event_args->GetList()[0];
+    const base::Value& launch_data = event.event_args->GetListDeprecated()[0];
     const base::Value* is_kiosk_session =
         launch_data.FindKeyOfType("isKioskSession", base::Value::Type::BOOLEAN);
     ASSERT_TRUE(is_kiosk_session);
diff --git a/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.cc b/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.cc
index 592ae78..8e94c48e 100644
--- a/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.cc
+++ b/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.cc
@@ -24,7 +24,40 @@
 namespace ash {
 namespace full_restore {
 
-std::unique_ptr<exo::ClientControlledShellSurface> InitArcGhostWindow(
+// Explicitly identifies ARC ghost surface.
+DEFINE_UI_CLASS_PROPERTY_KEY(bool, kArcGhostSurface, false)
+
+ArcGhostWindowShellSurface::ArcGhostWindowShellSurface(
+    std::unique_ptr<exo::Surface> surface,
+    int container,
+    double scale_factor,
+    const std::string& application_id)
+    : ClientControlledShellSurface(surface.get(),
+                                   /*can_minimize=*/true,
+                                   container,
+                                   /*default_scale_cancellation=*/true) {
+  controller_surface_ = std::move(surface);
+  buffer_ = std::make_unique<exo::Buffer>(
+      aura::Env::GetInstance()
+          ->context_factory()
+          ->GetGpuMemoryBufferManager()
+          ->CreateGpuMemoryBuffer({1, 1}, gfx::BufferFormat::RGBA_8888,
+                                  gfx::BufferUsage::GPU_READ,
+                                  gpu::kNullSurfaceHandle, nullptr));
+  SetApplicationId(application_id.c_str());
+  controller_surface_->Attach(buffer_.get());
+  controller_surface_->SetFrame(exo::SurfaceFrameType::NORMAL);
+  SetScale(scale_factor);
+  CommitPendingScale();
+}
+
+ArcGhostWindowShellSurface::~ArcGhostWindowShellSurface() {
+  controller_surface_.reset();
+  buffer_.reset();
+}
+
+// static
+std::unique_ptr<ArcGhostWindowShellSurface> ArcGhostWindowShellSurface::Create(
     ArcWindowHandler* window_handler,
     const std::string& app_id,
     int window_id,
@@ -49,9 +82,10 @@
   int container = ash::desks_util::GetActiveDeskContainerId();
 
   auto surface = std::make_unique<exo::Surface>();
-  auto shell_surface = std::make_unique<ArcGhostWindowShellSurface>(
-      std::move(surface), container, scale_factor.value(),
-      WindowIdToAppId(window_id));
+  std::unique_ptr<ArcGhostWindowShellSurface> shell_surface(
+      new ArcGhostWindowShellSurface(std::move(surface), container,
+                                     scale_factor.value(),
+                                     WindowIdToAppId(window_id)));
 
   // TODO(sstan): Add set_surface_destroyed_callback.
   shell_surface->set_delegate(std::make_unique<ArcGhostWindowDelegate>(
@@ -104,43 +138,15 @@
   return shell_surface;
 }
 
-ArcGhostWindowShellSurface::ArcGhostWindowShellSurface(
-    std::unique_ptr<exo::Surface> surface,
-    int container,
-    double scale_factor,
-    const std::string& application_id)
-    : ClientControlledShellSurface(surface.get(),
-                                   /*can_minimize=*/true,
-                                   container,
-                                   /*default_scale_cancellation=*/true) {
-  controller_surface_ = std::move(surface);
-  buffer_ = std::make_unique<exo::Buffer>(
-      aura::Env::GetInstance()
-          ->context_factory()
-          ->GetGpuMemoryBufferManager()
-          ->CreateGpuMemoryBuffer({1, 1}, gfx::BufferFormat::RGBA_8888,
-                                  gfx::BufferUsage::GPU_READ,
-                                  gpu::kNullSurfaceHandle, nullptr));
-  SetApplicationId(application_id.c_str());
-  controller_surface_->Attach(buffer_.get());
-  controller_surface_->SetFrame(exo::SurfaceFrameType::NORMAL);
-  SetScale(scale_factor);
-  CommitPendingScale();
-}
-
-ArcGhostWindowShellSurface::~ArcGhostWindowShellSurface() {
-  controller_surface_.reset();
-  buffer_.reset();
-}
-
-exo::Surface* ArcGhostWindowShellSurface::controller_surface() {
-  return controller_surface_.get();
-}
-
 void ArcGhostWindowShellSurface::OverrideInitParams(
     views::Widget::InitParams* params) {
   ClientControlledShellSurface::OverrideInitParams(params);
   SetShellAppId(&params->init_properties_container, app_id_);
+  params->init_properties_container.SetProperty(kArcGhostSurface, true);
+}
+
+exo::Surface* ArcGhostWindowShellSurface::controller_surface() {
+  return controller_surface_.get();
 }
 
 void ArcGhostWindowShellSurface::InitContentOverlay(const std::string& app_id,
diff --git a/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.h b/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.h
index 26628f1..accfe4d 100644
--- a/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.h
+++ b/chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.h
@@ -19,35 +19,38 @@
 
 class ArcWindowHandler;
 
-std::unique_ptr<exo::ClientControlledShellSurface> InitArcGhostWindow(
-    ArcWindowHandler* window_handler,
-    const std::string& app_id,
-    int window_id,
-    const gfx::Rect& bounds,
-    app_restore::AppRestoreData* restore_data,
-    base::RepeatingClosure close_callback);
+// Explicitly identifies ARC ghost surface.
+extern const aura::WindowProperty<bool>* const kArcGhostSurface;
 
 // ArcGhostWindowShellSurface class is a shell surface which controlled its
 // root surface.
 class ArcGhostWindowShellSurface : public exo::ClientControlledShellSurface {
  public:
-  ArcGhostWindowShellSurface(std::unique_ptr<exo::Surface> surface,
-                             int container,
-                             double scale_factor,
-                             const std::string& application_id);
   ArcGhostWindowShellSurface(const ArcGhostWindowShellSurface&) = delete;
   ArcGhostWindowShellSurface& operator=(const ArcGhostWindowShellSurface&) =
       delete;
   ~ArcGhostWindowShellSurface() override;
 
-  void OverrideInitParams(views::Widget::InitParams* params) override;
+  static std::unique_ptr<ArcGhostWindowShellSurface> Create(
+      ArcWindowHandler* window_handler,
+      const std::string& app_id,
+      int window_id,
+      const gfx::Rect& bounds,
+      app_restore::AppRestoreData* restore_data,
+      base::RepeatingClosure close_callback);
 
-  void InitContentOverlay(const std::string& app_id, uint32_t theme_color);
-  void SetAppId(const absl::optional<std::string>& id);
+  void OverrideInitParams(views::Widget::InitParams* params) override;
 
   exo::Surface* controller_surface();
 
  private:
+  ArcGhostWindowShellSurface(std::unique_ptr<exo::Surface> surface,
+                             int container,
+                             double scale_factor,
+                             const std::string& application_id);
+
+  void InitContentOverlay(const std::string& app_id, uint32_t theme_color);
+  void SetAppId(const absl::optional<std::string>& id);
   void SetShellAppId(ui::PropertyHandler* property_handler,
                      const absl::optional<std::string>& id);
 
diff --git a/chrome/browser/ash/app_restore/arc_window_handler.cc b/chrome/browser/ash/app_restore/arc_window_handler.cc
index 13079b6..b52ed2e4 100644
--- a/chrome/browser/ash/app_restore/arc_window_handler.cc
+++ b/chrome/browser/ash/app_restore/arc_window_handler.cc
@@ -57,7 +57,13 @@
     lifetime_manager->AddObserver(this);
 }
 
-ArcWindowHandler::~ArcWindowHandler() = default;
+ArcWindowHandler::~ArcWindowHandler() {
+  if (exo::WMHelper::HasInstance()) {
+    auto* lifetime_manager = exo::WMHelper::GetInstance()->GetLifetimeManager();
+    if (lifetime_manager)
+      lifetime_manager->RemoveObserver(this);
+  }
+}
 
 void ArcWindowHandler::OnDestroyed() {
   // Destroy all ARC ghost window when Wayland server shutdown.
@@ -96,7 +102,7 @@
                         0, 0);
   }
 
-  auto shell_surface = InitArcGhostWindow(
+  auto shell_surface = ArcGhostWindowShellSurface::Create(
       this, app_id, session_id, adjust_bounds, restore_data,
       base::BindRepeating(&ArcWindowHandler::CloseWindow,
                           weak_ptr_factory_.GetWeakPtr(), session_id));
diff --git a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_unittest.cc b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_unittest.cc
index ed5072d..5b9bf19 100644
--- a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_unittest.cc
+++ b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_unittest.cc
@@ -234,7 +234,7 @@
   ASSERT_EQ(1, helper_bridge->GetEventCount(event_name));
   ASSERT_EQ(event_name, helper_bridge->last_event->event_name);
   base::Value::ConstListView arg =
-      helper_bridge->last_event->event_args->GetList()[0].GetList();
+      helper_bridge->last_event->event_args->GetListDeprecated()[0].GetList();
   ASSERT_EQ(1U, arg.size());
   ASSERT_EQ(announce_text, arg[0].GetString());
 }
@@ -264,7 +264,7 @@
   ASSERT_EQ(1, helper_bridge->GetEventCount(event_name));
   ASSERT_EQ(event_name, helper_bridge->last_event->event_name);
   base::Value::ConstListView arg =
-      helper_bridge->last_event->event_args->GetList()[0].GetList();
+      helper_bridge->last_event->event_args->GetListDeprecated()[0].GetList();
   ASSERT_EQ(1U, arg.size());
   ASSERT_EQ(toast_text, arg[0].GetString());
 
diff --git a/chrome/browser/ash/arc/enterprise/arc_force_installed_apps_tracker.cc b/chrome/browser/ash/arc/enterprise/arc_force_installed_apps_tracker.cc
index 4b83775..b30bf51 100644
--- a/chrome/browser/ash/arc/enterprise/arc_force_installed_apps_tracker.cc
+++ b/chrome/browser/ash/arc/enterprise/arc_force_installed_apps_tracker.cc
@@ -249,7 +249,7 @@
   }
 
   bool is_android_id_reset = true;
-  for (const auto& detail : details->GetList()) {
+  for (const auto& detail : details->GetListDeprecated()) {
     const base::Value* const reason =
         detail.FindKeyOfType("nonComplianceReason", base::Value::Type::INTEGER);
     const std::string* const settingName = detail.FindStringKey("settingName");
diff --git a/chrome/browser/ash/arc/fileapi/arc_select_files_handler.cc b/chrome/browser/ash/arc/fileapi/arc_select_files_handler.cc
index 2aa76a9c..e2034c1 100644
--- a/chrome/browser/ash/arc/fileapi/arc_select_files_handler.cc
+++ b/chrome/browser/ash/arc/fileapi/arc_select_files_handler.cc
@@ -82,7 +82,7 @@
   if (!list_value || !list_value->is_list())
     return;
 
-  for (const base::Value& value : list_value->GetList()) {
+  for (const base::Value& value : list_value->GetListDeprecated()) {
     mojom::FileSelectorElementPtr element = mojom::FileSelectorElement::New();
     element->name = value.GetString();
     elements->push_back(std::move(element));
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action.cc b/chrome/browser/ash/arc/input_overlay/actions/action.cc
index 9732f83..e3118ec 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action.cc
@@ -135,7 +135,7 @@
   auto* modifier_list = value.FindListKey(kModifiers);
   int modifiers = 0;
   if (modifier_list) {
-    for (const base::Value& val : modifier_list->GetList()) {
+    for (const base::Value& val : modifier_list->GetListDeprecated()) {
       if (base::ToLowerASCII(val.GetString()) == kCtrl)
         modifiers |= ui::EF_CONTROL_DOWN;
       else if (base::ToLowerASCII(val.GetString()) == kShift)
diff --git a/chrome/browser/ash/arc/input_overlay/actions/action_move_key.cc b/chrome/browser/ash/arc/input_overlay/actions/action_move_key.cc
index fda29bd..8d1ceb0 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/action_move_key.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/action_move_key.cc
@@ -41,13 +41,13 @@
     LOG(ERROR) << "Require key codes for move key action: " << name_ << ".";
     return false;
   }
-  if (keys->GetList().size() != kActionMoveKeysSize) {
+  if (keys->GetListDeprecated().size() != kActionMoveKeysSize) {
     LOG(ERROR) << "Not right amount of keys for action move keys. Require {"
                << kActionMoveKeysSize << "} keys, but got {"
-               << keys->GetList().size() << "} keys.";
+               << keys->GetListDeprecated().size() << "} keys.";
     return false;
   }
-  for (const base::Value& val : keys->GetList()) {
+  for (const base::Value& val : keys->GetListDeprecated()) {
     DCHECK(val.is_string());
     auto key = ui::KeycodeConverter::CodeStringToDomCode(val.GetString());
     if (key == ui::DomCode::NONE) {
diff --git a/chrome/browser/ash/arc/input_overlay/actions/position.cc b/chrome/browser/ash/arc/input_overlay/actions/position.cc
index 1aec12a4..1b294317 100644
--- a/chrome/browser/ash/arc/input_overlay/actions/position.cc
+++ b/chrome/browser/ash/arc/input_overlay/actions/position.cc
@@ -28,7 +28,7 @@
     LOG(ERROR) << "Require list values for key " << key;
     return absl::nullopt;
   }
-  auto list = list_value->GetList();
+  auto list = list_value->GetListDeprecated();
   if (list.size() != 2) {
     LOG(ERROR) << "Require two elements for " << key << ". But got "
                << list.size() << " elements.";
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
index b4dc4d8..64a8ca6bb 100644
--- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
+++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
@@ -4,13 +4,28 @@
 
 #include "chrome/browser/ash/arc/input_overlay/display_overlay_controller.h"
 
+#include <memory>
+
 #include "ash/frame/non_client_frame_view_ash.h"
+#include "chrome/grit/generated_resources.h"
 #include "components/exo/shell_surface_base.h"
 #include "components/exo/shell_surface_util.h"
+#include "components/vector_icons/vector_icons.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/geometry/size.h"
+#include "ui/gfx/paint_vector_icon.h"
+#include "ui/views/background.h"
+#include "ui/views/widget/widget.h"
 
 namespace arc {
 namespace input_overlay {
 
+namespace {
+constexpr int kMinAnchorSide = 40;
+}  // namespace
+
+// TODO(djacobo): Evaluate to move this to its own class for readability.
 class DisplayOverlayController::InputMappingView : public views::View {
  public:
   explicit InputMappingView(DisplayOverlayController* owner) : owner_(owner) {
@@ -37,7 +52,7 @@
     TouchInjector* touch_injector)
     : touch_injector_(touch_injector) {
   AddOverlay();
-  AddInputMappingView();
+  AddOverlayChildrenViews();
 }
 
 DisplayOverlayController::~DisplayOverlayController() {
@@ -46,7 +61,7 @@
 
 void DisplayOverlayController::OnWindowBoundsChanged() {
   RemoveInputMappingView();
-  AddInputMappingView();
+  AddOverlayChildrenViews();
 }
 
 // For test:
@@ -81,18 +96,66 @@
     shell_surface_base->RemoveOverlay();
 }
 
-void DisplayOverlayController::AddInputMappingView() {
+void DisplayOverlayController::AddOverlayChildrenViews() {
   if (input_mapping_view_)
     return;
   auto* overlay_widget = GetOverlayWidget();
   DCHECK(overlay_widget);
   if (!overlay_widget)
     return;
+
+  AddInputMappingView(overlay_widget);
+  AddInputOverlayMenuView(overlay_widget);
+}
+
+void DisplayOverlayController::AddInputMappingView(
+    views::Widget* overlay_widget) {
+  DCHECK(overlay_widget);
+
+  auto input_mapping_view = std::make_unique<InputMappingView>(this);
+  input_mapping_view->SetPosition(gfx::Point());
+
   input_mapping_view_ = overlay_widget->GetContentsView()->AddChildView(
-      std::make_unique<InputMappingView>(this));
+      std::move(input_mapping_view));
   input_mapping_view_->SetPosition(gfx::Point());
 }
 
+void DisplayOverlayController::AddInputOverlayMenuView(
+    views::Widget* overlay_widget) {
+  DCHECK(overlay_widget);
+  auto game_icon = gfx::CreateVectorIcon(
+      vector_icons::kVideogameAssetOutlineIcon, SK_ColorBLACK);
+
+  // Create and position entry point for |InputOverlayMenuView|.
+  auto overlay_menu_anchor = std::make_unique<views::ImageButton>(
+      base::BindRepeating(&DisplayOverlayController::OnMenuAnchorPressed,
+                          base::Unretained(this)));
+  overlay_menu_anchor->SetImage(views::Button::STATE_NORMAL, game_icon);
+  overlay_menu_anchor->SetBackground(
+      views::CreateSolidBackground(SK_ColorWHITE));
+  overlay_menu_anchor->SetSize(gfx::Size(kMinAnchorSide, kMinAnchorSide));
+  overlay_menu_anchor->SetImageHorizontalAlignment(
+      views::ImageButton::ALIGN_CENTER);
+  overlay_menu_anchor->SetImageVerticalAlignment(
+      views::ImageButton::ALIGN_MIDDLE);
+  // TODO(djacobo): Set proper positioning based on specs and responding to
+  // resize.
+  overlay_menu_anchor->SetPosition(CalculateMenuAnchorPosition());
+  // TODO(djacobo): come up with a new resource for this so it can be
+  // translated, or just keep reusing the one I set here.
+  overlay_menu_anchor->SetAccessibleName(
+      l10n_util::GetStringUTF16(IDS_INPUT_OVERLAY_MENU_ENTRY_BUTTON));
+
+  auto* parent_view = overlay_widget->GetContentsView();
+  DCHECK(parent_view);
+  overlay_menu_anchor_ =
+      parent_view->AddChildView(std::move(overlay_menu_anchor));
+}
+
+void DisplayOverlayController::OnMenuAnchorPressed() {
+  // TODO(djacobo): Implement calling |InputOverlayMenuView|.
+}
+
 void DisplayOverlayController::RemoveInputMappingView() {
   if (!input_mapping_view_)
     return;
@@ -114,5 +177,16 @@
                             : nullptr;
 }
 
+gfx::Point DisplayOverlayController::CalculateMenuAnchorPosition() {
+  auto* overlay_widget = GetOverlayWidget();
+  if (!overlay_widget)
+    return gfx::Point();
+  auto* view = overlay_widget->GetContentsView();
+  if (!view || view->bounds().IsEmpty())
+    return gfx::Point();
+
+  return gfx::Point(view->width() - 2 * kMinAnchorSide, view->height() / 2);
+}
+
 }  // namespace input_overlay
 }  // namespace arc
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
index 8405b956..9362c1d5 100644
--- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
+++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.h
@@ -7,9 +7,15 @@
 
 #include "chrome/browser/ash/arc/input_overlay/actions/action.h"
 #include "chrome/browser/ash/arc/input_overlay/touch_injector.h"
-#include "ui/views/widget/widget.h"
+#include "ui/gfx/geometry/point.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/views/controls/button/image_button.h"
 #include "ui/views/widget/widget_observer.h"
 
+namespace views {
+class Widget;
+}  // namespace views
+
 namespace arc {
 namespace input_overlay {
 // DisplayOverlayController manages the input mapping view, view and edit mode,
@@ -34,12 +40,22 @@
 
   void AddOverlay();
   void RemoveOverlayIfAny();
-  void AddInputMappingView();
+  void AddOverlayChildrenViews();
+  void AddInputMappingView(views::Widget* overlay_widget);
+  void AddInputOverlayMenuView(views::Widget* overlay_widget);
+  void OnMenuAnchorPressed();
   void RemoveInputMappingView();
   views::Widget* GetOverlayWidget();
+  gfx::Point CalculateMenuAnchorPosition();
+  gfx::Rect get_overlay_menu_anchor_bounds() const {
+    return overlay_menu_anchor_->bounds();
+  }
 
   TouchInjector* touch_injector_;
+
+  // References to UI elements owned by the overlay widget.
   InputMappingView* input_mapping_view_ = nullptr;
+  views::ImageButton* overlay_menu_anchor_ = nullptr;
 };
 
 }  // namespace input_overlay
diff --git a/chrome/browser/ash/arc/input_overlay/touch_injector.cc b/chrome/browser/ash/arc/input_overlay/touch_injector.cc
index 92c38ba..88dc882 100644
--- a/chrome/browser/ash/arc/input_overlay/touch_injector.cc
+++ b/chrome/browser/ash/arc/input_overlay/touch_injector.cc
@@ -42,7 +42,7 @@
   if (tap_act_val) {
     const base::Value* keyboard_act_list = tap_act_val->FindListKey(kKeyboard);
     if (keyboard_act_list && keyboard_act_list->is_list()) {
-      for (const base::Value& val : keyboard_act_list->GetList()) {
+      for (const base::Value& val : keyboard_act_list->GetListDeprecated()) {
         std::unique_ptr<Action> action = std::make_unique<ActionTapKey>(window);
         bool succeed = action->ParseFromJson(val);
         if (succeed)
@@ -51,7 +51,7 @@
     }
     const auto* mouse_act_list = tap_act_val->FindListKey(kMouse);
     if (mouse_act_list && mouse_act_list->is_list()) {
-      for (const auto& val : mouse_act_list->GetList()) {
+      for (const auto& val : mouse_act_list->GetListDeprecated()) {
         auto action = std::make_unique<input_overlay::ActionTapMouse>(window);
         bool succeed = action->ParseFromJson(val);
         if (succeed)
@@ -65,7 +65,7 @@
   if (move_act_val) {
     const base::Value* keyboard_act_list = move_act_val->FindListKey(kKeyboard);
     if (keyboard_act_list && keyboard_act_list->is_list()) {
-      for (const base::Value& val : keyboard_act_list->GetList()) {
+      for (const base::Value& val : keyboard_act_list->GetListDeprecated()) {
         std::unique_ptr<Action> action =
             std::make_unique<ActionMoveKey>(window);
         bool succeed = action->ParseFromJson(val);
@@ -75,7 +75,7 @@
     }
     const auto* mouse_act_list = move_act_val->FindListKey(kMouse);
     if (mouse_act_list && mouse_act_list->is_list()) {
-      for (const auto& val : mouse_act_list->GetList()) {
+      for (const auto& val : mouse_act_list->GetListDeprecated()) {
         auto action = std::make_unique<ActionMoveMouse>(window);
         bool succeed = action->ParseFromJson(val);
         if (succeed)
diff --git a/chrome/browser/ash/arc/policy/arc_policy_bridge.cc b/chrome/browser/ash/arc/policy/arc_policy_bridge.cc
index 24e7240d..a3d86c7c 100644
--- a/chrome/browser/ash/arc/policy/arc_policy_bridge.cc
+++ b/chrome/browser/ash/arc/policy/arc_policy_bridge.cc
@@ -180,7 +180,7 @@
       continue;
 
     bool web_trust_flag = false;
-    for (const auto& list_val : trust_list->GetList()) {
+    for (const auto& list_val : trust_list->GetListDeprecated()) {
       if (!list_val.is_string())
         NOTREACHED();
 
@@ -299,7 +299,7 @@
     base::Value* applications_value =
         filtered_policies.FindListKey(ArcPolicyBridge::kApplications);
     if (applications_value) {
-      base::Value::ListView list_view = applications_value->GetList();
+      base::Value::ListView list_view = applications_value->GetListDeprecated();
       for (base::Value& entry : list_view) {
         auto* installType = entry.FindStringKey("installType");
         if (installType &&
@@ -323,7 +323,7 @@
     base::Value* applications_value =
         filtered_policies.FindListKey(ArcPolicyBridge::kApplications);
     if (applications_value) {
-      base::Value::ListView list_view = applications_value->GetList();
+      base::Value::ListView list_view = applications_value->GetListDeprecated();
       for (base::Value& entry : list_view) {
         const std::string* packageName = entry.FindStringKey("packageName");
         if (packageName && *packageName != kPlayStorePackageName)
diff --git a/chrome/browser/ash/arc/policy/arc_policy_util.cc b/chrome/browser/ash/arc/policy/arc_policy_util.cc
index 73f8543..963dcd16 100644
--- a/chrome/browser/ash/arc/policy/arc_policy_util.cc
+++ b/chrome/browser/ash/arc/policy/arc_policy_util.cc
@@ -55,7 +55,7 @@
     return {};
 
   std::set<std::string> requested_packages;
-  for (const auto& package : packages->GetList()) {
+  for (const auto& package : packages->GetListDeprecated()) {
     if (!package.is_dict())
       continue;
     const base::Value* const install_type =
diff --git a/chrome/browser/ash/arc/survey/arc_survey_service.cc b/chrome/browser/ash/arc/survey/arc_survey_service.cc
index 41be33c4..17e1c75 100644
--- a/chrome/browser/ash/arc/survey/arc_survey_service.cc
+++ b/chrome/browser/ash/arc/survey/arc_survey_service.cc
@@ -123,7 +123,7 @@
     VLOG(1) << "List of package names not found in the survey data.";
     return false;
   }
-  const base::Value::ConstListView items = list->GetList();
+  const base::Value::ConstListView items = list->GetListDeprecated();
   if (items.empty()) {
     VLOG(1) << "List of package names is empty in the survey data.";
     return false;
diff --git a/chrome/browser/ash/arc/tracing/arc_app_performance_tracing.cc b/chrome/browser/ash/arc/tracing/arc_app_performance_tracing.cc
index cd08c66..355c257 100644
--- a/chrome/browser/ash/arc/tracing/arc_app_performance_tracing.cc
+++ b/chrome/browser/ash/arc/tracing/arc_app_performance_tracing.cc
@@ -14,6 +14,7 @@
 #include "base/no_destructor.h"
 #include "base/strings/string_util.h"
 #include "base/timer/timer.h"
+#include "chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.h"
 #include "chrome/browser/ash/arc/tracing/arc_app_performance_tracing_custom_session.h"
 #include "chrome/browser/ash/arc/tracing/arc_app_performance_tracing_session.h"
 #include "chrome/browser/ash/arc/tracing/arc_app_performance_tracing_uma_session.h"
@@ -23,6 +24,7 @@
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs_factory.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
 #include "chrome/browser/ui/app_list/arc/arc_package_syncable_service.h"
+#include "components/app_restore/window_properties.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/exo/surface.h"
 #include "components/exo/wm_helper.h"
@@ -206,6 +208,10 @@
   if (arc::GetWindowTaskId(gained_active) <= 0)
     return;
 
+  // Ghost window is not an actual app window.
+  if (gained_active->GetProperty(ash::full_restore::kArcGhostSurface))
+    return;
+
   // Observe active ARC++ window.
   AttachActiveWindow(gained_active);
 
diff --git a/chrome/browser/ash/arc/tracing/arc_app_performance_tracing_unittest.cc b/chrome/browser/ash/arc/tracing/arc_app_performance_tracing_unittest.cc
index 4e33192..d8a1c12 100644
--- a/chrome/browser/ash/arc/tracing/arc_app_performance_tracing_unittest.cc
+++ b/chrome/browser/ash/arc/tracing/arc_app_performance_tracing_unittest.cc
@@ -6,9 +6,13 @@
 
 #include <memory>
 
+#include "ash/shell.h"
+#include "ash/wm/desks/desks_util.h"
 #include "base/metrics/histogram_samples.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/strings/stringprintf.h"
+#include "chrome/browser/ash/app_restore/arc_ghost_window_shell_surface.h"
+#include "chrome/browser/ash/app_restore/arc_window_handler.h"
 #include "chrome/browser/ash/arc/tracing/arc_app_performance_tracing_session.h"
 #include "chrome/browser/ash/arc/tracing/arc_app_performance_tracing_test_helper.h"
 #include "chrome/browser/ash/arc/tracing/arc_app_performance_tracing_uma_session.h"
@@ -18,11 +22,16 @@
 #include "chrome/browser/ui/app_list/arc/arc_app_test.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/app_restore/app_restore_data.h"
 #include "components/exo/shell_surface_util.h"
 #include "components/exo/surface.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/views/widget/widget.h"
 
+#include "ui/display/display.h"
+#include "ui/display/test/test_screen.h"
+#include "ui/gfx/native_widget_types.h"
+
 namespace arc {
 
 namespace {
@@ -311,4 +320,40 @@
   arc_widget->Close();
 }
 
+TEST_F(ArcAppPerformanceTracingTest, NoTracingForArcGhostWindow) {
+  display::Display display =
+      display::Screen::GetScreen()->GetDisplayNearestWindow(
+          ash::Shell::GetPrimaryRootWindow());
+
+  ash::full_restore::ArcWindowHandler handler;
+  app_restore::AppRestoreData restore_data;
+  restore_data.display_id = display.id();
+  auto ghost_window = ash::full_restore::ArcGhostWindowShellSurface::Create(
+      &handler, "app_id" /* app_id */, 1 /* window_id */,
+      gfx::Rect(10, 10, 100, 100) /* bounds */, &restore_data,
+      base::BindRepeating([]() {}));
+  ASSERT_TRUE(ghost_window);
+
+  // Associate ghost window with real app.
+  ghost_window->SetApplicationId("org.chromium.arc.1");
+
+  // This creates window.
+  ghost_window->SetSystemUiVisibility(false /* autohide */);
+  ASSERT_TRUE(ghost_window->GetWidget());
+  ASSERT_TRUE(ghost_window->GetWidget()->GetNativeWindow());
+  ghost_window->GetWidget()->GetNativeWindow()->Show();
+
+  tracing_helper().GetTracing()->OnTaskCreated(
+      1 /* task_Id */, kFocusAppPackage, kFocusAppActivity,
+      std::string() /* intent */, 0 /* session_id */);
+
+  tracing_helper().GetTracing()->OnWindowActivated(
+      wm::ActivationChangeObserver::ActivationReason::ACTIVATION_CLIENT,
+      ghost_window->GetWidget()->GetNativeWindow() /* gained_active */,
+      nullptr /* lost_active */);
+
+  // Ghost window should not trigger tracing sessions.
+  DCHECK(!tracing_helper().GetTracingSession());
+}
+
 }  // namespace arc
diff --git a/chrome/browser/ash/arc/tracing/arc_cpu_event.cc b/chrome/browser/ash/arc/tracing/arc_cpu_event.cc
index 63f52d7..10f2dc6 100644
--- a/chrome/browser/ash/arc/tracing/arc_cpu_event.cc
+++ b/chrome/browser/ash/arc/tracing/arc_cpu_event.cc
@@ -144,7 +144,7 @@
     return false;
 
   uint64_t previous_timestamp = 0;
-  for (const auto& entry : value->GetList()) {
+  for (const auto& entry : value->GetListDeprecated()) {
     if (!entry.is_list() || entry.GetList().size() != 3)
       return false;
     if (!entry.GetList()[0].is_int())
@@ -179,7 +179,7 @@
   if (!value || !value->is_list())
     return false;
 
-  for (const auto& entry : value->GetList()) {
+  for (const auto& entry : value->GetListDeprecated()) {
     CpuEvents cpu_events;
     if (!LoadCpuEvents(&entry, &cpu_events))
       return false;
diff --git a/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc b/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc
index 12d9bac..8e9055e 100644
--- a/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc
+++ b/chrome/browser/ash/arc/tracing/arc_system_stat_collector.cc
@@ -536,7 +536,7 @@
   if (!sample_list)
     return false;
 
-  for (const auto& sample_entry : sample_list->GetList()) {
+  for (const auto& sample_entry : sample_list->GetListDeprecated()) {
     if (!sample_entry.is_dict())
       return false;
 
diff --git a/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc b/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc
index dc22be4..f019a66 100644
--- a/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc
+++ b/chrome/browser/ash/arc/tracing/arc_tracing_graphics_model.cc
@@ -1448,7 +1448,7 @@
   if (!value || !value->is_list())
     return false;
   int64_t previous_timestamp = 0;
-  for (const auto& entry : value->GetList()) {
+  for (const auto& entry : value->GetListDeprecated()) {
     if (!entry.is_list() || entry.GetList().size() < 2)
       return false;
     if (!entry.GetList()[0].is_int())
@@ -1507,7 +1507,7 @@
   if (!buffer_entries)
     return false;
 
-  for (const auto& buffer_entry : buffer_entries->GetList()) {
+  for (const auto& buffer_entry : buffer_entries->GetListDeprecated()) {
     BufferEvents events;
     if (!LoadEvents(&buffer_entry, &events))
       return false;
@@ -1893,12 +1893,12 @@
 
   const base::Value* view_list =
       root.FindKeyOfType(kKeyViews, base::Value::Type::LIST);
-  if (!view_list || view_list->GetList().empty()) {
+  if (!view_list || view_list->GetListDeprecated().empty()) {
     // Views are optional for overview tracing.
     if (!skip_structure_validation_)
       return false;
   } else {
-    for (const auto& view_entry : view_list->GetList()) {
+    for (const auto& view_entry : view_list->GetListDeprecated()) {
       if (!view_entry.is_dict())
         return false;
       const base::Value* activity =
diff --git a/chrome/browser/ash/arc/tracing/arc_tracing_model.cc b/chrome/browser/ash/arc/tracing/arc_tracing_model.cc
index e91c1a4b..cbd853a 100644
--- a/chrome/browser/ash/arc/tracing/arc_tracing_model.cc
+++ b/chrome/browser/ash/arc/tracing/arc_tracing_model.cc
@@ -432,7 +432,7 @@
 
 bool ArcTracingModel::ProcessEvent(base::ListValue* events) {
   std::vector<std::unique_ptr<ArcTracingEvent>> parsed_events;
-  for (auto& it : events->GetList()) {
+  for (auto& it : events->GetListDeprecated()) {
     base::Value event_data = std::move(it);
     if (!event_data.is_dict()) {
       LOG(ERROR) << "Event is not a dictionary";
diff --git a/chrome/browser/ash/arc/tracing/arc_value_event.cc b/chrome/browser/ash/arc/tracing/arc_value_event.cc
index feab513..9908f421 100644
--- a/chrome/browser/ash/arc/tracing/arc_value_event.cc
+++ b/chrome/browser/ash/arc/tracing/arc_value_event.cc
@@ -31,7 +31,7 @@
     return false;
 
   int64_t previous_timestamp = 0;
-  for (const auto& entry : value->GetList()) {
+  for (const auto& entry : value->GetListDeprecated()) {
     if (!entry.is_list() || entry.GetList().size() != 3)
       return false;
     if (!entry.GetList()[0].is_int())
diff --git a/chrome/browser/ash/base/locale_util.cc b/chrome/browser/ash/base/locale_util.cc
index 967061c3..dd25624c 100644
--- a/chrome/browser/ash/base/locale_util.cc
+++ b/chrome/browser/ash/base/locale_util.cc
@@ -156,7 +156,7 @@
 
 bool IsAllowedLanguage(const std::string& language, const PrefService* prefs) {
   base::Value::ConstListView allowed_languages =
-      prefs->GetList(prefs::kAllowedLanguages)->GetList();
+      prefs->GetList(prefs::kAllowedLanguages)->GetListDeprecated();
 
   // Empty list means all languages are allowed.
   if (allowed_languages.empty())
@@ -180,7 +180,7 @@
 
 void RemoveDisallowedLanguagesFromPreferred(PrefService* prefs) {
   // Do nothing if all languages are allowed
-  if (prefs->GetList(prefs::kAllowedLanguages)->GetList().empty())
+  if (prefs->GetList(prefs::kAllowedLanguages)->GetListDeprecated().empty())
     return;
 
   std::vector<std::string> preferred_languages =
@@ -218,7 +218,7 @@
 
   // Check the allowed UI locales and return the first valid entry.
   base::Value::ConstListView allowed_languages =
-      prefs->GetList(prefs::kAllowedLanguages)->GetList();
+      prefs->GetList(prefs::kAllowedLanguages)->GetListDeprecated();
   for (const base::Value& value : allowed_languages) {
     const std::string& locale = value.GetString();
     if (IsAllowedUILanguage(locale, prefs))
diff --git a/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc b/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc
index a1429d3..fd3d834e 100644
--- a/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc
+++ b/chrome/browser/ash/cert_provisioning/cert_provisioning_scheduler.cc
@@ -553,7 +553,7 @@
     return {};
   }
 
-  for (const base::Value& cur_profile : profile_list->GetList()) {
+  for (const base::Value& cur_profile : profile_list->GetListDeprecated()) {
     const CertProfileId* id = cur_profile.FindStringKey(kCertProfileIdKey);
     if (!id || (*id != cert_profile_id)) {
       continue;
@@ -575,7 +575,7 @@
   }
 
   std::vector<CertProfile> result_profiles;
-  for (const base::Value& cur_profile : profile_list->GetList()) {
+  for (const base::Value& cur_profile : profile_list->GetListDeprecated()) {
     absl::optional<CertProfile> p = CertProfile::MakeFromValue(cur_profile);
     if (!p) {
       LOG(WARNING) << "Failed to parse certificate profile";
diff --git a/chrome/browser/ash/child_accounts/parent_access_code/config_source.cc b/chrome/browser/ash/child_accounts/parent_access_code/config_source.cc
index adc20a2..89e7ab1 100644
--- a/chrome/browser/ash/child_accounts/parent_access_code/config_source.cc
+++ b/chrome/browser/ash/child_accounts/parent_access_code/config_source.cc
@@ -70,7 +70,7 @@
   const base::Value* old_configs_value =
       dictionary->FindKeyOfType(kOldConfigsDictKey, base::Value::Type::LIST);
   if (old_configs_value) {
-    for (const auto& config_value : old_configs_value->GetList())
+    for (const auto& config_value : old_configs_value->GetListDeprecated())
       AddAuthenticator(config_value, user);
   }
 }
diff --git a/chrome/browser/ash/child_accounts/time_limit_override.cc b/chrome/browser/ash/child_accounts/time_limit_override.cc
index dcbd967..80a1c8a 100644
--- a/chrome/browser/ash/child_accounts/time_limit_override.cc
+++ b/chrome/browser/ash/child_accounts/time_limit_override.cc
@@ -92,7 +92,7 @@
 
   // The most recent override created.
   absl::optional<TimeLimitOverride> last_override;
-  for (const base::Value& override_value : list->GetList()) {
+  for (const base::Value& override_value : list->GetListDeprecated()) {
     absl::optional<TimeLimitOverride> current_override =
         FromDictionary(&override_value);
     if (!current_override.has_value()) {
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_activity_registry.cc b/chrome/browser/ash/child_accounts/time_limits/app_activity_registry.cc
index 1bfddcc7..ecfcc46 100644
--- a/chrome/browser/ash/child_accounts/time_limits/app_activity_registry.cc
+++ b/chrome/browser/ash/child_accounts/time_limits/app_activity_registry.cc
@@ -632,7 +632,7 @@
 
     const base::Time now = base::Time::Now();
 
-    base::Value::ListView list_view = list_value->GetList();
+    base::Value::ListView list_view = list_value->GetListDeprecated();
     for (base::Value& entry : list_view) {
       absl::optional<AppId> app_id = policy::AppIdFromAppInfoDict(entry);
       DCHECK(app_id.has_value());
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.cc b/chrome/browser/ash/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.cc
index 33ac68e..6baf7e9a 100644
--- a/chrome/browser/ash/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.cc
+++ b/chrome/browser/ash/child_accounts/time_limits/app_time_limits_allowlist_policy_wrapper.cc
@@ -29,7 +29,7 @@
     return return_value;
   }
 
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
   for (const base::Value& value : list_view) {
     if (!value.is_string()) {
       VLOG(1) << "Allowlist URL is not a string.";
@@ -50,7 +50,7 @@
     return return_value;
   }
 
-  base::Value::ConstListView list_view = app_list->GetList();
+  base::Value::ConstListView list_view = app_list->GetListDeprecated();
   for (const base::Value& value : list_view) {
     absl::optional<AppId> app_id = policy::AppIdFromDict(value);
     if (app_id)
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_time_policy_helpers.cc b/chrome/browser/ash/child_accounts/time_limits/app_time_policy_helpers.cc
index 7ca76f45..fc7ee70 100644
--- a/chrome/browser/ash/child_accounts/time_limits/app_time_policy_helpers.cc
+++ b/chrome/browser/ash/child_accounts/time_limits/app_time_policy_helpers.cc
@@ -239,7 +239,7 @@
     return app_limits;
   }
 
-  base::Value::ConstListView list_view = limits_array->GetList();
+  base::Value::ConstListView list_view = limits_array->GetListDeprecated();
   for (const base::Value& dict : list_view) {
     if (!dict.is_dict()) {
       DLOG(ERROR) << "Invalid app limits entry. ";
diff --git a/chrome/browser/ash/child_accounts/time_limits/persisted_app_info.cc b/chrome/browser/ash/child_accounts/time_limits/persisted_app_info.cc
index dfa9c76f..7428316 100644
--- a/chrome/browser/ash/child_accounts/time_limits/persisted_app_info.cc
+++ b/chrome/browser/ash/child_accounts/time_limits/persisted_app_info.cc
@@ -80,7 +80,7 @@
     return active_times;
   }
 
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
 
   for (const auto& value : list_view) {
     absl::optional<AppActivity::ActiveTime> entry = AppActivityFromDict(value);
@@ -145,7 +145,7 @@
   if (!value || !value->is_list())
     return apps_info;
 
-  base::Value::ConstListView list_view = value->GetList();
+  base::Value::ConstListView list_view = value->GetListDeprecated();
 
   for (const auto& per_app_info : list_view) {
     absl::optional<PersistedAppInfo> info =
@@ -247,7 +247,7 @@
 
   // If the last entry in |value| can be merged with the first entry in
   // |active_times_| merge them.
-  base::Value::ListView list_view = value->GetList();
+  base::Value::ListView list_view = value->GetListDeprecated();
   if (list_view.size() > 0) {
     base::Value& mergeable_entry = list_view[list_view.size() - 1];
     absl::optional<AppActivity::ActiveTime> active_time =
diff --git a/chrome/browser/ash/child_accounts/usage_time_limit_processor.cc b/chrome/browser/ash/child_accounts/usage_time_limit_processor.cc
index d94e54e..52a86c31 100644
--- a/chrome/browser/ash/child_accounts/usage_time_limit_processor.cc
+++ b/chrome/browser/ash/child_accounts/usage_time_limit_processor.cc
@@ -1100,7 +1100,7 @@
     return;
 
   for (const base::Value& entry_dict :
-       window_limit_dict.FindKey(kWindowLimitEntries)->GetList()) {
+       window_limit_dict.FindKey(kWindowLimitEntries)->GetListDeprecated()) {
     const base::Value* effective_day =
         entry_dict.FindKey(kWindowLimitEntryEffectiveDay);
     const base::Value* starts_at =
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index 184628d..2d89fc5c 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -465,7 +465,8 @@
                                  &usb_detachable_allow_list)) {
         mojom::UsbDetachableAllowlistPtr allow_list =
             mojom::UsbDetachableAllowlist::New();
-        for (const auto& entry : usb_detachable_allow_list->GetList()) {
+        for (const auto& entry :
+             usb_detachable_allow_list->GetListDeprecated()) {
           mojom::UsbDeviceIdPtr usb_device_id = mojom::UsbDeviceId::New();
           absl::optional<int> vid =
               entry.FindIntKey(ash::kUsbDetachableAllowlistKeyVid);
diff --git a/chrome/browser/ash/crosapi/lacros_availability_policy_observer_unittest.cc b/chrome/browser/ash/crosapi/lacros_availability_policy_observer_unittest.cc
index 05583a51..ee505aa 100644
--- a/chrome/browser/ash/crosapi/lacros_availability_policy_observer_unittest.cc
+++ b/chrome/browser/ash/crosapi/lacros_availability_policy_observer_unittest.cc
@@ -91,7 +91,7 @@
         absl::optional<base::Value> parsed = base::JSONReader::Read(flag_value);
         std::vector<std::string> result;
         if (parsed && parsed->is_list()) {
-          for (const auto& element : parsed->GetList()) {
+          for (const auto& element : parsed->GetListDeprecated()) {
             result.push_back(element.GetString());
           }
         }
diff --git a/chrome/browser/ash/crosapi/local_printer_ash.cc b/chrome/browser/ash/crosapi/local_printer_ash.cc
index d5abf90..ac3908d3 100644
--- a/chrome/browser/ash/crosapi/local_printer_ash.cc
+++ b/chrome/browser/ash/crosapi/local_printer_ash.cc
@@ -494,8 +494,9 @@
     return;
   }
 
-  deny_list.reserve(deny_list_from_prefs->GetList().size());
-  for (const base::Value& deny_list_value : deny_list_from_prefs->GetList()) {
+  deny_list.reserve(deny_list_from_prefs->GetListDeprecated().size());
+  for (const base::Value& deny_list_value :
+       deny_list_from_prefs->GetListDeprecated()) {
     const std::string& deny_list_str = deny_list_value.GetString();
     printing::mojom::PrinterType printer_type;
     if (deny_list_str == "privet")
diff --git a/chrome/browser/ash/crosapi/video_capture_device_ash.cc b/chrome/browser/ash/crosapi/video_capture_device_ash.cc
index 3f634c9..9032949 100644
--- a/chrome/browser/ash/crosapi/video_capture_device_ash.cc
+++ b/chrome/browser/ash/crosapi/video_capture_device_ash.cc
@@ -60,4 +60,8 @@
   device_->ProcessFeedback(std::move(feedback));
 }
 
+void VideoCaptureDeviceAsh::RequestRefreshFrame() {
+  device_->RequestRefreshFrame();
+}
+
 }  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/video_capture_device_ash.h b/chrome/browser/ash/crosapi/video_capture_device_ash.h
index 94e2f98..c14933a 100644
--- a/chrome/browser/ash/crosapi/video_capture_device_ash.h
+++ b/chrome/browser/ash/crosapi/video_capture_device_ash.h
@@ -41,6 +41,7 @@
                        SetPhotoOptionsCallback callback) override;
   void TakePhoto(TakePhotoCallback callback) override;
   void ProcessFeedback(const media::VideoCaptureFeedback& feedback) override;
+  void RequestRefreshFrame() override;
 
   std::unique_ptr<VideoFrameHandlerAsh> handler_;
 
diff --git a/chrome/browser/ash/crosapi/video_frame_handler_ash.cc b/chrome/browser/ash/crosapi/video_frame_handler_ash.cc
index 1b87c75..f509f7af 100644
--- a/chrome/browser/ash/crosapi/video_frame_handler_ash.cc
+++ b/chrome/browser/ash/crosapi/video_frame_handler_ash.cc
@@ -135,6 +135,11 @@
   } else if (buffer_handle->is_gpu_memory_buffer_handle()) {
     crosapi_handle->set_gpu_memory_buffer_handle(ToCrosapiGpuMemoryBufferHandle(
         std::move(buffer_handle->get_gpu_memory_buffer_handle())));
+  } else if (buffer_handle->is_read_only_shmem_region()) {
+    // Lacros is guaranteed to be newer than us so it's okay to skip the version
+    // check here.
+    crosapi_handle->set_read_only_shmem_region(
+        std::move(buffer_handle->get_read_only_shmem_region()));
   } else {
     NOTREACHED() << "Unexpected new buffer type";
   }
diff --git a/chrome/browser/ash/crostini/crostini_port_forwarder.cc b/chrome/browser/ash/crostini/crostini_port_forwarder.cc
index 06170ad..8abcf9d3 100644
--- a/chrome/browser/ash/crostini/crostini_port_forwarder.cc
+++ b/chrome/browser/ash/crostini/crostini_port_forwarder.cc
@@ -117,7 +117,7 @@
   PrefService* pref_service = profile_->GetPrefs();
   ListPrefUpdate update(pref_service, crostini::prefs::kCrostiniPortForwarding);
   base::Value* all_ports = update.Get();
-  base::Value::ListView list_view = all_ports->GetList();
+  base::Value::ListView list_view = all_ports->GetListDeprecated();
   auto it = std::find_if(
       list_view.begin(), list_view.end(),
       [&key, this](const auto& dict) { return MatchPortRuleDict(dict, key); });
@@ -131,9 +131,10 @@
   const base::Value* all_ports =
       pref_service->GetList(crostini::prefs::kCrostiniPortForwarding);
   auto it = std::find_if(
-      all_ports->GetList().begin(), all_ports->GetList().end(),
+      all_ports->GetListDeprecated().begin(),
+      all_ports->GetListDeprecated().end(),
       [&key, this](const auto& dict) { return MatchPortRuleDict(dict, key); });
-  if (it == all_ports->GetList().end()) {
+  if (it == all_ports->GetListDeprecated().end()) {
     return absl::nullopt;
   }
   return absl::optional<base::Value>(it->Clone());
diff --git a/chrome/browser/ash/crostini/crostini_terminal.cc b/chrome/browser/ash/crostini/crostini_terminal.cc
index b8e35c9..a8276127 100644
--- a/chrome/browser/ash/crostini/crostini_terminal.cc
+++ b/chrome/browser/ash/crostini/crostini_terminal.cc
@@ -438,9 +438,9 @@
   if (crostini::CrostiniFeatures::Get()->IsMultiContainerAllowed(profile)) {
     const base::Value* container_list =
         profile->GetPrefs()->GetList(crostini::prefs::kCrostiniContainers);
-    if (container_list && container_list->GetList().size() > 1) {
+    if (container_list && container_list->GetListDeprecated().size() > 1) {
       // Shortcuts for each container.
-      for (const auto& dict : container_list->GetList()) {
+      for (const auto& dict : container_list->GetListDeprecated()) {
         crostini::ContainerId id(dict);
         if (!id.vm_name.empty() && !id.container_name.empty()) {
           std::string shortcut_id = ShortcutIdFromContainerId(id);
diff --git a/chrome/browser/ash/crostini/crostini_util.cc b/chrome/browser/ash/crostini/crostini_util.cc
index 84861b72..3644e00 100644
--- a/chrome/browser/ash/crostini/crostini_util.cc
+++ b/chrome/browser/ash/crostini/crostini_util.cc
@@ -465,9 +465,9 @@
   ListPrefUpdate updater(profile->GetPrefs(),
                          crostini::prefs::kCrostiniContainers);
   auto it = std::find_if(
-      updater->GetList().begin(), updater->GetList().end(),
+      updater->GetListDeprecated().begin(), updater->GetListDeprecated().end(),
       [&](const auto& dict) { return MatchContainerDict(dict, container_id); });
-  if (it != updater->GetList().end()) {
+  if (it != updater->GetListDeprecated().end()) {
     return;
   }
 
@@ -486,8 +486,8 @@
   auto* pref_service = profile->GetPrefs();
   ListPrefUpdate updater(pref_service, crostini::prefs::kCrostiniContainers);
   updater->EraseListIter(
-      std::find_if(updater->GetList().begin(), updater->GetList().end(),
-                   [&](const auto& dict) {
+      std::find_if(updater->GetListDeprecated().begin(),
+                   updater->GetListDeprecated().end(), [&](const auto& dict) {
                      return MatchContainerDict(dict, container_id);
                    }));
 
@@ -507,7 +507,7 @@
   if (!containers) {
     return nullptr;
   }
-  for (const auto& dict : containers->GetList()) {
+  for (const auto& dict : containers->GetListDeprecated()) {
     if (MatchContainerDict(dict, container_id))
       return dict.FindKey(key);
   }
@@ -521,9 +521,9 @@
   ListPrefUpdate updater(profile->GetPrefs(),
                          crostini::prefs::kCrostiniContainers);
   auto it = std::find_if(
-      updater->GetList().begin(), updater->GetList().end(),
+      updater->GetListDeprecated().begin(), updater->GetListDeprecated().end(),
       [&](const auto& dict) { return MatchContainerDict(dict, container_id); });
-  if (it != updater->GetList().end()) {
+  if (it != updater->GetListDeprecated().end()) {
     it->SetKey(key, std::move(value));
   }
 }
diff --git a/chrome/browser/ash/customization/customization_document.cc b/chrome/browser/ash/customization/customization_document.cc
index c18cc82..5d00ef0 100644
--- a/chrome/browser/ash/customization/customization_document.cc
+++ b/chrome/browser/ash/customization/customization_document.cc
@@ -360,7 +360,7 @@
             chromeos::system::kHardwareClassKey, &hwid)) {
       base::ListValue* hwid_list = NULL;
       if (root_->GetList(kHwidMapAttr, &hwid_list)) {
-        for (const base::Value& hwid_value : hwid_list->GetList()) {
+        for (const base::Value& hwid_value : hwid_list->GetListDeprecated()) {
           const base::DictionaryValue* hwid_dictionary = nullptr;
           if (hwid_value.is_dict())
             hwid_dictionary = &base::Value::AsDictionaryValue(hwid_value);
@@ -748,10 +748,10 @@
   std::unique_ptr<base::DictionaryValue> prefs(new base::DictionaryValue);
   const base::ListValue* apps_list = NULL;
   if (root.GetList(kDefaultAppsAttr, &apps_list)) {
-    for (size_t i = 0; i < apps_list->GetList().size(); ++i) {
+    for (size_t i = 0; i < apps_list->GetListDeprecated().size(); ++i) {
       std::string app_id;
       std::unique_ptr<base::DictionaryValue> entry;
-      const base::Value& app_entry_value = apps_list->GetList()[i];
+      const base::Value& app_entry_value = apps_list->GetListDeprecated()[i];
       if (app_entry_value.is_string()) {
         app_id = app_entry_value.GetString();
         entry = std::make_unique<base::DictionaryValue>();
diff --git a/chrome/browser/ash/customization/customization_document_browsertest.cc b/chrome/browser/ash/customization/customization_document_browsertest.cc
index 368daadb..552cd0f 100644
--- a/chrome/browser/ash/customization/customization_document_browsertest.cc
+++ b/chrome/browser/ash/customization/customization_document_browsertest.cc
@@ -236,10 +236,10 @@
 
   std::unique_ptr<base::ListValue> ui_language_list =
       GetUILanguageList(NULL, "", input_method::InputMethodManager::Get());
-  EXPECT_GE(ui_language_list->GetList().size(), locales.size())
+  EXPECT_GE(ui_language_list->GetListDeprecated().size(), locales.size())
       << "Test failed for initial_locale='" << GetParam() << "'";
 
-  for (size_t i = 0; i < ui_language_list->GetList().size(); ++i) {
+  for (size_t i = 0; i < ui_language_list->GetListDeprecated().size(); ++i) {
     base::DictionaryValue* language_info = NULL;
     ASSERT_TRUE(ui_language_list->GetDictionary(i, &language_info))
         << "Test failed for initial_locale='" << GetParam() << "', i=" << i;
diff --git a/chrome/browser/ash/dbus/encrypted_reporting_service_provider_unittest.cc b/chrome/browser/ash/dbus/encrypted_reporting_service_provider_unittest.cc
index 49974556..e2be827 100644
--- a/chrome/browser/ash/dbus/encrypted_reporting_service_provider_unittest.cc
+++ b/chrome/browser/ash/dbus/encrypted_reporting_service_provider_unittest.cc
@@ -67,11 +67,11 @@
   const base::Value* const encrypted_record_list =
       request.value().FindListKey("encryptedRecord");
   EXPECT_NE(encrypted_record_list, nullptr);
-  EXPECT_FALSE(encrypted_record_list->GetList().empty());
+  EXPECT_FALSE(encrypted_record_list->GetListDeprecated().empty());
 
   // Retrieve and process sequence information
   const base::Value* seq_info =
-      encrypted_record_list->GetList().rbegin()->FindDictKey(
+      encrypted_record_list->GetListDeprecated().rbegin()->FindDictKey(
           "sequenceInformation");
   EXPECT_TRUE(seq_info != nullptr);
   response.SetPath("lastSucceedUploadedRecord", seq_info->Clone());
diff --git a/chrome/browser/ash/dbus/org.chromium.FuseBoxService.conf b/chrome/browser/ash/dbus/org.chromium.FuseBoxService.conf
new file mode 100644
index 0000000..2cee27e
--- /dev/null
+++ b/chrome/browser/ash/dbus/org.chromium.FuseBoxService.conf
@@ -0,0 +1,25 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<!--
+  Copyright 2022 The Chromium Authors. All rights reserved.
+  Use of this source code is governed by a BSD-style license that can be
+  found in the LICENSE file.
+-->
+<busconfig>
+  <!-- User chronos owns FuseBoxService. -->
+  <policy user="chronos">
+    <allow own="org.chromium.FuseBoxService"/>
+  </policy>
+
+  <!-- FUSE user fuse-fusebox can call FuseBoxService. -->
+  <policy user="fuse-fusebox">
+    <allow send_destination="org.chromium.FuseBoxService"
+           send_interface="org.chromium.FuseBoxService"/>
+  </policy>
+
+  <!-- User root can call FuseBoxService for testing. -->
+  <policy user="root">
+    <allow send_destination="org.chromium.FuseBoxService"
+           send_interface="org.chromium.FuseBoxService"/>
+  </policy>
+</busconfig>
diff --git a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc
index 7fdd910..f679d78b 100644
--- a/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc
+++ b/chrome/browser/ash/enhanced_network_tts/enhanced_network_tts_utils.cc
@@ -225,7 +225,8 @@
     return GetResultOnError(mojom::TtsRequestError::kReceivedUnexpectedData);
   }
 
-  base::Value::ConstListView timing_info_list = timing_info_ptr->GetList();
+  base::Value::ConstListView timing_info_list =
+      timing_info_ptr->GetListDeprecated();
   for (size_t i = 0; i < timing_info_list.size(); ++i) {
     const base::Value& timing_info = timing_info_list[i];
     const std::string* timing_info_text_ptr = timing_info.FindStringKey("text");
diff --git a/chrome/browser/ash/external_protocol_dialog.cc b/chrome/browser/ash/external_protocol_dialog.cc
index 2f7ea6c..2e60de4 100644
--- a/chrome/browser/ash/external_protocol_dialog.cc
+++ b/chrome/browser/ash/external_protocol_dialog.cc
@@ -5,9 +5,9 @@
 #include "chrome/browser/ash/external_protocol_dialog.h"
 
 #include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h"
 #include "chrome/browser/ash/arc/intent_helper/arc_intent_helper_mojo_ash.h"
 #include "chrome/browser/ash/guest_os/guest_os_external_protocol_handler.h"
+#include "chrome/browser/chromeos/arc/arc_external_protocol_dialog.h"
 #include "chrome/browser/external_protocol/external_protocol_handler.h"
 #include "chrome/browser/tab_contents/tab_util.h"
 #include "chrome/browser/ui/browser_dialogs.h"
diff --git a/chrome/browser/ash/file_system_provider/operations/abort_unittest.cc b/chrome/browser/ash/file_system_provider/operations/abort_unittest.cc
index ea6a1bb..d64ca66 100644
--- a/chrome/browser/ash/file_system_provider/operations/abort_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/abort_unittest.cc
@@ -67,9 +67,9 @@
   EXPECT_EQ(extensions::api::file_system_provider::OnAbortRequested::kEventName,
             event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   AbortRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/add_watcher_unittest.cc b/chrome/browser/ash/file_system_provider/operations/add_watcher_unittest.cc
index d4b7e03..bf645e819 100644
--- a/chrome/browser/ash/file_system_provider/operations/add_watcher_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/add_watcher_unittest.cc
@@ -70,9 +70,9 @@
       extensions::api::file_system_provider::OnAddWatcherRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   AddWatcherRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/close_file_unittest.cc b/chrome/browser/ash/file_system_provider/operations/close_file_unittest.cc
index 0e67f91..349b4fe 100644
--- a/chrome/browser/ash/file_system_provider/operations/close_file_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/close_file_unittest.cc
@@ -68,9 +68,9 @@
       extensions::api::file_system_provider::OnCloseFileRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   CloseFileRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/configure_unittest.cc b/chrome/browser/ash/file_system_provider/operations/configure_unittest.cc
index 85a1dd9..4b62ab0 100644
--- a/chrome/browser/ash/file_system_provider/operations/configure_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/configure_unittest.cc
@@ -66,9 +66,9 @@
       extensions::api::file_system_provider::OnConfigureRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   ConfigureRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/copy_entry_unittest.cc b/chrome/browser/ash/file_system_provider/operations/copy_entry_unittest.cc
index 304a5aa..819a2b5 100644
--- a/chrome/browser/ash/file_system_provider/operations/copy_entry_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/copy_entry_unittest.cc
@@ -73,9 +73,9 @@
       extensions::api::file_system_provider::OnCopyEntryRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   CopyEntryRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/create_directory_unittest.cc b/chrome/browser/ash/file_system_provider/operations/create_directory_unittest.cc
index 645e755..c008bc3 100644
--- a/chrome/browser/ash/file_system_provider/operations/create_directory_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/create_directory_unittest.cc
@@ -74,9 +74,9 @@
                 kEventName,
             event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   CreateDirectoryRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/create_file_unittest.cc b/chrome/browser/ash/file_system_provider/operations/create_file_unittest.cc
index c4a9bbc..a34e699 100644
--- a/chrome/browser/ash/file_system_provider/operations/create_file_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/create_file_unittest.cc
@@ -71,9 +71,9 @@
       extensions::api::file_system_provider::OnCreateFileRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   CreateFileRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/delete_entry_unittest.cc b/chrome/browser/ash/file_system_provider/operations/delete_entry_unittest.cc
index 5315393..b413612 100644
--- a/chrome/browser/ash/file_system_provider/operations/delete_entry_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/delete_entry_unittest.cc
@@ -71,9 +71,9 @@
       extensions::api::file_system_provider::OnDeleteEntryRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   DeleteEntryRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/execute_action_unittest.cc b/chrome/browser/ash/file_system_provider/operations/execute_action_unittest.cc
index 4ff9ec5..8911d50 100644
--- a/chrome/browser/ash/file_system_provider/operations/execute_action_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/execute_action_unittest.cc
@@ -77,9 +77,9 @@
                 kEventName,
             event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   ExecuteActionRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/get_actions_unittest.cc b/chrome/browser/ash/file_system_provider/operations/get_actions_unittest.cc
index 1f73601..005f6fc 100644
--- a/chrome/browser/ash/file_system_provider/operations/get_actions_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/get_actions_unittest.cc
@@ -85,7 +85,8 @@
   ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
 
   ASSERT_TRUE(parsed_json.value->is_list());
-  std::unique_ptr<Params> params(Params::Create(parsed_json.value->GetList()));
+  std::unique_ptr<Params> params(
+      Params::Create(parsed_json.value->GetListDeprecated()));
   ASSERT_TRUE(params.get());
   *result = RequestValue::CreateForGetActionsSuccess(std::move(params));
   ASSERT_TRUE(result->get());
@@ -133,9 +134,9 @@
       extensions::api::file_system_provider::OnGetActionsRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   GetActionsRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/get_metadata_unittest.cc b/chrome/browser/ash/file_system_provider/operations/get_metadata_unittest.cc
index 8c091f3..bba765c1 100644
--- a/chrome/browser/ash/file_system_provider/operations/get_metadata_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/get_metadata_unittest.cc
@@ -49,7 +49,8 @@
   ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
 
   ASSERT_TRUE(parsed_json.value->is_list());
-  std::unique_ptr<Params> params(Params::Create(parsed_json.value->GetList()));
+  std::unique_ptr<Params> params(
+      Params::Create(parsed_json.value->GetListDeprecated()));
   ASSERT_TRUE(params.get());
   *result = RequestValue::CreateForGetMetadataSuccess(std::move(params));
   ASSERT_TRUE(result->get());
@@ -244,9 +245,9 @@
       extensions::api::file_system_provider::OnGetMetadataRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   GetMetadataRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/move_entry_unittest.cc b/chrome/browser/ash/file_system_provider/operations/move_entry_unittest.cc
index 7eff3a60..98ac602e 100644
--- a/chrome/browser/ash/file_system_provider/operations/move_entry_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/move_entry_unittest.cc
@@ -73,9 +73,9 @@
       extensions::api::file_system_provider::OnMoveEntryRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   MoveEntryRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/open_file_unittest.cc b/chrome/browser/ash/file_system_provider/operations/open_file_unittest.cc
index bd323dd..9395bb4 100644
--- a/chrome/browser/ash/file_system_provider/operations/open_file_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/open_file_unittest.cc
@@ -109,9 +109,9 @@
       extensions::api::file_system_provider::OnOpenFileRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   OpenFileRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/read_directory_unittest.cc b/chrome/browser/ash/file_system_provider/operations/read_directory_unittest.cc
index ffb0a4e..b833bb2 100644
--- a/chrome/browser/ash/file_system_provider/operations/read_directory_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/read_directory_unittest.cc
@@ -96,7 +96,8 @@
   ASSERT_TRUE(parsed_json.value) << parsed_json.error_message;
 
   ASSERT_TRUE(parsed_json.value->is_list());
-  std::unique_ptr<Params> params(Params::Create(parsed_json.value->GetList()));
+  std::unique_ptr<Params> params(
+      Params::Create(parsed_json.value->GetListDeprecated()));
   ASSERT_TRUE(params.get());
   *result = RequestValue::CreateForReadDirectorySuccess(std::move(params));
   ASSERT_TRUE(result->get());
@@ -141,9 +142,9 @@
                 kEventName,
             event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   ReadDirectoryRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/read_file_unittest.cc b/chrome/browser/ash/file_system_provider/operations/read_file_unittest.cc
index 9813475..1f0c3a1a 100644
--- a/chrome/browser/ash/file_system_provider/operations/read_file_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/read_file_unittest.cc
@@ -118,9 +118,9 @@
       extensions::api::file_system_provider::OnReadFileRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   ReadFileRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/remove_watcher_unittest.cc b/chrome/browser/ash/file_system_provider/operations/remove_watcher_unittest.cc
index 68ecf23..2a4c646 100644
--- a/chrome/browser/ash/file_system_provider/operations/remove_watcher_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/remove_watcher_unittest.cc
@@ -70,9 +70,9 @@
                 kEventName,
             event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   RemoveWatcherRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/truncate_unittest.cc b/chrome/browser/ash/file_system_provider/operations/truncate_unittest.cc
index 3c2ae4f..47239248 100644
--- a/chrome/browser/ash/file_system_provider/operations/truncate_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/truncate_unittest.cc
@@ -74,9 +74,9 @@
       extensions::api::file_system_provider::OnTruncateRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   TruncateRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/unmount_unittest.cc b/chrome/browser/ash/file_system_provider/operations/unmount_unittest.cc
index 979bb5d..d0d3ace 100644
--- a/chrome/browser/ash/file_system_provider/operations/unmount_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/unmount_unittest.cc
@@ -66,9 +66,9 @@
       extensions::api::file_system_provider::OnUnmountRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   UnmountRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/operations/write_file_unittest.cc b/chrome/browser/ash/file_system_provider/operations/write_file_unittest.cc
index ee2b7fe..8d127da 100644
--- a/chrome/browser/ash/file_system_provider/operations/write_file_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/operations/write_file_unittest.cc
@@ -76,9 +76,9 @@
       extensions::api::file_system_provider::OnWriteFileRequested::kEventName,
       event->event_name);
   base::ListValue* event_args = event->event_args.get();
-  ASSERT_EQ(1u, event_args->GetList().size());
+  ASSERT_EQ(1u, event_args->GetListDeprecated().size());
 
-  const base::Value* options_as_value = &event_args->GetList()[0];
+  const base::Value* options_as_value = &event_args->GetListDeprecated()[0];
   ASSERT_TRUE(options_as_value->is_dict());
 
   WriteFileRequestedOptions options;
diff --git a/chrome/browser/ash/file_system_provider/provided_file_system_unittest.cc b/chrome/browser/ash/file_system_provider/provided_file_system_unittest.cc
index 3fb322f1..85d0a37 100644
--- a/chrome/browser/ash/file_system_provider/provided_file_system_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/provided_file_system_unittest.cc
@@ -71,7 +71,7 @@
       const extensions::ExtensionId& extension_id,
       std::unique_ptr<extensions::Event> event) override {
     ASSERT_TRUE(file_system_);
-    const base::Value* dict = &event->event_args->GetList()[0];
+    const base::Value* dict = &event->event_args->GetListDeprecated()[0];
     ASSERT_TRUE(dict->is_dict());
     const std::string* file_system_id = dict->FindStringKey("fileSystemId");
     EXPECT_NE(file_system_id, nullptr);
diff --git a/chrome/browser/ash/file_system_provider/registry.cc b/chrome/browser/ash/file_system_provider/registry.cc
index e87ddf6..069525c4 100644
--- a/chrome/browser/ash/file_system_provider/registry.cc
+++ b/chrome/browser/ash/file_system_provider/registry.cc
@@ -207,7 +207,8 @@
         if (!entry_path || !recursive || !last_tag || !persistent_origins ||
             it.first != *entry_path || entry_path->empty() ||
             (!options.supports_notify_tag &&
-             (!last_tag->empty() || persistent_origins->GetList().size()))) {
+             (!last_tag->empty() ||
+              persistent_origins->GetListDeprecated().size()))) {
           LOG(ERROR) << "Malformed watcher information in preferences.";
           continue;
         }
@@ -217,7 +218,8 @@
             base::FilePath::FromUTF8Unsafe(*entry_path);
         restored_watcher.recursive = recursive.value();
         restored_watcher.last_tag = *last_tag;
-        for (const auto& persistent_origin : persistent_origins->GetList()) {
+        for (const auto& persistent_origin :
+             persistent_origins->GetListDeprecated()) {
           if (!persistent_origin.is_string()) {
             LOG(ERROR) << "Malformed subscriber information in preferences.";
             continue;
diff --git a/chrome/browser/ash/file_system_provider/registry_unittest.cc b/chrome/browser/ash/file_system_provider/registry_unittest.cc
index 359bf61..4ffca39 100644
--- a/chrome/browser/ash/file_system_provider/registry_unittest.cc
+++ b/chrome/browser/ash/file_system_provider/registry_unittest.cc
@@ -235,10 +235,10 @@
       watcher->FindListKey(kPrefKeyWatcherPersistentOrigins);
   ASSERT_TRUE(persistent_origins);
   ASSERT_GT(fake_watcher_.subscribers.size(),
-            persistent_origins->GetList().size());
-  ASSERT_EQ(1u, persistent_origins->GetList().size());
+            persistent_origins->GetListDeprecated().size());
+  ASSERT_EQ(1u, persistent_origins->GetListDeprecated().size());
   const std::string* persistent_origin =
-      persistent_origins->GetList()[0].GetIfString();
+      persistent_origins->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(persistent_origin);
   const auto& fake_subscriber_it =
       fake_watcher_.subscribers.find(GURL(*persistent_origin));
diff --git a/chrome/browser/ash/guest_os/guest_os_registry_service.cc b/chrome/browser/ash/guest_os/guest_os_registry_service.cc
index 8acbc74a..074d1b3 100644
--- a/chrome/browser/ash/guest_os/guest_os_registry_service.cc
+++ b/chrome/browser/ash/guest_os/guest_os_registry_service.cc
@@ -91,7 +91,7 @@
   if (!list) {
     return result;
   }
-  for (const base::Value& value : list->GetList()) {
+  for (const base::Value& value : list->GetListDeprecated()) {
     result.insert(to_lower_ascii ? base::ToLowerASCII(value.GetString())
                                  : value.GetString());
   }
diff --git a/chrome/browser/ash/guest_os/guest_os_share_path.cc b/chrome/browser/ash/guest_os/guest_os_share_path.cc
index c2ed7500..6ab8fcd 100644
--- a/chrome/browser/ash/guest_os/guest_os_share_path.cc
+++ b/chrome/browser/ash/guest_os/guest_os_share_path.cc
@@ -141,15 +141,15 @@
                  << " for VM " << vm_name;
     return;
   }
-  auto it = std::find(found->GetList().begin(), found->GetList().end(),
-                      base::Value(vm_name));
+  auto it = std::find(found->GetListDeprecated().begin(),
+                      found->GetListDeprecated().end(), base::Value(vm_name));
   if (!found->EraseListIter(it)) {
     LOG(WARNING) << "VM not in prefs to unshare path " << path.value()
                  << " for VM " << vm_name;
     return;
   }
   // If VM list is now empty, remove |path| from |shared_paths|.
-  if (found->GetList().empty()) {
+  if (found->GetListDeprecated().empty()) {
     shared_paths->RemoveKey(path.value());
   }
 }
diff --git a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
index 191fce4..9be0e864 100644
--- a/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
+++ b/chrome/browser/ash/guest_os/guest_os_share_path_unittest.cc
@@ -90,14 +90,20 @@
     const base::Value* prefs =
         profile()->GetPrefs()->GetDictionary(prefs::kGuestOSPathsSharedToVms);
     EXPECT_NE(prefs->FindKey(shared_path_.value()), nullptr);
-    EXPECT_EQ(prefs->FindKey(shared_path_.value())->GetList().size(), 1U);
-    EXPECT_EQ(prefs->FindKey(shared_path_.value())->GetList()[0].GetString(),
+    EXPECT_EQ(prefs->FindKey(shared_path_.value())->GetListDeprecated().size(),
+              1U);
+    EXPECT_EQ(prefs->FindKey(shared_path_.value())
+                  ->GetListDeprecated()[0]
+                  .GetString(),
               crostini::kCrostiniDefaultVmName);
     if (expected_persist == Persist::YES) {
       EXPECT_EQ(prefs->DictSize(), 2U);
       EXPECT_NE(prefs->FindKey(share_path_.value()), nullptr);
-      EXPECT_EQ(prefs->FindKey(share_path_.value())->GetList().size(), 1U);
-      EXPECT_EQ(prefs->FindKey(share_path_.value())->GetList()[0].GetString(),
+      EXPECT_EQ(prefs->FindKey(share_path_.value())->GetListDeprecated().size(),
+                1U);
+      EXPECT_EQ(prefs->FindKey(share_path_.value())
+                    ->GetListDeprecated()[0]
+                    .GetString(),
                 expected_vm_name);
     } else {
       EXPECT_EQ(prefs->DictSize(), 1U);
@@ -721,21 +727,21 @@
   const base::Value* prefs =
       profile()->GetPrefs()->GetDictionary(prefs::kGuestOSPathsSharedToVms);
   EXPECT_EQ(prefs->DictSize(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList()[0].GetString(), "v1");
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated()[0].GetString(), "v1");
 
   // Adding the same path again for same VM should not cause any changes.
   guest_os_share_path_->RegisterPersistedPath("v1", base::FilePath("/a/a/a"));
   prefs = profile()->GetPrefs()->GetDictionary(prefs::kGuestOSPathsSharedToVms);
   EXPECT_EQ(prefs->DictSize(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated().size(), 1U);
 
   // Adding the same path for a new VM adds to the vm list.
   guest_os_share_path_->RegisterPersistedPath("v2", base::FilePath("/a/a/a"));
   EXPECT_EQ(prefs->DictSize(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList().size(), 2U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList()[0].GetString(), "v1");
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList()[1].GetString(), "v2");
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated().size(), 2U);
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated()[0].GetString(), "v1");
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated()[1].GetString(), "v2");
 
   // Add more paths.
   guest_os_share_path_->RegisterPersistedPath("v1", base::FilePath("/a/a/b"));
@@ -743,45 +749,45 @@
   guest_os_share_path_->RegisterPersistedPath("v1", base::FilePath("/a/b/a"));
   guest_os_share_path_->RegisterPersistedPath("v1", base::FilePath("/b/a/a"));
   EXPECT_EQ(prefs->DictSize(), 5U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList().size(), 2U);
-  EXPECT_EQ(prefs->FindKey("/a/a/b")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/c")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/b/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/b/a/a")->GetList().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated().size(), 2U);
+  EXPECT_EQ(prefs->FindKey("/a/a/b")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a/c")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/b/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/b/a/a")->GetListDeprecated().size(), 1U);
 
   // Adding /a/a should remove /a/a/a, /a/a/b, /a/a/c.
   guest_os_share_path_->RegisterPersistedPath("v1", base::FilePath("/a/a"));
   EXPECT_EQ(prefs->DictSize(), 4U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList()[0].GetString(), "v2");
-  EXPECT_EQ(prefs->FindKey("/a/b/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/b/a/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a")->GetList()[0].GetString(), "v1");
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated()[0].GetString(), "v2");
+  EXPECT_EQ(prefs->FindKey("/a/b/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/b/a/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a")->GetListDeprecated()[0].GetString(), "v1");
 
   // Adding /a should remove /a/a, /a/b/a.
   guest_os_share_path_->RegisterPersistedPath("v1", base::FilePath("/a"));
   EXPECT_EQ(prefs->DictSize(), 3U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList()[0].GetString(), "v2");
-  EXPECT_EQ(prefs->FindKey("/b/a/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a")->GetList()[0].GetString(), "v1");
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated()[0].GetString(), "v2");
+  EXPECT_EQ(prefs->FindKey("/b/a/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a")->GetListDeprecated()[0].GetString(), "v1");
 
   // Adding / should remove all others.
   guest_os_share_path_->RegisterPersistedPath("v1", base::FilePath("/"));
   EXPECT_EQ(prefs->DictSize(), 2U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetList()[0].GetString(), "v2");
-  EXPECT_EQ(prefs->FindKey("/")->GetList().size(), 1U);
-  EXPECT_EQ(prefs->FindKey("/")->GetList()[0].GetString(), "v1");
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/a/a/a")->GetListDeprecated()[0].GetString(), "v2");
+  EXPECT_EQ(prefs->FindKey("/")->GetListDeprecated().size(), 1U);
+  EXPECT_EQ(prefs->FindKey("/")->GetListDeprecated()[0].GetString(), "v1");
 
   // Add / for v2.
   guest_os_share_path_->RegisterPersistedPath("v2", base::FilePath("/"));
   EXPECT_EQ(prefs->DictSize(), 1U);
-  EXPECT_EQ(prefs->FindKey("/")->GetList().size(), 2U);
-  EXPECT_EQ(prefs->FindKey("/")->GetList()[0].GetString(), "v1");
-  EXPECT_EQ(prefs->FindKey("/")->GetList()[1].GetString(), "v2");
+  EXPECT_EQ(prefs->FindKey("/")->GetListDeprecated().size(), 2U);
+  EXPECT_EQ(prefs->FindKey("/")->GetListDeprecated()[0].GetString(), "v1");
+  EXPECT_EQ(prefs->FindKey("/")->GetListDeprecated()[1].GetString(), "v2");
 }
 
 TEST_F(GuestOsSharePathTest, UnsharePathSuccess) {
diff --git a/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc b/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc
index 4d8cdf0..38416dc 100644
--- a/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc
+++ b/chrome/browser/ash/input_method/component_extension_ime_manager_delegate_impl.cc
@@ -278,7 +278,7 @@
     if (language_value->is_string()) {
       languages.insert(language_value->GetString());
     } else if (language_value->is_list()) {
-      for (const base::Value& elem : language_value->GetList()) {
+      for (const base::Value& elem : language_value->GetListDeprecated()) {
         if (elem.is_string())
           languages.insert(elem.GetString());
       }
@@ -296,7 +296,7 @@
   if (!dict.GetList(extensions::manifest_keys::kLayouts, &layouts))
     return false;
 
-  base::Value::ConstListView layouts_list = layouts->GetList();
+  base::Value::ConstListView layouts_list = layouts->GetListDeprecated();
   if (!layouts_list.empty() && layouts_list[0].is_string())
     out->layout = layouts_list[0].GetString();
   else
@@ -419,7 +419,7 @@
       continue;
     }
 
-    for (const base::Value& value : component_list->GetList()) {
+    for (const base::Value& value : component_list->GetListDeprecated()) {
       if (!value.is_dict())
         continue;
 
diff --git a/chrome/browser/ash/input_method/ime_rules_config.cc b/chrome/browser/ash/input_method/ime_rules_config.cc
index dd9b3b3..6923b64 100644
--- a/chrome/browser/ash/input_method/ime_rules_config.cc
+++ b/chrome/browser/ash/input_method/ime_rules_config.cc
@@ -75,7 +75,7 @@
     auto* ac_domains_items =
         ac_domain_denylist->FindListKey(kConfigRuleItemsKey);
     if (ac_domains_items != nullptr) {
-      for (const auto& domain : ac_domains_items->GetList()) {
+      for (const auto& domain : ac_domains_items->GetListDeprecated()) {
         if (domain.is_string()) {
           auto_correct_domain_denylist_.push_back(*domain.GetIfString());
         }
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
index 967c693..fa4a558 100644
--- a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
+++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
@@ -816,7 +816,7 @@
   }
 
   const base::Value* accounts = local_state_->GetList(prefs::kKerberosAccounts);
-  if (!accounts || accounts->GetList().empty()) {
+  if (!accounts || accounts->GetListDeprecated().empty()) {
     VLOG(1) << "No or empty KerberosAccounts policy";
     NotifyRequiresLoginPassword(false);
 
@@ -828,10 +828,11 @@
     return;
   }
 
-  VLOG(1) << accounts->GetList().size() << " accounts in KerberosAccounts";
+  VLOG(1) << accounts->GetListDeprecated().size()
+          << " accounts in KerberosAccounts";
   bool requires_login_password = false;
   std::vector<std::string> managed_accounts_added;
-  for (const auto& account : accounts->GetList()) {
+  for (const auto& account : accounts->GetListDeprecated()) {
     // Get the principal. Should always be set.
     const base::Value* principal_value = account.FindPath(kPrincipal);
     DCHECK(principal_value);
@@ -865,7 +866,7 @@
     const base::Value* krb5_conf_value = account.FindPath(kKrb5Conf);
     if (krb5_conf_value) {
       // Note: The config is encoded as a list of lines.
-      for (const auto& config_line : krb5_conf_value->GetList()) {
+      for (const auto& config_line : krb5_conf_value->GetListDeprecated()) {
         krb5_conf += config_line.GetString();
         krb5_conf += "\n";
       }
diff --git a/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc b/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc
index 0a3bfda..0844b3985 100644
--- a/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc
+++ b/chrome/browser/ash/lock_screen_apps/app_manager_impl_unittest.cc
@@ -97,7 +97,7 @@
       return;
     }
     ASSERT_TRUE(event.event_args);
-    const base::Value& arg_value = event.event_args->GetList()[0];
+    const base::Value& arg_value = event.event_args->GetListDeprecated()[0];
     if (event.restrict_to_browser_context)
       EXPECT_EQ(context_, event.restrict_to_browser_context);
 
diff --git a/chrome/browser/ash/login/debug_overlay_browsertest.cc b/chrome/browser/ash/login/debug_overlay_browsertest.cc
index ad2f4633..01712140 100644
--- a/chrome/browser/ash/login/debug_overlay_browsertest.cc
+++ b/chrome/browser/ash/login/debug_overlay_browsertest.cc
@@ -21,8 +21,10 @@
 constexpr char kDebugOverlay[] = "debuggerOverlay";
 constexpr char kScreensPanel[] = "DebuggerPanelScreens";
 
-constexpr int kOobeScreensCount = 42;
-constexpr int kLoginScreensCount = 37;
+// TODO(crbug.com/1261902): Decrease |kOobeScreensCount| and
+// |kLoginScreensCount| by 1.
+constexpr int kOobeScreensCount = 43;
+constexpr int kLoginScreensCount = 38;
 constexpr int kOsInstallScreensCount = 2;
 
 std::string ElementsInPanel(const std::string& panel) {
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc
index 80e0f18..82d21c1 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.cc
@@ -173,6 +173,8 @@
 }
 
 void EasyUnlockService::Initialize() {
+  proximity_auth::ScreenlockBridge::Get()->AddObserver(this);
+
   InitializeInternal();
 }
 
@@ -504,6 +506,8 @@
 
   ShutdownInternal();
 
+  proximity_auth::ScreenlockBridge::Get()->RemoveObserver(this);
+
   ResetSmartLockState();
   proximity_auth_system_.reset();
   power_monitor_.reset();
@@ -511,6 +515,11 @@
   weak_ptr_factory_.InvalidateWeakPtrs();
 }
 
+void EasyUnlockService::OnScreenDidLock(
+    proximity_auth::ScreenlockBridge::LockHandler::ScreenType screen_type) {
+  // TODO(b/216832183): Show initial Smart Lock state to prevent UI jank.
+}
+
 void EasyUnlockService::UpdateAppState() {
   if (IsAllowed()) {
     EnsureTpmKeyPresentIfNeeded();
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h
index 298b46db..22292ec 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service.h
@@ -50,7 +50,8 @@
 
 enum class SmartLockState;
 
-class EasyUnlockService : public KeyedService {
+class EasyUnlockService : public KeyedService,
+                          public proximity_auth::ScreenlockBridge::Observer {
  public:
   enum Type { TYPE_REGULAR, TYPE_SIGNIN };
 
@@ -196,9 +197,17 @@
   // definitively.
   virtual void OnUserEnteredPassword();
 
-  // KeyedService override:
+  // KeyedService:
   void Shutdown() override;
 
+  // proximity_auth::ScreenlockBridge::Observer:
+  void OnScreenDidLock(proximity_auth::ScreenlockBridge::LockHandler::ScreenType
+                           screen_type) override;
+  void OnScreenDidUnlock(
+      proximity_auth::ScreenlockBridge::LockHandler::ScreenType screen_type)
+      override = 0;
+  void OnFocusedUserChanged(const AccountId& account_id) override = 0;
+
   // Exposes the profile to which the service is attached to subclasses.
   Profile* profile() const { return profile_; }
 
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
index 77f7f212..98ada36 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
@@ -264,10 +264,10 @@
     device_list->Append(std::move(dict));
   }
 
-  if (device_list->GetList().size() != 2u) {
+  if (device_list->GetListDeprecated().size() != 2u) {
     PA_LOG(ERROR) << "There should only be 2 devices persisted, the host and "
                      "the client, but there are: "
-                  << device_list->GetList().size();
+                  << device_list->GetListDeprecated().size();
     NOTREACHED();
   }
 
@@ -362,8 +362,6 @@
   multidevice_setup_client_->AddObserver(this);
   StartFeatureUsageMetrics();
 
-  proximity_auth::ScreenlockBridge::Get()->AddObserver(this);
-
   LoadRemoteDevices();
 }
 
@@ -371,8 +369,6 @@
   pref_manager_.reset();
   notification_controller_.reset();
 
-  proximity_auth::ScreenlockBridge::Get()->RemoveObserver(this);
-
   registrar_.RemoveAll();
 
   device_sync_client_->RemoveObserver(this);
@@ -508,6 +504,8 @@
 
 void EasyUnlockServiceRegular::OnScreenDidLock(
     proximity_auth::ScreenlockBridge::LockHandler::ScreenType screen_type) {
+  EasyUnlockService::OnScreenDidLock(screen_type);
+
   set_will_authenticate_using_easy_unlock(false);
   lock_screen_last_shown_timestamp_ = base::TimeTicks::Now();
 }
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h
index b79f83b..9a421af 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.h
@@ -38,7 +38,6 @@
 // profiles.
 class EasyUnlockServiceRegular
     : public EasyUnlockService,
-      public proximity_auth::ScreenlockBridge::Observer,
       public device_sync::DeviceSyncClient::Observer,
       public multidevice_setup::MultiDeviceSetupClient::Observer {
  public:
@@ -112,7 +111,7 @@
       const std::set<std::string>& public_keys_before_sync,
       const std::set<std::string>& public_keys_after_sync);
 
-  // proximity_auth::ScreenlockBridge::Observer implementation:
+  // EasyUnlockService:
   void OnScreenDidLock(proximity_auth::ScreenlockBridge::LockHandler::ScreenType
                            screen_type) override;
   void OnScreenDidUnlock(
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular_unittest.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular_unittest.cc
index 6642930..7844f0d 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular_unittest.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular_unittest.cc
@@ -234,7 +234,7 @@
             ->GetRemoteDevices();
     if (are_local_and_remote_devices_expected)
       // 2 devices are expected: the local device and the remote device.
-      EXPECT_EQ(2u, remote_devices->GetList().size());
+      EXPECT_EQ(2u, remote_devices->GetListDeprecated().size());
     else
       EXPECT_FALSE(remote_devices);
   }
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc
index 48773a7..d0cebac 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc
@@ -11,6 +11,7 @@
 #include "ash/components/login/auth/user_context.h"
 #include "ash/components/proximity_auth/proximity_auth_local_state_pref_manager.h"
 #include "ash/components/proximity_auth/smart_lock_metrics_recorder.h"
+#include "ash/constants/ash_features.h"
 #include "ash/public/cpp/smartlock_state.h"
 #include "base/base64url.h"
 #include "base/bind.h"
@@ -134,7 +135,8 @@
     return beacon_seeds;
   }
 
-  for (const base::Value& beacon_seed_value : deserialized_value->GetList()) {
+  for (const base::Value& beacon_seed_value :
+       deserialized_value->GetListDeprecated()) {
     if (!beacon_seed_value.is_string()) {
       PA_LOG(ERROR) << "Expected Base64 BeaconSeed.";
       continue;
@@ -306,7 +308,6 @@
 
   proximity_auth::ScreenlockBridge* screenlock_bridge =
       proximity_auth::ScreenlockBridge::Get();
-  screenlock_bridge->AddObserver(this);
   if (screenlock_bridge->focused_account_id().is_valid())
     OnFocusedUserChanged(screenlock_bridge->focused_account_id());
 }
@@ -322,7 +323,6 @@
   StopFeatureUsageMetrics();
 
   weak_ptr_factory_.InvalidateWeakPtrs();
-  proximity_auth::ScreenlockBridge::Get()->RemoveObserver(this);
   user_data_.clear();
 }
 
@@ -357,8 +357,12 @@
       proximity_auth::ScreenlockBridge::LockHandler::SIGNIN_SCREEN)
     return;
 
-  // Update initial UI is when the account picker on login screen is ready.
-  ShowInitialUserPodState();
+  EasyUnlockService::OnScreenDidLock(screen_type);
+
+  if (!base::FeatureList::IsEnabled(ash::features::kSmartLockUIRevamp)) {
+    // Update initial UI is when the account picker on login screen is ready.
+    ShowInitialUserPodState();
+  }
   user_pod_last_focused_timestamp_ = base::TimeTicks::Now();
 }
 
@@ -410,7 +414,12 @@
   if (!IsAllowed() || !IsEnabled())
     return;
 
-  ShowInitialUserPodState();
+  // Update initial UI is when the account picker on login screen is ready.
+  if (base::FeatureList::IsEnabled(ash::features::kSmartLockUIRevamp)) {
+    // TODO(b/216832183): Show initial Smart Lock state to prevent UI jank.
+  } else {
+    ShowInitialUserPodState();
+  }
 
   // If there is a hardlock, then there is no point in loading the devices.
   SmartLockStateHandler::HardlockState hardlock_state;
@@ -622,6 +631,8 @@
 }
 
 void EasyUnlockServiceSignin::ShowInitialUserPodState() {
+  DCHECK(!base::FeatureList::IsEnabled(ash::features::kSmartLockUIRevamp));
+
   if (!IsAllowed() || !IsEnabled())
     return;
 
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.h b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.h
index 4bf89e2..0c8d0d5 100644
--- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.h
+++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.h
@@ -28,9 +28,7 @@
 class EasyUnlockChallengeWrapper;
 
 // EasyUnlockService instance that should be used for signin profile.
-class EasyUnlockServiceSignin
-    : public EasyUnlockService,
-      public proximity_auth::ScreenlockBridge::Observer {
+class EasyUnlockServiceSignin : public EasyUnlockService {
  public:
   EasyUnlockServiceSignin(
       Profile* profile,
@@ -103,7 +101,7 @@
   bool IsChromeOSLoginEnabled() const override;
   void OnSuspendDoneInternal() override;
 
-  // proximity_auth::ScreenlockBridge::Observer implementation:
+  // EasyUnlockService:
   void OnScreenDidLock(proximity_auth::ScreenlockBridge::LockHandler::ScreenType
                            screen_type) override;
   void OnScreenDidUnlock(
diff --git a/chrome/browser/ash/login/enterprise_enrollment_browsertest.cc b/chrome/browser/ash/login/enterprise_enrollment_browsertest.cc
index 85f0b65..0d84e9bd 100644
--- a/chrome/browser/ash/login/enterprise_enrollment_browsertest.cc
+++ b/chrome/browser/ash/login/enterprise_enrollment_browsertest.cc
@@ -290,8 +290,8 @@
     base::DictionaryValue custom_option;
     custom_option.SetKey("name", base::Value("Custom"));
     options->Append(std::move(custom_option));
-    for (size_t i = 0; i < options->GetList().size(); ++i) {
-      const base::Value& option = options->GetList()[i];
+    for (size_t i = 0; i < options->GetListDeprecated().size(); ++i) {
+      const base::Value& option = options->GetListDeprecated()[i];
       // Select configuration value.
       test::OobeJS().SelectElementInPath(base::NumberToString(i),
                                          kAdConfigurationSelect);
diff --git a/chrome/browser/ash/login/existing_user_controller.cc b/chrome/browser/ash/login/existing_user_controller.cc
index 51daed5..99bfcdc 100644
--- a/chrome/browser/ash/login/existing_user_controller.cc
+++ b/chrome/browser/ash/login/existing_user_controller.cc
@@ -1357,7 +1357,7 @@
             .Get(policy::key::kSessionLocales);
     if (entry && entry->level == policy::POLICY_LEVEL_RECOMMENDED &&
         entry->value() && entry->value()->is_list()) {
-      base::Value::ConstListView list = entry->value()->GetList();
+      base::Value::ConstListView list = entry->value()->GetListDeprecated();
       if (!list.empty() && list[0].is_string()) {
         locale = list[0].GetString();
         new_user_context.SetPublicSessionLocale(locale);
@@ -1560,8 +1560,8 @@
     std::unique_ptr<base::ListValue> keyboard_layouts) {
   UserContext new_user_context = user_context;
   std::string keyboard_layout;
-  for (size_t i = 0; i < keyboard_layouts->GetList().size(); ++i) {
-    base::Value& entry = keyboard_layouts->GetList()[i];
+  for (size_t i = 0; i < keyboard_layouts->GetListDeprecated().size(); ++i) {
+    base::Value& entry = keyboard_layouts->GetListDeprecated()[i];
     if (entry.FindBoolKey("selected").value_or(false)) {
       const std::string* keyboard_layout_ptr = entry.FindStringKey("value");
       if (keyboard_layout_ptr)
diff --git a/chrome/browser/ash/login/lock_screen_utils.cc b/chrome/browser/ash/login/lock_screen_utils.cc
index e96de31..d29fd64c 100644
--- a/chrome/browser/ash/login/lock_screen_utils.cc
+++ b/chrome/browser/ash/login/lock_screen_utils.cc
@@ -117,7 +117,7 @@
   const base::ListValue* login_screen_input_methods = nullptr;
   if (!cros_settings->GetList(kDeviceLoginScreenInputMethods,
                               &login_screen_input_methods) ||
-      login_screen_input_methods->GetList().empty()) {
+      login_screen_input_methods->GetListDeprecated().empty()) {
     StopEnforcingPolicyInputMethods();
     return;
   }
@@ -129,7 +129,8 @@
     allowed_input_method_ids.push_back(user_input_method_id);
   }
 
-  for (const auto& input_method_entry : login_screen_input_methods->GetList()) {
+  for (const auto& input_method_entry :
+       login_screen_input_methods->GetListDeprecated()) {
     if (input_method_entry.is_string())
       allowed_input_method_ids.push_back(input_method_entry.GetString());
   }
@@ -183,7 +184,7 @@
 std::vector<LocaleItem> FromListValueToLocaleItem(
     std::unique_ptr<base::ListValue> locales) {
   std::vector<LocaleItem> result;
-  for (const auto& locale : locales->GetList()) {
+  for (const auto& locale : locales->GetListDeprecated()) {
     const base::DictionaryValue* dictionary;
     if (!locale.GetAsDictionary(&dictionary))
       continue;
diff --git a/chrome/browser/ash/login/login_manager_test.cc b/chrome/browser/ash/login/login_manager_test.cc
index 13fe741..ac3c915 100644
--- a/chrome/browser/ash/login/login_manager_test.cc
+++ b/chrome/browser/ash/login/login_manager_test.cc
@@ -65,7 +65,7 @@
 void LoginManagerTest::RegisterUser(const AccountId& account_id) {
   ListPrefUpdate users_pref(g_browser_process->local_state(), "LoggedInUsers");
   base::Value email_value(account_id.GetUserEmail());
-  if (!base::Contains(users_pref->GetList(), email_value))
+  if (!base::Contains(users_pref->GetListDeprecated(), email_value))
     users_pref->Append(std::move(email_value));
   if (user_manager::UserManager::IsInitialized()) {
     user_manager::KnownUser(g_browser_process->local_state())
diff --git a/chrome/browser/ash/login/oobe_interactive_ui_test.cc b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
index a3ebb91..5a083e4f 100644
--- a/chrome/browser/ash/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/ash/login/oobe_interactive_ui_test.cc
@@ -248,17 +248,18 @@
 // HandleArcTermsOfServiceScreen.
 void HandleRecommendAppsScreen() {
   OobeScreenWaiter(RecommendAppsScreenView::kScreenId).Wait();
-  LOG(INFO) << "OobeInteractiveUITest: Switched to 'recommend-apps' screen.";
+  LOG(INFO)
+      << "OobeInteractiveUITest: Switched to 'recommend-apps-old' screen.";
 
   EXPECT_FALSE(LoginScreenTestApi::IsShutdownButtonShown());
   EXPECT_FALSE(LoginScreenTestApi::IsGuestButtonShown());
   EXPECT_FALSE(LoginScreenTestApi::IsAddUserButtonShown());
 
   test::OobeJS()
-      .CreateVisibilityWaiter(true, {"recommend-apps", "appsDialog"})
+      .CreateVisibilityWaiter(true, {"recommend-apps-old", "appsDialog"})
       ->Wait();
 
-  test::OobeJS().ExpectPathDisplayed(true, {"recommend-apps", "appView"});
+  test::OobeJS().ExpectPathDisplayed(true, {"recommend-apps-old", "appView"});
 
   std::string toggle_apps_script = base::StringPrintf(
       "(function() {"
@@ -276,7 +277,7 @@
       "test.package");
 
   const std::string webview_path =
-      test::GetOobeElementPath({"recommend-apps", "appView"});
+      test::GetOobeElementPath({"recommend-apps-old", "appView"});
   const std::string script = base::StringPrintf(
       "(function() {"
       "  var toggleApp = function() {"
@@ -298,12 +299,12 @@
   EXPECT_TRUE(result);
 
   const std::initializer_list<base::StringPiece> install_button = {
-      "recommend-apps", "installButton"};
+      "recommend-apps-old", "installButton"};
   test::OobeJS().CreateEnabledWaiter(true, install_button)->Wait();
   test::OobeJS().TapOnPath(install_button);
 
   OobeScreenExitWaiter(RecommendAppsScreenView::kScreenId).Wait();
-  LOG(INFO) << "OobeInteractiveUITest: 'recommend-apps' screen done.";
+  LOG(INFO) << "OobeInteractiveUITest: 'recommend-apps-old' screen done.";
 }
 
 // Waits for AppDownloadingScreen to be shown, clicks 'Continue' button, and
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc
index 26c1695d..af75102 100644
--- a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc
+++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc
@@ -44,10 +44,10 @@
       pref_service->GetList(prefs::kQuickUnlockModeAllowlist);
   // TODO(crbug.com/1187106): Use base::Contains once |quick_unlock_allowlist|
   // is not a ListValue.
-  return std::find(quick_unlock_allowlist->GetList().begin(),
-                   quick_unlock_allowlist->GetList().end(),
+  return std::find(quick_unlock_allowlist->GetListDeprecated().begin(),
+                   quick_unlock_allowlist->GetListDeprecated().end(),
                    base::Value(value)) !=
-         quick_unlock_allowlist->GetList().end();
+         quick_unlock_allowlist->GetListDeprecated().end();
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc b/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc
index 26d075ea..183fac71 100644
--- a/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc
+++ b/chrome/browser/ash/login/saml/password_sync_token_fetcher.cc
@@ -343,7 +343,8 @@
         consumer_->OnApiCallFailed(ErrorType::kGetNoList);
         return;
       }
-      base::Value::ConstListView list_of_tokens = token_list_entry->GetList();
+      base::Value::ConstListView list_of_tokens =
+          token_list_entry->GetListDeprecated();
       if (list_of_tokens.size() > 0) {
         const auto* sync_token_value =
             list_of_tokens[0].FindKeyOfType(kToken, base::Value::Type::STRING);
diff --git a/chrome/browser/ash/login/screens/chrome_user_selection_screen.cc b/chrome/browser/ash/login/screens/chrome_user_selection_screen.cc
index e9a18349..ee7504f 100644
--- a/chrome/browser/ash/login/screens/chrome_user_selection_screen.cc
+++ b/chrome/browser/ash/login/screens/chrome_user_selection_screen.cc
@@ -123,7 +123,7 @@
   std::vector<std::string> new_recommended_locales;
   if (entry && entry->level == policy::POLICY_LEVEL_RECOMMENDED &&
       entry->value() && entry->value()->is_list()) {
-    for (const auto& entry : entry->value()->GetList()) {
+    for (const auto& entry : entry->value()->GetListDeprecated()) {
       if (!entry.is_string()) {
         NOTREACHED();
         new_recommended_locales.clear();
diff --git a/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc b/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc
index 3560994..f1be56f 100644
--- a/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/recommend_apps_screen_browsertest.cc
@@ -41,9 +41,9 @@
 namespace ash {
 namespace {
 
-const test::UIPath webview_ui_path = {"recommend-apps", "appView"};
-const test::UIPath install_button = {"recommend-apps", "installButton"};
-const test::UIPath skip_button = {"recommend-apps", "skipButton"};
+const test::UIPath webview_ui_path = {"recommend-apps-old", "appView"};
+const test::UIPath install_button = {"recommend-apps-old", "installButton"};
+const test::UIPath skip_button = {"recommend-apps-old", "skipButton"};
 
 struct FakeAppInfo {
  public:
@@ -150,17 +150,17 @@
   void ExpectLoadingStep() {
     // Wait for loading screen.
     test::OobeJS()
-        .CreateVisibilityWaiter(true, {"recommend-apps", "loadingDialog"})
+        .CreateVisibilityWaiter(true, {"recommend-apps-old", "loadingDialog"})
         ->Wait();
 
-    test::OobeJS().ExpectHiddenPath({"recommend-apps", "appsDialog"});
+    test::OobeJS().ExpectHiddenPath({"recommend-apps-old", "appsDialog"});
   }
 
   void ExpectAppSelectionStep() {
     test::OobeJS()
-        .CreateVisibilityWaiter(true, {"recommend-apps", "appsDialog"})
+        .CreateVisibilityWaiter(true, {"recommend-apps-old", "appsDialog"})
         ->Wait();
-    test::OobeJS().ExpectHiddenPath({"recommend-apps", "loadingDialog"});
+    test::OobeJS().ExpectHiddenPath({"recommend-apps-old", "loadingDialog"});
   }
 
   bool WaitForAppListSize(const std::string& webview_path, int app_count) {
diff --git a/chrome/browser/ash/login/session/user_session_manager.cc b/chrome/browser/ash/login/session/user_session_manager.cc
index cd98d96..38ec2b2 100644
--- a/chrome/browser/ash/login/session/user_session_manager.cc
+++ b/chrome/browser/ash/login/session/user_session_manager.cc
@@ -866,7 +866,7 @@
 
   const std::string* account_locale = NULL;
   if (pref_locale.empty() && user->has_gaia_account() &&
-      prefs->GetList(::prefs::kAllowedLanguages)->GetList().empty()) {
+      prefs->GetList(::prefs::kAllowedLanguages)->GetListDeprecated().empty()) {
     if (user->GetAccountLocale() == NULL)
       return false;  // wait until Account profile is loaded.
     account_locale = user->GetAccountLocale();
diff --git a/chrome/browser/ash/login/test/login_manager_mixin.cc b/chrome/browser/ash/login/test/login_manager_mixin.cc
index 5cb910d..cacf7db 100644
--- a/chrome/browser/ash/login/test/login_manager_mixin.cc
+++ b/chrome/browser/ash/login/test/login_manager_mixin.cc
@@ -130,7 +130,7 @@
     ListPrefUpdate users_pref(g_browser_process->local_state(),
                               "LoggedInUsers");
     base::Value email_value(user.account_id.GetUserEmail());
-    if (!base::Contains(users_pref->GetList(), email_value))
+    if (!base::Contains(users_pref->GetListDeprecated(), email_value))
       users_pref->Append(std::move(email_value));
 
     DictionaryPrefUpdate user_type_update(g_browser_process->local_state(),
diff --git a/chrome/browser/ash/login/test/session_flags_manager.cc b/chrome/browser/ash/login/test/session_flags_manager.cc
index a89d1230..182b2aa 100644
--- a/chrome/browser/ash/login/test/session_flags_manager.cc
+++ b/chrome/browser/ash/login/test/session_flags_manager.cc
@@ -136,7 +136,7 @@
   base::Value* user_flags = value->FindListKey(kUserFlagsKey);
   if (user_flags) {
     user_flags_ = std::vector<Switch>();
-    for (const base::Value& flag : user_flags->GetList()) {
+    for (const base::Value& flag : user_flags->GetListDeprecated()) {
       DCHECK(flag.is_dict());
       user_flags_->emplace_back(
           std::make_pair(*flag.FindStringKey(kFlagNameKey),
@@ -147,7 +147,7 @@
   base::Value* restart_job = value->FindListKey(kRestartJobKey);
   if (restart_job) {
     restart_job_ = std::vector<Switch>();
-    for (const base::Value& job_switch : restart_job->GetList()) {
+    for (const base::Value& job_switch : restart_job->GetListDeprecated()) {
       DCHECK(job_switch.is_dict());
       restart_job_->emplace_back(
           std::make_pair(*job_switch.FindStringKey(kFlagNameKey),
diff --git a/chrome/browser/ash/login/ui/login_display_host_mojo.cc b/chrome/browser/ash/login/ui/login_display_host_mojo.cc
index 68b843c7..2324bb5 100644
--- a/chrome/browser/ash/login/ui/login_display_host_mojo.cc
+++ b/chrome/browser/ash/login/ui/login_display_host_mojo.cc
@@ -94,7 +94,7 @@
   const base::ListValue* allowlist = nullptr;
   if (!cros_settings->GetList(kAccountsPrefUsers, &allowlist) || !allowlist)
     return false;
-  for (const base::Value& i : allowlist->GetList()) {
+  for (const base::Value& i : allowlist->GetListDeprecated()) {
     const std::string* allowlisted_user = i.GetIfString();
     // NB: Wildcards in the allowlist are also detected as not present here.
     if (!allowlisted_user || !user_manager->IsKnownUser(
diff --git a/chrome/browser/ash/login/ui/login_display_host_webui.cc b/chrome/browser/ash/login/ui/login_display_host_webui.cc
index b3a1008a..50b5a5c4b 100644
--- a/chrome/browser/ash/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/ash/login/ui/login_display_host_webui.cc
@@ -340,11 +340,11 @@
   // Currently, only the first element is used. The setting is a list for future
   // compatibility, if dynamically switching locales on the login screen will be
   // implemented.
-  if (login_screen_locales->GetList().empty() ||
-      !login_screen_locales->GetList()[0].is_string())
+  if (login_screen_locales->GetListDeprecated().empty() ||
+      !login_screen_locales->GetListDeprecated()[0].is_string())
     return std::string();
 
-  return login_screen_locales->GetList()[0].GetString();
+  return login_screen_locales->GetListDeprecated()[0].GetString();
 }
 
 // Disables virtual keyboard overscroll. Login UI will scroll user pods
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
index 58f74c82..9556821 100644
--- a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
@@ -720,8 +720,9 @@
   const base::Value* prefs_device_local_accounts =
       GetLocalState()->GetList(kDeviceLocalAccountsWithSavedData);
   std::vector<AccountId> device_local_accounts;
-  ParseUserList(prefs_device_local_accounts->GetList(), std::set<AccountId>(),
-                &device_local_accounts, device_local_accounts_set);
+  ParseUserList(prefs_device_local_accounts->GetListDeprecated(),
+                std::set<AccountId>(), &device_local_accounts,
+                device_local_accounts_set);
   for (const AccountId& account_id : device_local_accounts) {
     policy::DeviceLocalAccount::Type type;
     if (!policy::IsDeviceLocalAccountUser(account_id.GetUserEmail(), &type)) {
@@ -1350,14 +1351,15 @@
 void ChromeUserManagerImpl::AddReportingUser(const AccountId& account_id) {
   ListPrefUpdate users_update(GetLocalState(), ::prefs::kReportingUsers);
   base::Value email_value(account_id.GetUserEmail());
-  if (!base::Contains(users_update->GetList(), email_value))
+  if (!base::Contains(users_update->GetListDeprecated(), email_value))
     users_update->Append(std::move(email_value));
 }
 
 void ChromeUserManagerImpl::RemoveReportingUser(const AccountId& account_id) {
   ListPrefUpdate users_update(GetLocalState(), ::prefs::kReportingUsers);
   users_update->EraseListIter(
-      std::find(users_update->GetList().begin(), users_update->GetList().end(),
+      std::find(users_update->GetListDeprecated().begin(),
+                users_update->GetListDeprecated().end(),
                 base::Value(FullyCanonicalize(account_id.GetUserEmail()))));
 }
 
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_util.cc b/chrome/browser/ash/login/users/chrome_user_manager_util.cc
index b6285ec0..1cc8355 100644
--- a/chrome/browser/ash/login/users/chrome_user_manager_util.cc
+++ b/chrome/browser/ash/login/users/chrome_user_manager_util.cc
@@ -42,8 +42,9 @@
   for (user_manager::User* user : users) {
     const bool is_user_allowlisted =
         user->HasGaiaAccount() &&
-        CrosSettings::FindEmailInList(
-            allowlist->GetList(), user->GetAccountId().GetUserEmail(), nullptr);
+        CrosSettings::FindEmailInList(allowlist->GetListDeprecated(),
+                                      user->GetAccountId().GetUserEmail(),
+                                      nullptr);
     const bool is_allowed_because_family_link =
         allow_family_link && user->IsChild();
     const bool is_gaia_user_allowed =
diff --git a/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc b/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc
index 1fa804df..a24df5df 100644
--- a/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc
+++ b/chrome/browser/ash/login/users/default_user_image/default_user_images_unittest.cc
@@ -14,7 +14,7 @@
   std::unique_ptr<base::ListValue> current_default_images =
       default_user_image::GetCurrentImageSetAsListValue();
 
-  for (auto& image_data : current_default_images.get()->GetList()) {
+  for (auto& image_data : current_default_images.get()->GetListDeprecated()) {
     const auto index = image_data.FindIntPath("index");
     EXPECT_TRUE(index.has_value());
     EXPECT_TRUE(IsValidIndex(index.value()));
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc
index b17d0f3..3408c9e 100644
--- a/chrome/browser/ash/login/wizard_controller.cc
+++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -291,7 +291,8 @@
     {chromeos::ArcTermsOfServiceScreenView::kScreenId, "arc_tos"},
     {chromeos::EnrollmentScreenView::kScreenId, "enroll"},
     {chromeos::WelcomeView::kScreenId, "network"},
-    {chromeos::TermsOfServiceScreenView::kScreenId, "tos"}};
+    {chromeos::TermsOfServiceScreenView::kScreenId, "tos"},
+    {chromeos::RecommendAppsScreenView::kScreenId, "recommend-apps"}};
 
 void RecordUMAHistogramForOOBEStepShownStatus(
     OobeScreenId screen,
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc
index 851ae0a..62ba332 100644
--- a/chrome/browser/ash/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -2958,7 +2958,7 @@
   ASSERT_TRUE(network_list);
   ASSERT_TRUE(network_list->is_list());
 
-  const base::Value& network = network_list->GetList()[0];
+  const base::Value& network = network_list->GetListDeprecated()[0];
   ASSERT_TRUE(network.is_dict());
 
   const std::string* guid = network.FindStringKey("GUID");
diff --git a/chrome/browser/ash/net/bluetooth_pref_state_observer.cc b/chrome/browser/ash/net/bluetooth_pref_state_observer.cc
index f39c681..e15a2c1 100644
--- a/chrome/browser/ash/net/bluetooth_pref_state_observer.cc
+++ b/chrome/browser/ash/net/bluetooth_pref_state_observer.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chromeos/services/bluetooth_config/in_process_instance.h"
+#include "components/device_event_log/device_event_log.h"
 
 namespace ash {
 
@@ -35,9 +36,15 @@
   DCHECK(profile);
 
   // Only set the prefs for primary users.
-  if (!ProfileHelper::IsPrimaryProfile(profile))
+  if (!ProfileHelper::IsPrimaryProfile(profile)) {
+    BLUETOOTH_LOG(EVENT)
+        << "User profile loaded, but user is not primary. Not setting "
+        << "CrosBluetoothConfig with profile prefs service";
     return;
+  }
 
+  BLUETOOTH_LOG(EVENT) << "Primary profile loaded, setting CrosBluetoothConfig "
+                       << "with profile prefs service";
   SetPrefs(profile);
   session_observation_.Reset();
 }
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
index 01b2e7b..bbd53c3 100644
--- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
+++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
@@ -385,7 +385,7 @@
   }
 
   auto barrier_closure = base::BarrierClosure(
-      network_list->GetList().size(),
+      network_list->GetListDeprecated().size(),
       base::BindOnce(&RollbackNetworkConfig::Importer::AllNetworksConfigured,
                      weak_factory_.GetWeakPtr(), std::move(callback)));
 
@@ -395,7 +395,7 @@
 
   bool ownership_taken = IsOwnershipTaken();
 
-  for (base::Value& network : network_list->GetList()) {
+  for (base::Value& network : network_list->GetListDeprecated()) {
     if (!ownership_taken) {
       ManagedOncConfigureActivePartAsDeviceWide(network.Clone(),
                                                 finished_a_network);
diff --git a/chrome/browser/ash/note_taking_helper.cc b/chrome/browser/ash/note_taking_helper.cc
index fd94c2b..bb58307 100644
--- a/chrome/browser/ash/note_taking_helper.cc
+++ b/chrome/browser/ash/note_taking_helper.cc
@@ -216,7 +216,7 @@
 
   auto allowed_apps = std::make_unique<std::set<std::string>>();
   for (const base::Value& app_value :
-       allowed_lock_screen_apps_value->GetList()) {
+       allowed_lock_screen_apps_value->GetListDeprecated()) {
     if (!app_value.is_string()) {
       LOG(ERROR) << "Invalid app ID value " << app_value;
       continue;
diff --git a/chrome/browser/ash/ownership/owner_settings_service_ash.cc b/chrome/browser/ash/ownership/owner_settings_service_ash.cc
index b69b32b..d16d054 100644
--- a/chrome/browser/ash/ownership/owner_settings_service_ash.cc
+++ b/chrome/browser/ash/ownership/owner_settings_service_ash.cc
@@ -677,6 +677,7 @@
     //   kReportDeviceNetworkInterfaces
     //   kReportDeviceNetworkConfiguration
     //   kReportDeviceNetworkStatus
+    //   kReportDevicePeripherals
     //   kReportDevicePowerStatus
     //   kReportDeviceStorageStatus
     //   kReportDeviceSecurityStatus
diff --git a/chrome/browser/ash/ownership/owner_settings_service_ash_unittest.cc b/chrome/browser/ash/ownership/owner_settings_service_ash_unittest.cc
index ad7cd5e9..c47be44c 100644
--- a/chrome/browser/ash/ownership/owner_settings_service_ash_unittest.cc
+++ b/chrome/browser/ash/ownership/owner_settings_service_ash_unittest.cc
@@ -86,7 +86,7 @@
 bool FindInListValue(const std::string& needle, const base::Value* haystack) {
   if (!haystack->is_list())
     return false;
-  return base::Contains(haystack->GetList(), base::Value(needle));
+  return base::Contains(haystack->GetListDeprecated(), base::Value(needle));
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc b/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc
index c8921a4c..4a152ea 100644
--- a/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc
+++ b/chrome/browser/ash/policy/affiliation/affiliation_test_helper.cc
@@ -170,7 +170,7 @@
 void AffiliationTestHelper::PreLoginUser(const AccountId& account_id) {
   ListPrefUpdate users_pref(g_browser_process->local_state(), "LoggedInUsers");
   base::Value email_value(account_id.GetUserEmail());
-  if (!base::Contains(users_pref->GetList(), email_value))
+  if (!base::Contains(users_pref->GetListDeprecated(), email_value))
     users_pref->Append(std::move(email_value));
 
   user_manager::KnownUser(g_browser_process->local_state())
diff --git a/chrome/browser/ash/policy/core/device_local_account.cc b/chrome/browser/ash/policy/core/device_local_account.cc
index 3289375..2c26b40 100644
--- a/chrome/browser/ash/policy/core/device_local_account.cc
+++ b/chrome/browser/ash/policy/core/device_local_account.cc
@@ -247,8 +247,8 @@
     return accounts;
 
   std::set<std::string> account_ids;
-  for (size_t i = 0; i < list->GetList().size(); ++i) {
-    const base::Value& entry = list->GetList()[i];
+  for (size_t i = 0; i < list->GetListDeprecated().size(); ++i) {
+    const base::Value& entry = list->GetListDeprecated()[i];
     if (!entry.is_dict()) {
       LOG(ERROR) << "Corrupt entry in device-local account list at index " << i
                  << ".";
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder.cc b/chrome/browser/ash/policy/core/device_policy_decoder.cc
index fec2827..eb29152 100644
--- a/chrome/browser/ash/policy/core/device_policy_decoder.cc
+++ b/chrome/browser/ash/policy/core/device_policy_decoder.cc
@@ -799,6 +799,11 @@
                     POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
                     base::Value(container.report_crash_report_info()), nullptr);
     }
+    if (container.has_report_peripherals()) {
+      policies->Set(key::kReportDevicePeripherals, POLICY_LEVEL_MANDATORY,
+                    POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
+                    base::Value(container.report_peripherals()), nullptr);
+    }
     if (container.has_report_power_status()) {
       policies->Set(key::kReportDevicePowerStatus, POLICY_LEVEL_MANDATORY,
                     POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD,
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
index 30df2bb20..f3bd117 100644
--- a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
+++ b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
@@ -288,6 +288,19 @@
                                key::kReportDeviceAudioStatusCheckingRateMs,
                                std::move(event_checking_rate_ms_value));
 }
+TEST_F(DevicePolicyDecoderTest, ReportDevicePeripherals) {
+  em::ChromeDeviceSettingsProto device_policy;
+
+  DecodeUnsetDevicePolicyTestHelper(device_policy,
+                                    key::kReportDevicePeripherals);
+
+  base::Value report_peripherals_value(true);
+  device_policy.mutable_device_reporting()->set_report_peripherals(
+      report_peripherals_value.GetBool());
+
+  DecodeDevicePolicyTestHelper(device_policy, key::kReportDevicePeripherals,
+                               std::move(report_peripherals_value));
+}
 
 TEST_F(DevicePolicyDecoderTest, EnableDeviceGranularReporting) {
   em::ChromeDeviceSettingsProto device_policy;
diff --git a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
index 24615ac3..76d74ff 100644
--- a/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_content_manager_ash_browsertest.cc
@@ -878,7 +878,6 @@
 
 IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest,
                        ScreenShareWarnedDuringAllowed) {
-  helper_->EnableScreenShareWarningMode();
   SetupReporting();
   NotificationDisplayServiceTester display_service_tester(browser()->profile());
 
@@ -927,7 +926,6 @@
 
 IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest,
                        ScreenShareWarnedDuringCanceled) {
-  helper_->EnableScreenShareWarningMode();
   SetupReporting();
   NotificationDisplayServiceTester display_service_tester(browser()->profile());
 
@@ -975,7 +973,6 @@
 
 IN_PROC_BROWSER_TEST_F(DlpContentManagerAshBrowserTest,
                        ScreenShareWarnedFromLacrosDuringAllowed) {
-  helper_->EnableScreenShareWarningMode();
   SetupReporting();
   NotificationDisplayServiceTester display_service_tester(browser()->profile());
 
@@ -1114,7 +1111,6 @@
 
 IN_PROC_BROWSER_TEST_F(DlpContentManagerAshScreenShareBrowserTest,
                        TabScreenShareWarnedAllowed) {
-  helper_->EnableScreenShareWarningMode();
   MockDlpWarnNotifier* mock_dlp_warn_notifier =
       CreateAndSetMockDlpWarnNotifier(/*should_proceed=*/true);
   EXPECT_CALL(*mock_dlp_warn_notifier, ShowDlpWarningDialog(_, _)).Times(1);
@@ -1139,7 +1135,6 @@
 
 IN_PROC_BROWSER_TEST_F(DlpContentManagerAshScreenShareBrowserTest,
                        TabScreenShareWarnedCancelled) {
-  helper_->EnableScreenShareWarningMode();
   MockDlpWarnNotifier* mock_dlp_warn_notifier =
       CreateAndSetMockDlpWarnNotifier(/*should_proceed=*/false);
   EXPECT_CALL(*mock_dlp_warn_notifier, ShowDlpWarningDialog(_, _)).Times(1);
diff --git a/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc b/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc
index d2d5254..0ec9da04 100644
--- a/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc
+++ b/chrome/browser/ash/policy/external_data/cloud_external_data_manager_base.cc
@@ -460,7 +460,7 @@
       continue;
     }
     if (it.second.value() && it.second.value()->is_list()) {
-      for (const auto& app : it.second.value()->GetList()) {
+      for (const auto& app : it.second.value()->GetListDeprecated()) {
         const base::DictionaryValue* dict = nullptr;
         if (app.GetAsDictionary(&dict)) {
           const base::Value* const icon = dict->FindKey(kCustomIconKey);
diff --git a/chrome/browser/ash/policy/handlers/bluetooth_policy_handler.cc b/chrome/browser/ash/policy/handlers/bluetooth_policy_handler.cc
index e8f4f2e..df2f4e2c 100644
--- a/chrome/browser/ash/policy/handlers/bluetooth_policy_handler.cc
+++ b/chrome/browser/ash/policy/handlers/bluetooth_policy_handler.cc
@@ -74,7 +74,7 @@
   // returns an empty list even if the policy did not set.
   if (cros_settings_->GetList(ash::kDeviceAllowedBluetoothServices,
                               &allowed_services_list)) {
-    for (const auto& list_value : allowed_services_list->GetList()) {
+    for (const auto& list_value : allowed_services_list->GetListDeprecated()) {
       if (!list_value.is_string())
         continue;
 
diff --git a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler.cc b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler.cc
index 24fae9c6..072c927 100644
--- a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler.cc
+++ b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler.cc
@@ -236,7 +236,7 @@
     return;
   }
   const base::Value* entries = policy_value->FindListKey(kRequirements);
-  if (!entries || entries->GetList().empty()) {
+  if (!entries || entries->GetListDeprecated().empty()) {
     VLOG(1) << "Revoke policy - empty policy requirements.";
     HandleUpdateNotRequired();
     return;
@@ -245,7 +245,7 @@
   unmanaged_user_restricted_ = restricted.value_or(false);
 
   std::vector<std::unique_ptr<MinimumVersionRequirement>> configs;
-  for (const auto& item : entries->GetList()) {
+  for (const auto& item : entries->GetListDeprecated()) {
     const base::DictionaryValue* dict;
     if (item.GetAsDictionary(&dict)) {
       std::unique_ptr<MinimumVersionRequirement> instance =
diff --git a/chrome/browser/ash/policy/handlers/system_proxy_handler.cc b/chrome/browser/ash/policy/handlers/system_proxy_handler.cc
index ee8682b..153d6e5c 100644
--- a/chrome/browser/ash/policy/handlers/system_proxy_handler.cc
+++ b/chrome/browser/ash/policy/handlers/system_proxy_handler.cc
@@ -61,7 +61,7 @@
 
   std::vector<std::string> system_services_auth_schemes;
   if (auth_schemes) {
-    for (const auto& auth_scheme : auth_schemes->GetList())
+    for (const auto& auth_scheme : auth_schemes->GetListDeprecated())
       system_services_auth_schemes.push_back(auth_scheme.GetString());
   }
 
diff --git a/chrome/browser/ash/policy/networking/euicc_status_uploader.cc b/chrome/browser/ash/policy/networking/euicc_status_uploader.cc
index a9f295f..40ff38e 100644
--- a/chrome/browser/ash/policy/networking/euicc_status_uploader.cc
+++ b/chrome/browser/ash/policy/networking/euicc_status_uploader.cc
@@ -110,7 +110,7 @@
   auto* mutable_esim_profiles = upload_request->mutable_esim_profiles();
   for (const auto& esim_profile :
        status.FindListPath(kLastUploadedEuiccStatusESimProfilesKey)
-           ->GetList()) {
+           ->GetListDeprecated()) {
     enterprise_management::ESimProfileInfo esim_profile_info;
     esim_profile_info.set_iccid(*esim_profile.FindStringKey(
         kLastUploadedEuiccStatusESimProfilesIccidKey));
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc
index 307484d..1d5780c 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_event_log_uploader_unittest.cc
@@ -501,7 +501,7 @@
   EXPECT_EQ(2u,
             value_report_
                 .FindListKey(RealtimeReportingJobConfiguration::kEventListKey)
-                ->GetList()
+                ->GetListDeprecated()
                 .size());
 }
 
diff --git a/chrome/browser/ash/policy/reporting/arc_app_install_event_logger.cc b/chrome/browser/ash/policy/reporting/arc_app_install_event_logger.cc
index 0963b09..4410689 100644
--- a/chrome/browser/ash/policy/reporting/arc_app_install_event_logger.cc
+++ b/chrome/browser/ash/policy/reporting/arc_app_install_event_logger.cc
@@ -141,7 +141,7 @@
       GetPackagesFromPref(arc::prefs::kArcPushInstallAppsPending);
 
   std::set<std::string> pending_in_arc;
-  for (const auto& detail : details->GetList()) {
+  for (const auto& detail : details->GetListDeprecated()) {
     const base::Value* const reason =
         detail.FindKeyOfType("nonComplianceReason", base::Value::Type::INTEGER);
     if (!reason || reason->GetInt() != kNonComplianceReasonAppNotInstalled) {
@@ -178,7 +178,7 @@
     const std::string& pref_name) const {
   std::set<std::string> packages;
   for (const auto& package :
-       profile_->GetPrefs()->GetList(pref_name)->GetList()) {
+       profile_->GetPrefs()->GetList(pref_name)->GetListDeprecated()) {
     if (!package.is_string()) {
       continue;
     }
diff --git a/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader_unittest.cc b/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader_unittest.cc
index 5ce2bf5..73169b01 100644
--- a/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader_unittest.cc
@@ -400,7 +400,7 @@
   EXPECT_EQ(2u,
             value_report_
                 .FindListKey(RealtimeReportingJobConfiguration::kEventListKey)
-                ->GetList()
+                ->GetListDeprecated()
                 .size());
 }
 
diff --git a/chrome/browser/ash/policy/scheduled_task_handler/device_scheduled_update_checker.cc b/chrome/browser/ash/policy/scheduled_task_handler/device_scheduled_update_checker.cc
index 79ef25c4..5f8246c 100644
--- a/chrome/browser/ash/policy/scheduled_task_handler/device_scheduled_update_checker.cc
+++ b/chrome/browser/ash/policy/scheduled_task_handler/device_scheduled_update_checker.cc
@@ -14,6 +14,7 @@
 #include "ash/components/settings/timezone_settings.h"
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/feature_list.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
@@ -23,6 +24,7 @@
 #include "chrome/browser/ash/policy/scheduled_task_handler/scheduled_task_executor_impl.h"
 #include "chrome/browser/ash/policy/scheduled_task_handler/scheduled_task_util.h"
 #include "chrome/browser/ash/policy/scheduled_task_handler/task_executor_with_retries.h"
+#include "chrome/common/chrome_features.h"
 
 namespace policy {
 
@@ -115,11 +117,17 @@
 }
 
 void DeviceScheduledUpdateChecker::OnScheduledUpdateCheckDataChanged() {
-  // If the policy is removed then reset all state including any existing update
-  // checks.
+  // If the policy is removed or is not supported on the device, then reset all
+  // state including any existing update checks.
+  // The policy is not supported if device can not reliably schedule RTC wake
+  // in a required range. The specific feature used is one that describes a
+  // a known bug on some platforms, where setting rtc wake further than 24 hours
+  // away crashes the device. Alternative ways to fix it are too risky, since
+  // they may break a bigger proportion of the devices when pushed.
   const base::Value* value =
       cros_settings_->GetPref(ash::kDeviceScheduledUpdateCheck);
-  if (!value) {
+  if (!base::FeatureList::IsEnabled(::features::kSupportsRtcWakeOver24Hours) ||
+      !value) {
     ResetState();
     return;
   }
diff --git a/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc b/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
index bdfb35a9..e8f2f87 100644
--- a/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
+++ b/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/clock.h"
 #include "base/time/time.h"
@@ -30,6 +31,7 @@
 #include "chrome/browser/ash/policy/scheduled_task_handler/test/scheduled_task_test_util.h"
 #include "chrome/browser/ash/settings/scoped_testing_cros_settings.h"
 #include "chrome/browser/ash/settings/stub_cros_settings_provider.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
@@ -993,4 +995,34 @@
                          expected_update_check_completions));
 }
 
+// Check that the facility is disabled when the RTC wake support feature is
+// disabled.
+TEST_F(DeviceScheduledUpdateCheckerTest, DisabledFeature) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(
+      ::features::kSupportsRtcWakeOver24Hours);
+
+  base::TimeDelta delay_from_now = base::Hours(1);
+  auto policy_and_next_update_check_time =
+      scheduled_task_test_util::CreatePolicy(
+          scheduled_task_executor_->GetTimeZone(),
+          scheduled_task_executor_->GetCurrentTime(), delay_from_now,
+          ScheduledTaskExecutor::Frequency::kDaily, kTaskTimeFieldName);
+
+  cros_settings_.device_settings()->Set(
+      ash::kDeviceScheduledUpdateCheck,
+      std::move(policy_and_next_update_check_time.first));
+  task_environment_.FastForwardBy(delay_from_now);
+
+  // No check should happen when kSupportsRtcWakeOver24Hours is off.
+  int expected_update_checks = 0;
+  int expected_update_check_requests = 0;
+  int expected_update_check_completions = 0;
+
+  task_environment_.FastForwardBy(
+      update_checker_internal::kOsAndPoliciesUpdateCheckHardTimeout);
+  EXPECT_TRUE(CheckStats(expected_update_checks, expected_update_check_requests,
+                         expected_update_check_completions));
+}
+
 }  // namespace policy
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector.cc b/chrome/browser/ash/policy/status_collector/device_status_collector.cc
index 3c6aae6..bf9d2c9d 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector.cc
@@ -2174,7 +2174,7 @@
 void DeviceStatusCollector::ReportingUsersChanged() {
   std::vector<std::string> reporting_users;
   for (auto& value :
-       pref_service_->GetList(prefs::kReportingUsers)->GetList()) {
+       pref_service_->GetList(prefs::kReportingUsers)->GetListDeprecated()) {
     if (value.is_string())
       reporting_users.push_back(value.GetString());
   }
@@ -2973,9 +2973,10 @@
 }
 bool DeviceStatusCollector::IsReportingHardwareData() const {
   return report_power_status_ || report_storage_status_ ||
-         report_board_status_ || report_memory_info_ || report_cpu_info_ ||
-         report_backlight_info_ || report_bluetooth_info_ || report_fan_info_ ||
-         report_vpd_info_ || report_system_info_ || report_version_info_;
+         report_audio_status_ || report_board_status_ || report_memory_info_ ||
+         report_cpu_info_ || report_backlight_info_ || report_bluetooth_info_ ||
+         report_fan_info_ || report_vpd_info_ || report_system_info_ ||
+         report_version_info_;
 }
 bool DeviceStatusCollector::IsReportingUsers() const {
   // For more details, see comment in
diff --git a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector.cc b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector.cc
index f426e31f..1983b48 100644
--- a/chrome/browser/ash/policy/status_collector/legacy_device_status_collector.cc
+++ b/chrome/browser/ash/policy/status_collector/legacy_device_status_collector.cc
@@ -2084,7 +2084,7 @@
 void LegacyDeviceStatusCollector::ReportingUsersChanged() {
   std::vector<std::string> reporting_users;
   for (auto& value :
-       pref_service_->GetList(prefs::kReportingUsers)->GetList()) {
+       pref_service_->GetList(prefs::kReportingUsers)->GetListDeprecated()) {
     if (value.is_string())
       reporting_users.push_back(value.GetString());
   }
diff --git a/chrome/browser/ash/policy/uploading/system_log_uploader.cc b/chrome/browser/ash/policy/uploading/system_log_uploader.cc
index 52ce1855..1fe40db 100644
--- a/chrome/browser/ash/policy/uploading/system_log_uploader.cc
+++ b/chrome/browser/ash/policy/uploading/system_log_uploader.cc
@@ -529,7 +529,7 @@
 
   std::vector<base::Time> updated_log_uploads;
 
-  for (const base::Value& item : prev_log_uploads->GetList()) {
+  for (const base::Value& item : prev_log_uploads->GetListDeprecated()) {
     // ListValue stores Value type and Value does not support base::Time,
     // so we store double and convert to base::Time here.
     const base::Time current_item_time =
@@ -585,7 +585,7 @@
   // kLogThrottleWindowDuration time.
   if (g_browser_process->local_state()
               ->GetList(policy::prefs::kStoreLogStatesAcrossReboots)
-              ->GetList()
+              ->GetListDeprecated()
               .size() >= kLogThrottleCount &&
       !frequency.is_zero()) {
     delay = std::max(delay, last_valid_log_upload + kLogThrottleWindowDuration -
diff --git a/chrome/browser/ash/printing/calculators_policies_binder.cc b/chrome/browser/ash/printing/calculators_policies_binder.cc
index e7732c9..24eee9c 100644
--- a/chrome/browser/ash/printing/calculators_policies_binder.cc
+++ b/chrome/browser/ash/printing/calculators_policies_binder.cc
@@ -41,7 +41,7 @@
     return string_list;
   }
 
-  for (const base::Value& value : list->GetList()) {
+  for (const base::Value& value : list->GetListDeprecated()) {
     if (value.is_string()) {
       string_list.push_back(value.GetString());
     }
diff --git a/chrome/browser/ash/printing/enterprise_printers_provider.cc b/chrome/browser/ash/printing/enterprise_printers_provider.cc
index 50f86fc..6f2d51b 100644
--- a/chrome/browser/ash/printing/enterprise_printers_provider.cc
+++ b/chrome/browser/ash/printing/enterprise_printers_provider.cc
@@ -32,7 +32,7 @@
 std::vector<std::string> ConvertToVector(const base::Value* list) {
   std::vector<std::string> string_list;
   if (list && list->is_list()) {
-    for (const base::Value& value : list->GetList()) {
+    for (const base::Value& value : list->GetListDeprecated()) {
       if (value.is_string()) {
         string_list.push_back(value.GetString());
       }
diff --git a/chrome/browser/ash/printing/print_servers_provider.cc b/chrome/browser/ash/printing/print_servers_provider.cc
index 71bf3fd..2483c26 100644
--- a/chrome/browser/ash/printing/print_servers_provider.cc
+++ b/chrome/browser/ash/printing/print_servers_provider.cc
@@ -251,7 +251,7 @@
         prefs_->FindPreference(allowlist_pref_);
     if (pref != nullptr && !pref->IsDefaultValue()) {
       allowlist_ = std::set<std::string>();
-      for (const base::Value& value : pref->GetValue()->GetList()) {
+      for (const base::Value& value : pref->GetValue()->GetListDeprecated()) {
         if (value.is_string()) {
           allowlist_.value().insert(value.GetString());
         }
diff --git a/chrome/browser/ash/release_notes/release_notes_storage.cc b/chrome/browser/ash/release_notes/release_notes_storage.cc
index c069680..bfc419164 100644
--- a/chrome/browser/ash/release_notes/release_notes_storage.cc
+++ b/chrome/browser/ash/release_notes/release_notes_storage.cc
@@ -28,7 +28,7 @@
 // This stores the latest milestone with new Release Notes content. If the last
 // milestone the user has seen the notification is before this, a new
 // notification will be shown.
-constexpr int kLastChromeVersionWithReleaseNotes = 96;
+constexpr int kLastChromeVersionWithReleaseNotes = 100;
 constexpr int kTimesToShowSuggestionChip = 3;
 
 int GetMilestone() {
diff --git a/chrome/browser/ash/settings/cros_settings.cc b/chrome/browser/ash/settings/cros_settings.cc
index 12a5bc9..a6aeba7 100644
--- a/chrome/browser/ash/settings/cros_settings.cc
+++ b/chrome/browser/ash/settings/cros_settings.cc
@@ -225,7 +225,7 @@
     return false;
   }
 
-  return FindEmailInList(list->GetList(), email, wildcard_match);
+  return FindEmailInList(list->GetListDeprecated(), email, wildcard_match);
 }
 
 // static
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc
index cd0abbb..60b392b0 100644
--- a/chrome/browser/ash/settings/device_settings_provider.cc
+++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -134,6 +134,7 @@
     kReportDeviceFanInfo,
     kReportDeviceHardwareStatus,
     kReportDeviceLocation,
+    kReportDevicePeripherals,
     kReportDevicePowerStatus,
     kReportDeviceStorageStatus,
     kReportDeviceNetworkConfiguration,
@@ -720,6 +721,10 @@
       new_values_cache->SetBoolean(kReportRunningKioskApp,
                                    reporting_policy.report_running_kiosk_app());
     }
+    if (reporting_policy.has_report_peripherals()) {
+      new_values_cache->SetBoolean(kReportDevicePeripherals,
+                                   reporting_policy.report_peripherals());
+    }
     if (reporting_policy.has_report_power_status()) {
       new_values_cache->SetBoolean(kReportDevicePowerStatus,
                                    reporting_policy.report_power_status());
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
index c948251..aafbd1d 100644
--- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc
+++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -108,6 +108,7 @@
     proto->set_report_crash_report_info(enable_reporting);
     proto->set_report_os_update_status(enable_reporting);
     proto->set_report_running_kiosk_app(enable_reporting);
+    proto->set_report_peripherals(enable_reporting);
     proto->set_report_power_status(enable_reporting);
     proto->set_report_security_status(enable_reporting);
     proto->set_report_storage_status(enable_reporting);
@@ -193,6 +194,7 @@
         kReportDeviceNetworkStatus,
         kReportDeviceUsers,
         kReportDeviceHardwareStatus,
+        kReportDevicePeripherals,
         kReportDevicePowerStatus,
         kReportDeviceStorageStatus,
         kReportDeviceSessionStatus,
diff --git a/chrome/browser/ash/smb_client/smb_persisted_share_registry.cc b/chrome/browser/ash/smb_client/smb_persisted_share_registry.cc
index 52a015de..7643864 100644
--- a/chrome/browser/ash/smb_client/smb_persisted_share_registry.cc
+++ b/chrome/browser/ash/smb_client/smb_persisted_share_registry.cc
@@ -100,7 +100,7 @@
   ListPrefUpdate pref(profile_->GetPrefs(),
                       prefs::kNetworkFileSharesSavedShares);
 
-  base::Value::ListView share_list = pref->GetList();
+  base::Value::ListView share_list = pref->GetListDeprecated();
   for (auto it = share_list.begin(); it != share_list.end(); ++it) {
     if (GetStringValue(*it, kShareUrlKey) == share.share_url().ToString()) {
       *it = ShareToDict(share);
@@ -116,7 +116,7 @@
   ListPrefUpdate pref(profile_->GetPrefs(),
                       prefs::kNetworkFileSharesSavedShares);
 
-  base::Value::ListView share_list = pref->GetList();
+  base::Value::ListView share_list = pref->GetListDeprecated();
   for (auto it = share_list.begin(); it != share_list.end(); ++it) {
     if (GetStringValue(*it, kShareUrlKey) == share_url.ToString()) {
       bool result = pref->EraseListIter(it);
@@ -134,7 +134,7 @@
     return {};
   }
 
-  base::Value::ConstListView share_list = pref->GetList();
+  base::Value::ConstListView share_list = pref->GetListDeprecated();
   for (auto it = share_list.begin(); it != share_list.end(); ++it) {
     if (GetStringValue(*it, kShareUrlKey) == share_url.ToString()) {
       return DictToShare(*it);
@@ -151,7 +151,7 @@
   }
 
   std::vector<SmbShareInfo> shares;
-  base::Value::ConstListView share_list = pref->GetList();
+  base::Value::ConstListView share_list = pref->GetListDeprecated();
   for (auto it = share_list.begin(); it != share_list.end(); ++it) {
     absl::optional<SmbShareInfo> info = DictToShare(*it);
     if (!info) {
diff --git a/chrome/browser/ash/smb_client/smb_service.cc b/chrome/browser/ash/smb_client/smb_service.cc
index 471f87f..ce2501eb 100644
--- a/chrome/browser/ash/smb_client/smb_service.cc
+++ b/chrome/browser/ash/smb_client/smb_service.cc
@@ -625,7 +625,7 @@
   const base::Value* preconfigured_shares = profile_->GetPrefs()->GetList(
       prefs::kNetworkFileSharesPreconfiguredShares);
 
-  for (const base::Value& info : preconfigured_shares->GetList()) {
+  for (const base::Value& info : preconfigured_shares->GetListDeprecated()) {
     // |info| is a dictionary with entries for |share_url| and |mode|.
     const base::Value* share_url = info.FindKey(kShareUrlKey);
     const base::Value* mode = info.FindKey(kModeKey);
diff --git a/chrome/browser/ash/system_logs/shill_log_source.cc b/chrome/browser/ash/system_logs/shill_log_source.cc
index f42f2e6..c2a53d9b 100644
--- a/chrome/browser/ash/system_logs/shill_log_source.cc
+++ b/chrome/browser/ash/system_logs/shill_log_source.cc
@@ -112,7 +112,7 @@
 
   const base::Value* devices = result->FindListKey(shill::kDevicesProperty);
   if (devices) {
-    for (const base::Value& device : devices->GetList()) {
+    for (const base::Value& device : devices->GetListDeprecated()) {
       std::string path = GetString(&device);
       if (path.empty())
         continue;
@@ -126,7 +126,7 @@
 
   const base::Value* services = result->FindListKey(shill::kServicesProperty);
   if (services) {
-    for (const base::Value& service : services->GetList()) {
+    for (const base::Value& service : services->GetListDeprecated()) {
       std::string path = GetString(&service);
       if (path.empty())
         continue;
@@ -163,7 +163,7 @@
   if (!ip_configs)
     return;
 
-  for (const base::Value& ip_config : ip_configs->GetList()) {
+  for (const base::Value& ip_config : ip_configs->GetListDeprecated()) {
     std::string ip_config_path = GetString(&ip_config);
     if (ip_config_path.empty())
       continue;
diff --git a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
index e6ceb526..3eb7574 100644
--- a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
+++ b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
@@ -62,7 +62,8 @@
 
   ON_CALL(*this, AddRequestAndStartIfNecessary)
       .WillByDefault(
-          [](const absl::optional<std::string>& resume_token,
+          [](const absl::optional<std::string>& album_id,
+             const absl::optional<std::string>& resume_token,
              base::OnceCallback<void(GooglePhotosPhotosCbkArgs)> callback) {
             auto response = FetchGooglePhotosPhotosResponse::New(
                 std::vector<GooglePhotosPhotoPtr>(), absl::nullopt);
diff --git a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
index d48bd0d02f..0167c69 100644
--- a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
+++ b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
@@ -62,8 +62,8 @@
 };
 
 // Fetcher that returns an empty photo list and no resume token in response to a
-// request for the user's Google Photos photos. Used to avoid network requests
-// in unit tests.
+// request for photos from the user's Google Photos library. Used to avoid
+// network requests in unit tests.
 class MockGooglePhotosPhotosFetcher : public GooglePhotosPhotosFetcher {
  public:
   explicit MockGooglePhotosPhotosFetcher(Profile* profile);
@@ -77,7 +77,8 @@
   // GooglePhotosPhotosFetcher:
   MOCK_METHOD(void,
               AddRequestAndStartIfNecessary,
-              (const absl::optional<std::string>& resume_token,
+              (const absl::optional<std::string>& album_id,
+               const absl::optional<std::string>& resume_token,
                base::OnceCallback<void(GooglePhotosPhotosCbkArgs)> callback),
               (override));
 
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
index 399b7bf..6ea4af1b 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
@@ -34,6 +34,7 @@
 #include "google_apis/gaia/gaia_constants.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "net/base/load_flags.h"
+#include "net/base/url_util.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/cpp/simple_url_loader.h"
@@ -66,6 +67,11 @@
 // The label used to return exclusive content for Google branded chromebooks.
 constexpr char kGoogleDeviceFilteringLabel[] = "google_branded_chromebook";
 
+// The URL to download an album's photos from a user's Google Photos library.
+constexpr char kGooglePhotosAlbumUrl[] =
+    "https://photosfirstparty-pa.googleapis.com/v1/chromeos/"
+    "collectionById:read";
+
 // The URL to download the albums in a user's Google Photos library.
 constexpr char kGooglePhotosAlbumsUrl[] =
     "https://photosfirstparty-pa.googleapis.com/v1/chromeos/"
@@ -131,8 +137,10 @@
         description:
           "Within the Google Photos tile, the ChromeOS Wallpaper Picker "
           "shows the user all the visible photos in their Google Photos "
-          "library so that they can pick one as their wallpaper. This query "
-          "fetches those photos."
+          "library so that they can pick one as their wallpaper. "
+          "Alternatively, the user can select an album within the Google "
+          "Photos tile to pick a photo from there. This query fetches photos "
+          "from one of those sources."
         trigger: "When the user accesses the Google Photos tile within the "
                  "ChromeOS Wallpaper Picker app."
         data: "OAuth credentials for the user's Google Photos account."
@@ -481,7 +489,7 @@
 
 template <typename T>
 void GooglePhotosFetcher<T>::AddRequestAndStartIfNecessary(
-    const std::string& service_url,
+    const GURL& service_url,
     ClientCallback callback) {
   pending_client_callbacks_[service_url].push_back(std::move(callback));
   if (pending_client_callbacks_[service_url].size() > 1)
@@ -504,7 +512,7 @@
 
 template <typename T>
 void GooglePhotosFetcher<T>::OnTokenReceived(
-    const std::string& service_url,
+    const GURL& service_url,
     GoogleServiceAuthError error,
     signin::AccessTokenInfo token_info) {
   if (error.state() != GoogleServiceAuthError::NONE) {
@@ -514,7 +522,7 @@
 
   auto resource_request = std::make_unique<network::ResourceRequest>();
   resource_request->method = "GET";
-  resource_request->url = GURL(service_url);
+  resource_request->url = service_url;
   // Cookies should not be allowed.
   resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
   resource_request->load_flags = net::LOAD_DISABLE_CACHE;
@@ -535,7 +543,7 @@
 
 template <typename T>
 void GooglePhotosFetcher<T>::OnJsonReceived(
-    const std::string& service_url,
+    const GURL& service_url,
     std::unique_ptr<std::string> response_body) {
   const int net_error = url_loaders_[service_url]->NetError();
   if (net_error != net::OK || !response_body) {
@@ -554,7 +562,7 @@
 
 template <typename T>
 void GooglePhotosFetcher<T>::OnResponseReady(
-    const std::string& service_url,
+    const GURL& service_url,
     absl::optional<base::Value> response) {
   T args = ParseResponse(std::move(response));
   for (auto& callback : pending_client_callbacks_[service_url])
@@ -575,11 +583,10 @@
 void GooglePhotosAlbumsFetcher::AddRequestAndStartIfNecessary(
     const absl::optional<std::string>& resume_token,
     base::OnceCallback<void(GooglePhotosAlbumsCbkArgs)> callback) {
-  std::string service_url =
-      resume_token.has_value()
-          ? base::StrCat({kGooglePhotosAlbumsUrl,
-                          "?resume_token=", resume_token.value()})
-          : kGooglePhotosAlbumsUrl;
+  GURL service_url = GURL(kGooglePhotosAlbumsUrl);
+  if (resume_token.has_value())
+    service_url = net::AppendQueryParameter(service_url, "resume_token",
+                                            resume_token.value());
   GooglePhotosFetcher::AddRequestAndStartIfNecessary(service_url,
                                                      std::move(callback));
 }
@@ -602,7 +609,7 @@
 
   // Populate the ID -> URL mapping for the each album's cover photo.
   std::map<std::string, std::string> cover_photo_urls_by_id;
-  for (const auto& response_photo : response_photos->GetList()) {
+  for (const auto& response_photo : response_photos->GetListDeprecated()) {
     const std::string* id = response_photo.FindStringPath("itemId.mediaKey");
     const std::string* url = response_photo.FindStringPath("photo.servingUrl");
     if (id && url)
@@ -615,7 +622,7 @@
 
   parsed_response->albums =
       std::vector<ash::personalization_app::mojom::GooglePhotosAlbumPtr>();
-  for (const auto& response_album : response_albums->GetList()) {
+  for (const auto& response_album : response_albums->GetListDeprecated()) {
     const std::string* album_id =
         response_album.FindStringPath("collectionId.mediaKey");
     const std::string* title = response_album.FindStringPath("name");
@@ -654,8 +661,8 @@
 
 void GooglePhotosCountFetcher::AddRequestAndStartIfNecessary(
     base::OnceCallback<void(int)> callback) {
-  GooglePhotosFetcher::AddRequestAndStartIfNecessary(kGooglePhotosCountUrl,
-                                                     std::move(callback));
+  GooglePhotosFetcher::AddRequestAndStartIfNecessary(
+      GURL(kGooglePhotosCountUrl), std::move(callback));
 }
 
 int GooglePhotosCountFetcher::ParseResponse(
@@ -680,13 +687,21 @@
 GooglePhotosPhotosFetcher::~GooglePhotosPhotosFetcher() = default;
 
 void GooglePhotosPhotosFetcher::AddRequestAndStartIfNecessary(
+    const absl::optional<std::string>& album_id,
     const absl::optional<std::string>& resume_token,
     base::OnceCallback<void(GooglePhotosPhotosCbkArgs)> callback) {
-  std::string service_url =
-      resume_token.has_value()
-          ? base::StrCat({kGooglePhotosPhotosUrl,
-                          "?resume_token=", resume_token.value()})
-          : kGooglePhotosPhotosUrl;
+  GURL service_url;
+  if (album_id.has_value()) {
+    service_url = net::AppendQueryParameter(GURL(kGooglePhotosAlbumUrl),
+                                            "album_id", album_id.value());
+  } else {
+    service_url = GURL(kGooglePhotosPhotosUrl);
+  }
+
+  if (resume_token.has_value()) {
+    service_url = net::AppendQueryParameter(service_url, "resume_token",
+                                            resume_token.value());
+  }
   GooglePhotosFetcher::AddRequestAndStartIfNecessary(service_url,
                                                      std::move(callback));
 }
@@ -708,7 +723,7 @@
 
   parsed_response->photos =
       std::vector<ash::personalization_app::mojom::GooglePhotosPhotoPtr>();
-  for (const auto& response_photo : response_photos->GetList()) {
+  for (const auto& response_photo : response_photos->GetListDeprecated()) {
     const std::string* id = response_photo.FindStringPath("itemId.mediaKey");
     const std::string* timestamp_seconds_string =
         response_photo.FindStringPath("creationTimestamp.seconds");
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
index 20b51c9d..10524fb 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
@@ -14,6 +14,7 @@
 #include "base/scoped_observation.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
+#include "url/gurl.h"
 
 class GoogleServiceAuthError;
 class Profile;
@@ -166,7 +167,7 @@
   // function that prepares `service_url`--with appended query params from the
   // client if applicable--and delegates the rest of the work to this function.
   using ClientCallback = base::OnceCallback<void(T)>;
-  void AddRequestAndStartIfNecessary(const std::string& service_url,
+  void AddRequestAndStartIfNecessary(const GURL& service_url,
                                      ClientCallback callback);
 
   // Called when the API request finishes. `response` will be absent if there
@@ -176,12 +177,12 @@
   virtual T ParseResponse(absl::optional<base::Value> response) = 0;
 
  private:
-  void OnTokenReceived(const std::string& service_url,
+  void OnTokenReceived(const GURL& service_url,
                        GoogleServiceAuthError error,
                        signin::AccessTokenInfo token_info);
-  void OnJsonReceived(const std::string& service_url,
+  void OnJsonReceived(const GURL& service_url,
                       std::unique_ptr<std::string> response_body);
-  void OnResponseReady(const std::string& service_url,
+  void OnResponseReady(const GURL& service_url,
                        absl::optional<base::Value> response);
 
   // Profile associated with the Google Photos account that will be queried.
@@ -199,17 +200,16 @@
   // Callbacks for each distinct query this fetcher has been asked to make. A
   // URL's callbacks are called and then removed when the download finishes,
   // successfully or in error.
-  std::map<std::string, std::vector<ClientCallback>> pending_client_callbacks_;
+  std::map<GURL, std::vector<ClientCallback>> pending_client_callbacks_;
 
   // OAuth2 access token fetcher for each distinct query this fetcher has been
   // asked to make. A URL's fetcher exists until its callbacks have been called.
-  std::map<std::string,
-           std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher>>
+  std::map<GURL, std::unique_ptr<signin::PrimaryAccountAccessTokenFetcher>>
       token_fetchers_;
 
   // Used to download the client's desired information from the Google Photos
   // service. A URL's loader exists until its callbacks have been called.
-  std::map<std::string, std::unique_ptr<network::SimpleURLLoader>> url_loaders_;
+  std::map<GURL, std::unique_ptr<network::SimpleURLLoader>> url_loaders_;
 
   base::WeakPtrFactory<GooglePhotosFetcher> weak_factory_{this};
 };
@@ -258,7 +258,7 @@
 
 using GooglePhotosPhotosCbkArgs =
     ash::personalization_app::mojom::FetchGooglePhotosPhotosResponsePtr;
-// Downloads the visible photos in a user's Google Photos library.
+// Downloads visible photos from a user's Google Photos library.
 class GooglePhotosPhotosFetcher
     : public GooglePhotosFetcher<GooglePhotosPhotosCbkArgs> {
  public:
@@ -271,6 +271,7 @@
   ~GooglePhotosPhotosFetcher() override;
 
   virtual void AddRequestAndStartIfNecessary(
+      const absl::optional<std::string>& album_id,
       const absl::optional<std::string>& resume_token,
       base::OnceCallback<void(GooglePhotosPhotosCbkArgs)> callback);
 
diff --git a/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc b/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc
index a2cceec..83198bd3 100644
--- a/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.cc
@@ -5,9 +5,9 @@
 #include "chrome/browser/ash/web_applications/camera_app/camera_system_web_app_info.h"
 
 #include "ash/constants/ash_pref_names.h"
-#include "ash/grit/ash_camera_app_resources.h"
 #include "ash/webui/camera_app_ui/resources/strings/grit/ash_camera_app_strings.h"
 #include "ash/webui/camera_app_ui/url_constants.h"
+#include "ash/webui/grit/ash_camera_app_resources.h"
 #include "chrome/browser/ash/web_applications/camera_app/chrome_camera_app_ui_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
diff --git a/chrome/browser/ash/web_applications/demo_mode_web_app_info.cc b/chrome/browser/ash/web_applications/demo_mode_web_app_info.cc
index a38608ea..941ae050 100644
--- a/chrome/browser/ash/web_applications/demo_mode_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/demo_mode_web_app_info.cc
@@ -5,8 +5,8 @@
 #include "chrome/browser/ash/web_applications/demo_mode_web_app_info.h"
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_demo_mode_app_resources.h"
 #include "ash/webui/demo_mode_app_ui/url_constants.h"
+#include "ash/webui/grit/ash_demo_mode_app_resources.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc b/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc
index c59d19d2..8da3c87 100644
--- a/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/diagnostics_system_web_app_info.cc
@@ -7,8 +7,8 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_diagnostics_app_resources.h"
 #include "ash/webui/diagnostics_ui/url_constants.h"
+#include "ash/webui/grit/ash_diagnostics_app_resources.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/eche_app_info.cc b/chrome/browser/ash/web_applications/eche_app_info.cc
index ed6e70b..802506c 100644
--- a/chrome/browser/ash/web_applications/eche_app_info.cc
+++ b/chrome/browser/ash/web_applications/eche_app_info.cc
@@ -7,8 +7,8 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_eche_bundle_resources.h"
 #include "ash/webui/eche_app_ui/url_constants.h"
+#include "ash/webui/grit/ash_eche_bundle_resources.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
diff --git a/chrome/browser/ash/web_applications/firmware_update_system_web_app_info.cc b/chrome/browser/ash/web_applications/firmware_update_system_web_app_info.cc
index 74dfc36..15c9e5f5 100644
--- a/chrome/browser/ash/web_applications/firmware_update_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/firmware_update_system_web_app_info.cc
@@ -7,9 +7,9 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_firmware_update_app_resources.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/webui/firmware_update_ui/url_constants.h"
+#include "ash/webui/grit/ash_firmware_update_app_resources.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/help_app/help_app_web_app_info.cc b/chrome/browser/ash/web_applications/help_app/help_app_web_app_info.cc
index bdcacc0..8e4290b 100644
--- a/chrome/browser/ash/web_applications/help_app/help_app_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/help_app/help_app_web_app_info.cc
@@ -7,8 +7,8 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_help_app_resources.h"
 #include "ash/style/ash_color_provider.h"
+#include "ash/webui/grit/ash_help_app_resources.h"
 #include "ash/webui/help_app_ui/url_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
diff --git a/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc b/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc
index 274e735..66090da 100644
--- a/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/media_app/media_web_app_info.cc
@@ -9,8 +9,8 @@
 #include <string>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_media_app_resources.h"
 #include "ash/style/ash_color_provider.h"
+#include "ash/webui/grit/ash_media_app_resources.h"
 #include "ash/webui/media_app_ui/url_constants.h"
 #include "base/files/file_path.h"
 #include "base/strings/string_split.h"
diff --git a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc
index 9dcd295d..22badf3 100644
--- a/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/os_feedback_system_web_app_info.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_os_feedback_resources.h"
+#include "ash/webui/grit/ash_os_feedback_resources.h"
 #include "ash/webui/os_feedback_ui/url_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
index beefa0e..a77a4b6 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h"
 
+#include <utility>
 #include "ash/public/cpp/ambient/ambient_prefs.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/prefs/pref_service.h"
@@ -46,6 +47,7 @@
 void PersonalizationAppAmbientProviderImpl::SetAmbientModeEnabled(
     bool enabled) {
   PrefService* pref_service = profile_->GetPrefs();
+  DCHECK(pref_service);
   pref_service->SetBoolean(ash::ambient::prefs::kAmbientModeEnabled, enabled);
 }
 
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
index 7611e47..5a61c895 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl.h
@@ -45,11 +45,10 @@
   mojo::Receiver<ash::personalization_app::mojom::AmbientProvider>
       ambient_receiver_{this};
 
-  // Pointer to profile of user that opened personalization SWA. Not owned.
-  Profile* const profile_ = nullptr;
-
   mojo::Remote<ash::personalization_app::mojom::AmbientObserver>
       ambient_observer_remote_;
+
+  raw_ptr<Profile> const profile_ = nullptr;
 };
 
 #endif  // CHROME_BROWSER_ASH_WEB_APPLICATIONS_PERSONALIZATION_APP_PERSONALIZATION_APP_AMBIENT_PROVIDER_IMPL_H_
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
index 087b66c..1cbfd30 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_ambient_provider_impl_unittest.cc
@@ -99,3 +99,20 @@
   ambient_provider_remote().FlushForTesting();
   EXPECT_TRUE(called);
 }
+
+TEST_F(PersonalizationAppAmbientProviderImplTest, SetAmbientModeEnabled) {
+  PrefService* pref_service = profile()->GetPrefs();
+  EXPECT_TRUE(pref_service);
+  // Clear pref.
+  pref_service->SetBoolean(ash::ambient::prefs::kAmbientModeEnabled, false);
+
+  ambient_provider_remote()->SetAmbientModeEnabled(true);
+  ambient_provider_remote().FlushForTesting();
+  EXPECT_TRUE(
+      pref_service->GetBoolean(ash::ambient::prefs::kAmbientModeEnabled));
+
+  ambient_provider_remote()->SetAmbientModeEnabled(false);
+  ambient_provider_remote().FlushForTesting();
+  EXPECT_FALSE(
+      pref_service->GetBoolean(ash::ambient::prefs::kAmbientModeEnabled));
+}
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_info.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_info.cc
index 9035431..ecf5d285 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_info.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_info.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_personalization_app_resources.h"
+#include "ash/webui/grit/ash_personalization_app_resources.h"
 #include "ash/webui/personalization_app/personalization_app_url_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
index 77a41ce..6b45d29 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
@@ -208,6 +208,7 @@
 }
 
 void PersonalizationAppWallpaperProviderImpl::FetchGooglePhotosPhotos(
+    const absl::optional<std::string>& album_id,
     const absl::optional<std::string>& resume_token,
     FetchGooglePhotosPhotosCallback callback) {
   if (!ash::features::IsWallpaperGooglePhotosIntegrationEnabled()) {
@@ -226,7 +227,7 @@
             profile_);
   }
   google_photos_photos_fetcher_->AddRequestAndStartIfNecessary(
-      resume_token, std::move(callback));
+      album_id, resume_token, std::move(callback));
 }
 
 void PersonalizationAppWallpaperProviderImpl::GetLocalImages(
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
index 4f5708bf..c6c73c0 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
@@ -95,6 +95,7 @@
   void FetchGooglePhotosCount(FetchGooglePhotosCountCallback callback) override;
 
   void FetchGooglePhotosPhotos(
+      const absl::optional<std::string>& album_id,
       const absl::optional<std::string>& resume_token,
       FetchGooglePhotosPhotosCallback callback) override;
 
@@ -227,7 +228,7 @@
   std::unique_ptr<wallpaper_handlers::GooglePhotosCountFetcher>
       google_photos_count_fetcher_;
 
-  // Fetches the visible photos in the user's Google Photos library. Constructed
+  // Fetches visible photos from the user's Google Photos library. Constructed
   // lazily at the time of the first request and then persists for the rest of
   // the delegate's lifetime, unless preemptively or subsequently replaced by a
   // mock in a test.
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
index b0c9452..e3fdbb5 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
@@ -132,8 +132,8 @@
     absl::optional<base::Value>& response) {
   EXPECT_TRUE(response.has_value());
   auto* album_list = response->FindListPath("collection");
-  EXPECT_TRUE(album_list && album_list->GetList().size() == 1);
-  return album_list->GetList().front();
+  EXPECT_TRUE(album_list && album_list->GetListDeprecated().size() == 1);
+  return album_list->GetListDeprecated().front();
 }
 
 // Returns a reference to the photo in a hypothetical Google Photos photos query
@@ -143,8 +143,8 @@
     absl::optional<base::Value>& response) {
   EXPECT_TRUE(response.has_value());
   auto* photo_list = response->FindListPath("item");
-  EXPECT_TRUE(photo_list && photo_list->GetList().size() == 1);
-  return photo_list->GetList().front();
+  EXPECT_TRUE(photo_list && photo_list->GetListDeprecated().size() == 1);
+  return photo_list->GetListDeprecated().front();
 }
 
 class TestWallpaperObserver
@@ -476,14 +476,16 @@
 
   // Simulate the client making multiple requests for the same information to
   // test that all callbacks for that query are called.
+  const std::string album_id = "albumId";
   EXPECT_CALL(*google_photos_photos_fetcher,
-              AddRequestAndStartIfNecessary(absl::make_optional(kResumeToken),
+              AddRequestAndStartIfNecessary(absl::make_optional(album_id),
+                                            absl::make_optional(kResumeToken),
                                             ::testing::_))
       .Times(GooglePhotosEnabled() ? kNumFetches : 0);
 
   for (size_t i = 0; i < kNumFetches; ++i) {
     wallpaper_provider_remote()->get()->FetchGooglePhotosPhotos(
-        kResumeToken,
+        album_id, kResumeToken,
         base::BindLambdaForTesting(
             [this](ash::personalization_app::mojom::
                        FetchGooglePhotosPhotosResponsePtr response) {
diff --git a/chrome/browser/ash/web_applications/print_management_web_app_info.cc b/chrome/browser/ash/web_applications/print_management_web_app_info.cc
index 654ab0a0..1d20e54 100644
--- a/chrome/browser/ash/web_applications/print_management_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/print_management_web_app_info.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/grit/ash_print_management_resources.h"
+#include "ash/webui/grit/ash_print_management_resources.h"
 #include "ash/webui/print_management/url_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/projector_system_web_app_info.cc b/chrome/browser/ash/web_applications/projector_system_web_app_info.cc
index d09385f..c9a543f 100644
--- a/chrome/browser/ash/web_applications/projector_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/projector_system_web_app_info.cc
@@ -6,7 +6,7 @@
 
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_pref_names.h"
-#include "ash/grit/ash_projector_app_trusted_resources.h"
+#include "ash/webui/grit/ash_projector_app_trusted_resources.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/policy/profile_policy_connector.h"
diff --git a/chrome/browser/ash/web_applications/sample_system_web_app_info.cc b/chrome/browser/ash/web_applications/sample_system_web_app_info.cc
index ec5c507..2431ead 100644
--- a/chrome/browser/ash/web_applications/sample_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/sample_system_web_app_info.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/grit/ash_sample_system_web_app_resources.h"
+#include "ash/webui/grit/ash_sample_system_web_app_resources.h"
 #include "ash/webui/sample_system_web_app_ui/url_constants.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
diff --git a/chrome/browser/ash/web_applications/scanning_system_web_app_info.cc b/chrome/browser/ash/web_applications/scanning_system_web_app_info.cc
index e9fef26..d872b28 100644
--- a/chrome/browser/ash/web_applications/scanning_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/scanning_system_web_app_info.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/grit/ash_scanning_app_resources.h"
+#include "ash/webui/grit/ash_scanning_app_resources.h"
 #include "ash/webui/scanning/url_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/shimless_rma_system_web_app_info.cc b/chrome/browser/ash/web_applications/shimless_rma_system_web_app_info.cc
index f673b82..9045f7f 100644
--- a/chrome/browser/ash/web_applications/shimless_rma_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/shimless_rma_system_web_app_info.cc
@@ -7,8 +7,8 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
-#include "ash/grit/ash_shimless_rma_resources.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/webui/grit/ash_shimless_rma_resources.h"
 #include "ash/webui/shimless_rma/url_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/ash/web_applications/shortcut_customization_system_web_app_info.cc b/chrome/browser/ash/web_applications/shortcut_customization_system_web_app_info.cc
index c778fec..3b23eb5 100644
--- a/chrome/browser/ash/web_applications/shortcut_customization_system_web_app_info.cc
+++ b/chrome/browser/ash/web_applications/shortcut_customization_system_web_app_info.cc
@@ -6,8 +6,8 @@
 
 #include <memory>
 
-#include "ash/grit/ash_shortcut_customization_app_resources.h"
 #include "ash/strings/grit/ash_strings.h"
+#include "ash/webui/grit/ash_shortcut_customization_app_resources.h"
 #include "ash/webui/shortcut_customization_ui/url_constants.h"
 #include "chrome/browser/ash/web_applications/system_web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc
index 4f7f381..0276ce3 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -246,7 +246,8 @@
       ConvertUTF16ToJavaString(env,
                                card.CardIdentifierStringForAutofillDisplay()),
       ConvertUTF16ToJavaString(env, card.nickname()),
-      url::GURLAndroid::FromNativeGURL(env, card.card_art_url()));
+      url::GURLAndroid::FromNativeGURL(env, card.card_art_url()),
+      static_cast<jint>(card.virtual_card_enrollment_state()));
 }
 
 // static
@@ -301,6 +302,9 @@
                   env, Java_CreditCard_getBasicCardIssuerNetwork(env, jcard))));
     }
   }
+  card->set_virtual_card_enrollment_state(
+      static_cast<CreditCard::VirtualCardEnrollmentState>(
+          Java_CreditCard_getVirtualCardEnrollmentState(env, jcard)));
 }
 
 // static
diff --git a/chrome/browser/autofill/autofill_gstatic_reader.cc b/chrome/browser/autofill/autofill_gstatic_reader.cc
index 31f6ccd80..dd4a198 100644
--- a/chrome/browser/autofill/autofill_gstatic_reader.cc
+++ b/chrome/browser/autofill/autofill_gstatic_reader.cc
@@ -150,7 +150,7 @@
   if (!raw_result || !raw_result->is_list())
     return {};
   std::vector<std::string> result;
-  for (const base::Value& value : raw_result->GetList()) {
+  for (const base::Value& value : raw_result->GetListDeprecated()) {
     if (value.is_string())
       result.push_back(value.GetString());
   }
diff --git a/chrome/browser/autofill/automated_tests/cache_replayer.cc b/chrome/browser/autofill/automated_tests/cache_replayer.cc
index 2b19062..0fd8e09 100644
--- a/chrome/browser/autofill/automated_tests/cache_replayer.cc
+++ b/chrome/browser/autofill/automated_tests/cache_replayer.cc
@@ -495,7 +495,7 @@
     ServerCache* cache_to_fill) {
   bool fail_on_error = FailOnError(options);
   bool split_requests_by_form = SplitRequestsByForm(options);
-  for (const base::Value& request : query_node.node->GetList()) {
+  for (const base::Value& request : query_node.node->GetListDeprecated()) {
     // Get AutofillQueryContents from request.
     bool is_post_request = GetRequestTypeFromURL<ReadEnv>(query_node.url) ==
                            RequestType::kQueryProtoPOST;
diff --git a/chrome/browser/autofill/captured_sites_test_utils.cc b/chrome/browser/autofill/captured_sites_test_utils.cc
index 6f99bb6..20a8917 100644
--- a/chrome/browser/autofill/captured_sites_test_utils.cc
+++ b/chrome/browser/autofill/captured_sites_test_utils.cc
@@ -335,7 +335,7 @@
   }
 
   bool also_run_disabled = testing::FLAGS_gtest_also_run_disabled_tests == 1;
-  for (auto& item : list_node->GetList()) {
+  for (auto& item : list_node->GetListDeprecated()) {
     if (!item.is_dict())
       continue;
     CapturedSiteParams param;
@@ -1837,7 +1837,7 @@
     ADD_FAILURE() << "The action's iframe path is not a list!";
     return false;
   }
-  for (const auto& xpath : iframe_path_container->GetList()) {
+  for (const auto& xpath : iframe_path_container->GetListDeprecated()) {
     if (!xpath.is_string()) {
       ADD_FAILURE() << "Failed to extract the iframe xpath from action!";
       return false;
diff --git a/chrome/browser/bookmarks/bookmark_html_writer.cc b/chrome/browser/bookmarks/bookmark_html_writer.cc
index e127d58..2cb28e6 100644
--- a/chrome/browser/bookmarks/bookmark_html_writer.cc
+++ b/chrome/browser/bookmarks/bookmark_html_writer.cc
@@ -399,7 +399,7 @@
     }
 
     // Write the children.
-    for (const base::Value& child_value : child_values->GetList()) {
+    for (const base::Value& child_value : child_values->GetListDeprecated()) {
       if (!child_value.is_dict()) {
         NOTREACHED();
         return false;
diff --git a/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc b/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc
index d5aa80b..3e968b7 100644
--- a/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc
+++ b/chrome/browser/bookmarks/managed_bookmark_service_unittest.cc
@@ -154,13 +154,14 @@
     if (node->is_folder()) {
       const base::ListValue* children = nullptr;
       if (!dict->GetList("children", &children) ||
-          node->children().size() != children->GetList().size()) {
+          node->children().size() != children->GetListDeprecated().size()) {
         return false;
       }
       size_t i = 0;
       return std::all_of(node->children().cbegin(), node->children().cend(),
                          [children, &i](const auto& child_node) {
-                           const base::Value& child = children->GetList()[i++];
+                           const base::Value& child =
+                               children->GetListDeprecated()[i++];
                            if (!child.is_dict())
                              return false;
                            return NodeMatchesValue(
@@ -196,7 +197,7 @@
 TEST_F(ManagedBookmarkServiceTest, SwapNodes) {
   // Swap the Google bookmark with the Folder.
   std::unique_ptr<base::ListValue> updated(CreateTestTree());
-  base::Value::ListView updated_listview = updated->GetList();
+  base::Value::ListView updated_listview = updated->GetListDeprecated();
   ASSERT_FALSE(updated_listview.empty());
   base::Value removed = std::move(updated_listview[0]);
   ASSERT_TRUE(updated->EraseListIter(updated_listview.begin()));
@@ -218,7 +219,7 @@
 TEST_F(ManagedBookmarkServiceTest, RemoveNode) {
   // Remove the Folder.
   std::unique_ptr<base::ListValue> updated(CreateTestTree());
-  ASSERT_TRUE(updated->EraseListIter(updated->GetList().begin() + 1));
+  ASSERT_TRUE(updated->EraseListIter(updated->GetListDeprecated().begin() + 1));
 
   const BookmarkNode* parent = managed_->managed_node();
   EXPECT_CALL(observer_, BookmarkNodeRemoved(model_.get(), parent, 1, _, _));
diff --git a/chrome/browser/browser_switcher/browser_switcher_prefs.cc b/chrome/browser/browser_switcher/browser_switcher_prefs.cc
index 71a7fc16..7eb24192 100644
--- a/chrome/browser/browser_switcher/browser_switcher_prefs.cc
+++ b/chrome/browser/browser_switcher/browser_switcher_prefs.cc
@@ -35,7 +35,7 @@
   std::vector<std::string> list;
   if (pref_name.empty())
     return list;
-  for (const auto& value : prefs->GetList(pref_name)->GetList())
+  for (const auto& value : prefs->GetList(pref_name)->GetListDeprecated())
     list.push_back(value.GetString());
   return list;
 }
@@ -330,7 +330,7 @@
     return;
   const base::Value* params =
       prefs_->GetList(prefs::kAlternativeBrowserParameters);
-  for (const auto& param : params->GetList()) {
+  for (const auto& param : params->GetListDeprecated()) {
     std::string param_string = param.GetString();
     alt_browser_params_.push_back(param_string);
   }
@@ -363,10 +363,11 @@
 
   UMA_HISTOGRAM_COUNTS_100000(
       "BrowserSwitcher.UrlListSize",
-      prefs_->GetList(prefs::kUrlList)->GetList().size());
+      prefs_->GetList(prefs::kUrlList)->GetListDeprecated().size());
 
   bool has_wildcard = false;
-  for (const auto& url : prefs_->GetList(prefs::kUrlList)->GetList()) {
+  for (const auto& url :
+       prefs_->GetList(prefs::kUrlList)->GetListDeprecated()) {
     std::unique_ptr<Rule> rule =
         CanonicalizeRule(url.GetString(), parsing_mode_);
     if (rule)
@@ -387,10 +388,11 @@
 
   UMA_HISTOGRAM_COUNTS_100000(
       "BrowserSwitcher.GreylistSize",
-      prefs_->GetList(prefs::kUrlGreylist)->GetList().size());
+      prefs_->GetList(prefs::kUrlGreylist)->GetListDeprecated().size());
 
   bool has_wildcard = false;
-  for (const auto& url : prefs_->GetList(prefs::kUrlGreylist)->GetList()) {
+  for (const auto& url :
+       prefs_->GetList(prefs::kUrlGreylist)->GetListDeprecated()) {
     std::unique_ptr<Rule> rule =
         CanonicalizeRule(url.GetString(), parsing_mode_);
     if (rule)
@@ -421,7 +423,7 @@
   if (!prefs_->IsManagedPreference(prefs::kChromeParameters))
     return;
   const base::Value* params = prefs_->GetList(prefs::kChromeParameters);
-  for (const auto& param : params->GetList()) {
+  for (const auto& param : params->GetListDeprecated()) {
     std::string param_string = param.GetString();
     chrome_params_.push_back(param_string);
   }
diff --git a/chrome/browser/browser_switcher/ieem_sitelist_parser.cc b/chrome/browser/browser_switcher/ieem_sitelist_parser.cc
index 5359d97..88ececf4 100644
--- a/chrome/browser/browser_switcher/ieem_sitelist_parser.cc
+++ b/chrome/browser/browser_switcher/ieem_sitelist_parser.cc
@@ -81,7 +81,7 @@
 
   DCHECK(data_decoder::IsXmlElementNamed(xml, kSchema1RulesElement));
   for (const base::Value& node :
-       data_decoder::GetXmlElementChildren(xml)->GetList()) {
+       data_decoder::GetXmlElementChildren(xml)->GetListDeprecated()) {
     // Skip over anything that is not a <emie> or <docMode> element.
     if (!data_decoder::IsXmlElementNamed(node, kSchema1EmieElement) &&
         !data_decoder::IsXmlElementNamed(node, kSchema1DocModeElement)) {
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_lifetime_manager.cc b/chrome/browser/browsing_data/chrome_browsing_data_lifetime_manager.cc
index 4651554..b4db2cd0 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_lifetime_manager.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_lifetime_manager.cc
@@ -204,7 +204,7 @@
   std::vector<ScheduledRemovalSettings> scheduled_removals_settings;
   if (!browsing_data_settings)
     return scheduled_removals_settings;
-  for (const auto& setting : browsing_data_settings->GetList()) {
+  for (const auto& setting : browsing_data_settings->GetListDeprecated()) {
     const auto* data_types =
         setting.FindListKey(browsing_data::policy_fields::kDataTypes);
     const auto time_to_live_in_hours =
@@ -295,7 +295,7 @@
     bool keep_browser_alive) {
   auto* data_types = profile_->GetPrefs()->GetList(
       browsing_data::prefs::kClearBrowsingDataOnExitList);
-  if (data_types && !data_types->GetList().empty() &&
+  if (data_types && !data_types->GetListDeprecated().empty() &&
       !SyncServiceFactory::IsSyncAllowed(profile_)) {
     profile_->GetPrefs()->SetBoolean(
         browsing_data::prefs::kClearBrowsingDataOnExitDeletionPending, true);
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
index f8ccf1f..c4ac45f 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -1549,7 +1549,7 @@
   prefs->Set(site_isolation::prefs::kUserTriggeredIsolatedOrigins, list);
   EXPECT_FALSE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   base::Value dict(base::Value::Type::DICTIONARY);
   dict.SetKey("https://bar.com", base::TimeToValue(base::Time::Now()));
@@ -1563,7 +1563,7 @@
                                 constants::DATA_TYPE_HISTORY, false);
   EXPECT_TRUE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   EXPECT_TRUE(
       prefs->GetDictionary(site_isolation::prefs::kWebTriggeredIsolatedOrigins)
@@ -1573,7 +1573,7 @@
   prefs->Set(site_isolation::prefs::kUserTriggeredIsolatedOrigins, list);
   EXPECT_FALSE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   prefs->Set(site_isolation::prefs::kWebTriggeredIsolatedOrigins, dict);
   EXPECT_FALSE(
@@ -1587,7 +1587,7 @@
                                 constants::DATA_TYPE_SITE_DATA, false);
   EXPECT_TRUE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   EXPECT_TRUE(
       prefs->GetDictionary(site_isolation::prefs::kWebTriggeredIsolatedOrigins)
@@ -1597,7 +1597,7 @@
   prefs->Set(site_isolation::prefs::kUserTriggeredIsolatedOrigins, list);
   EXPECT_FALSE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   prefs->Set(site_isolation::prefs::kWebTriggeredIsolatedOrigins, dict);
   EXPECT_FALSE(
@@ -1609,7 +1609,7 @@
                                 constants::DATA_TYPE_ISOLATED_ORIGINS, false);
   EXPECT_TRUE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   EXPECT_TRUE(
       prefs->GetDictionary(site_isolation::prefs::kWebTriggeredIsolatedOrigins)
@@ -1619,7 +1619,7 @@
   prefs->Set(site_isolation::prefs::kUserTriggeredIsolatedOrigins, list);
   EXPECT_FALSE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   prefs->Set(site_isolation::prefs::kWebTriggeredIsolatedOrigins, dict);
   EXPECT_FALSE(
@@ -1633,7 +1633,7 @@
       constants::DATA_TYPE_HISTORY | constants::DATA_TYPE_SITE_DATA, false);
   EXPECT_TRUE(
       prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins)
-          ->GetList()
+          ->GetListDeprecated()
           .empty());
   EXPECT_TRUE(
       prefs->GetDictionary(site_isolation::prefs::kWebTriggeredIsolatedOrigins)
@@ -3160,7 +3160,7 @@
 
   EXPECT_EQ(3u, prefs->GetDictionary(kPermissionActionsPrefPath)
                     ->FindKey("notifications")
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   // Remove the first and the second element.
   BlockUntilBrowsingDataRemoved(first_recorded_time, third_recorded_time,
@@ -3168,11 +3168,11 @@
   // There is only one element left.
   EXPECT_EQ(1u, prefs->GetDictionary(kPermissionActionsPrefPath)
                     ->FindKey("notifications")
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   EXPECT_EQ((base::ValueToTime(prefs->GetDictionary(kPermissionActionsPrefPath)
                                    ->FindKey("notifications")
-                                   ->GetList()
+                                   ->GetListDeprecated()
                                    .begin()
                                    ->FindKey("time")))
                 .value_or(base::Time()),
diff --git a/chrome/browser/cart/cart_discount_fetcher.cc b/chrome/browser/cart/cart_discount_fetcher.cc
index 505b5322..a804032 100644
--- a/chrome/browser/cart/cart_discount_fetcher.cc
+++ b/chrome/browser/cart/cart_discount_fetcher.cc
@@ -131,11 +131,11 @@
                             0 /*highest_percent_off*/);
   }
 
-  cart_discounts.reserve(rule_discount_list->GetList().size());
+  cart_discounts.reserve(rule_discount_list->GetListDeprecated().size());
 
   int highest_percent_off = 0;
   int64_t highest_amount_off = 0;
-  for (const auto& rule_discount : rule_discount_list->GetList()) {
+  for (const auto& rule_discount : rule_discount_list->GetListDeprecated()) {
     cart_db::RuleDiscountInfoProto discount_proto;
 
     // Parse ruleId
@@ -257,9 +257,10 @@
     return CouponDiscountInfo({});
   }
 
-  coupons.reserve(coupon_discount_list->GetList().size());
+  coupons.reserve(coupon_discount_list->GetListDeprecated().size());
 
-  for (const auto& coupon_discount : coupon_discount_list->GetList()) {
+  for (const auto& coupon_discount :
+       coupon_discount_list->GetListDeprecated()) {
     coupon_db::FreeListingCouponInfoProto coupon_info_proto;
 
     // Parse type
@@ -516,7 +517,7 @@
     return;
   }
 
-  for (const auto& merchant_discount : discounts_list->GetList()) {
+  for (const auto& merchant_discount : discounts_list->GetListDeprecated()) {
     // Parse merchant_identifier.
     const base::Value* merchant_identifier =
         merchant_discount.FindKey("merchantIdentifier");
diff --git a/chrome/browser/cart/cart_service.cc b/chrome/browser/cart/cart_service.cc
index 5e633ff..96f3d71d 100644
--- a/chrome/browser/cart/cart_service.cc
+++ b/chrome/browser/cart/cart_service.cc
@@ -986,7 +986,8 @@
 
 bool CartService::IsCartAndDiscountEnabled() {
   auto* list = profile_->GetPrefs()->GetList(prefs::kNtpDisabledModules);
-  if (list && base::Contains(list->GetList(), base::Value(kCartPrefsKey))) {
+  if (list &&
+      base::Contains(list->GetListDeprecated(), base::Value(kCartPrefsKey))) {
     return false;
   }
   return profile_->GetPrefs()->GetBoolean(prefs::kCartDiscountEnabled) &&
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index fcbfd13..66e7a1f 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -102,7 +102,8 @@
 #include "chrome/browser/ui/webui/connectors_internals/connectors_internals_ui.h"
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 #include "chrome/browser/ui/webui/app_settings/web_app_settings_ui.h"
 #include "ui/webui/resources/cr_components/app_management/app_management.mojom.h"
 #endif
@@ -717,7 +718,8 @@
       enterprise_connectors::ConnectorsInternalsUI>(map);
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
   RegisterWebUIControllerInterfaceBinder<
       app_management::mojom::PageHandlerFactory, WebAppSettingsUI>(map);
 #endif
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 7e6ca1cb..c6ff58e 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -663,7 +663,8 @@
         embedder_support::prefs::kOriginTrialDisabledFeatures);
     if (override_disabled_feature_list) {
       std::vector<base::StringPiece> disabled_features;
-      for (const auto& item : override_disabled_feature_list->GetList()) {
+      for (const auto& item :
+           override_disabled_feature_list->GetListDeprecated()) {
         if (item.is_string())
           disabled_features.push_back(item.GetString());
       }
@@ -682,7 +683,7 @@
         embedder_support::prefs::kOriginTrialDisabledTokens);
     if (disabled_token_list) {
       std::vector<base::StringPiece> disabled_tokens;
-      for (const auto& item : disabled_token_list->GetList()) {
+      for (const auto& item : disabled_token_list->GetListDeprecated()) {
         if (item.is_string())
           disabled_tokens.push_back(item.GetString());
       }
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 468913f..5b8ddd9 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -148,6 +148,7 @@
 #include "chrome/browser/web_applications/policy/web_app_policy_manager.h"
 #include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
+#include "chrome/browser/web_applications/web_app_offline.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "chrome/common/buildflags.h"
@@ -675,7 +676,8 @@
     return false;
 
   base::Value::ConstListView allow_list_urls =
-      prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)->GetList();
+      prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
+          ->GetListDeprecated();
   if (allow_list_urls.empty())
     return false;
 
@@ -819,7 +821,8 @@
       prefs->GetList(prefs::kAutoplayAllowlist);
   return autoplay_allowlist &&
          prefs->IsManagedPreference(prefs::kAutoplayAllowlist) &&
-         IsURLAllowlisted(contents->GetURL(), autoplay_allowlist->GetList());
+         IsURLAllowlisted(contents->GetURL(),
+                          autoplay_allowlist->GetListDeprecated());
 }
 #endif
 
@@ -5841,8 +5844,8 @@
 std::string ChromeContentBrowserClient::GetUserAgentBasedOnPolicy(
     content::BrowserContext* context) {
   embedder_support::ForceMajorVersionToMinorPosition
-      force_major_version_to_minor =
-          GetForceMajorVersionToMinorPosition(context);
+      force_major_version_to_minor = embedder_support::GetMajorToMinorFromPrefs(
+          Profile::FromBrowserContext(context)->GetPrefs());
   switch (GetUserAgentReductionEnterprisePolicyState(context)) {
     case UserAgentReductionEnterprisePolicyState::kForceDisabled:
       return embedder_support::GetFullUserAgent(force_major_version_to_minor);
@@ -6422,22 +6425,6 @@
   return UserAgentReductionEnterprisePolicyState::kDefault;
 }
 
-embedder_support::ForceMajorVersionToMinorPosition
-ChromeContentBrowserClient::GetForceMajorVersionToMinorPosition(
-    content::BrowserContext* context) {
-  int policy = Profile::FromBrowserContext(context)->GetPrefs()->GetInteger(
-      prefs::kForceMajorVersionToMinorPositionInUserAgent);
-  switch (policy) {
-    case 0:
-      return embedder_support::ForceMajorVersionToMinorPosition::kDefault;
-    case 1:
-      return embedder_support::ForceMajorVersionToMinorPosition::kForceDisabled;
-    case 2:
-      return embedder_support::ForceMajorVersionToMinorPosition::kForceEnabled;
-  }
-  return embedder_support::ForceMajorVersionToMinorPosition::kDefault;
-}
-
 bool ChromeContentBrowserClient::ShouldDisableOriginAgentClusterDefault(
     content::BrowserContext* browser_context) {
   // The enterprise policy for kOriginAgentClusterDefaultEnabled defaults to
@@ -6456,14 +6443,11 @@
 content::mojom::AlternativeErrorPageOverrideInfoPtr
 ChromeContentBrowserClient::GetAlternativeErrorPageOverrideInfo(
     const GURL& url,
-    content::BrowserContext* browser_context) {
+    content::BrowserContext* browser_context,
+    int32_t error_code) {
 #if BUILDFLAG(IS_ANDROID)
   return nullptr;
 #else
-  if (!base::FeatureList::IsEnabled(features::kDesktopPWAsDefaultOfflinePage)) {
-    return nullptr;
-  }
-
-  return web_app::GetAppManifestInfo(url, browser_context);
+  return web_app::GetOfflinePageInfo(url, browser_context, error_code);
 #endif  //  BUILDFLAG(IS_ANDROID)
 }
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 1ab9dad..2ccd15d 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -778,9 +778,9 @@
       content::BrowserContext* browser_context) override;
 
   content::mojom::AlternativeErrorPageOverrideInfoPtr
-  GetAlternativeErrorPageOverrideInfo(
-      const GURL& url,
-      content::BrowserContext* browser_context) override;
+  GetAlternativeErrorPageOverrideInfo(const GURL& url,
+                                      content::BrowserContext* browser_context,
+                                      int32_t error_code) override;
 
  protected:
   static bool HandleWebUI(GURL* url, content::BrowserContext* browser_context);
diff --git a/chrome/browser/chrome_navigation_browsertest.cc b/chrome/browser/chrome_navigation_browsertest.cc
index a6e381a..ed7c483 100644
--- a/chrome/browser/chrome_navigation_browsertest.cc
+++ b/chrome/browser/chrome_navigation_browsertest.cc
@@ -1952,7 +1952,7 @@
     auto* list =
         prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins);
     std::vector<std::string> sites;
-    for (const base::Value& value : list->GetList())
+    for (const base::Value& value : list->GetListDeprecated())
       sites.push_back(value.GetString());
     return sites;
   }
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index eb4824b..c9be2a12 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -911,8 +911,6 @@
     "../ash/arc/instance_throttle/arc_provisioning_throttle_observer.h",
     "../ash/arc/instance_throttle/arc_switch_throttle_observer.cc",
     "../ash/arc/instance_throttle/arc_switch_throttle_observer.h",
-    "../ash/arc/intent_helper/arc_external_protocol_dialog.cc",
-    "../ash/arc/intent_helper/arc_external_protocol_dialog.h",
     "../ash/arc/intent_helper/arc_intent_helper_mojo_ash.cc",
     "../ash/arc/intent_helper/arc_intent_helper_mojo_ash.h",
     "../ash/arc/intent_helper/arc_settings_service.cc",
@@ -3314,8 +3312,6 @@
     "app_mode/kiosk_session_plugin_handler_delegate.h",
     "app_mode/kiosk_settings_navigation_throttle.cc",
     "app_mode/kiosk_settings_navigation_throttle.h",
-    "arc/arc_web_contents_data.cc",
-    "arc/arc_web_contents_data.h",
     "arc/icon_decode_request.cc",
     "arc/icon_decode_request.h",
     "extensions/active_tab_permission_granter_delegate_chromeos.cc",
@@ -4017,7 +4013,6 @@
     "../ash/arc/instance_throttle/arc_power_throttle_observer_unittest.cc",
     "../ash/arc/instance_throttle/arc_provisioning_throttle_observer_unittest.cc",
     "../ash/arc/instance_throttle/arc_switch_throttle_observer_unittest.cc",
-    "../ash/arc/intent_helper/arc_external_protocol_dialog_unittest.cc",
     "../ash/arc/intent_helper/arc_settings_service_unittest.cc",
     "../ash/arc/kiosk/arc_kiosk_bridge_unittest.cc",
     "../ash/arc/nearby_share/arc_nearby_share_bridge_unittest.cc",
diff --git a/chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.cc b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
similarity index 98%
rename from chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.cc
rename to chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
index 7c3542a..2b718dc 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.cc
+++ b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.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 "chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h"
+#include "chrome/browser/chromeos/arc/arc_external_protocol_dialog.h"
 
 #include <map>
 
 #include "base/bind.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_functions.h"
+#include "build/chromeos_buildflags.h"
 #include "chrome/app/vector_icons/vector_icons.h"
-#include "chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h"
 #include "chrome/browser/apps/intent_helper/page_transition_util.h"
 #include "chrome/browser/chromeos/arc/arc_web_contents_data.h"
 #include "chrome/browser/sharing/click_to_call/click_to_call_metrics.h"
@@ -35,6 +35,10 @@
 #include "ui/gfx/paint_vector_icon.h"
 #include "url/gurl.h"
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+#include "chrome/browser/apps/intent_helper/metrics/intent_handling_metrics.h"
+#endif
+
 using content::WebContents;
 
 namespace arc {
@@ -492,7 +496,9 @@
   // blocking fashion.
   WebContents* web_contents =
       tab_util::GetWebContentsByID(render_process_host_id, routing_id);
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   auto* context = web_contents ? web_contents->GetBrowserContext() : nullptr;
+#endif
 
   if (web_contents) {
     if (intent_picker_type == apps::IntentPickerBubbleType::kClickToCall) {
@@ -507,12 +513,14 @@
     DCHECK_EQ(apps::IntentPickerCloseReason::OPEN_APP, reason);
     DCHECK(!should_persist);
     HandleDeviceSelection(web_contents, devices, selected_app_package, url);
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     apps::IntentHandlingMetrics::RecordExternalProtocolMetrics(
         Scheme::TEL, entry_type, /*accepted=*/true, should_persist);
     if (context) {
       apps::IntentHandlingMetrics::RecordExternalProtocolUserInteractionMetrics(
           context, entry_type, reason, should_persist);
     }
+#endif
     return;
   }
 
@@ -573,6 +581,7 @@
       break;
   }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
   const std::map<base::StringPiece, Scheme> string_to_scheme = {
       {"bitcoin", Scheme::BITCOIN}, {"geo", Scheme::GEO},
       {"im", Scheme::IM},           {"irc", Scheme::IRC},
@@ -591,6 +600,7 @@
   auto scheme_it = string_to_scheme.find(scheme);
   if (scheme_it != string_to_scheme.end())
     url_scheme = scheme_it->second;
+  // TODO(crbug.com/1275075): Support ARC metrics in Lacros.
   apps::IntentHandlingMetrics::RecordExternalProtocolMetrics(
       url_scheme, entry_type, protocol_accepted, should_persist);
 
@@ -598,6 +608,7 @@
     apps::IntentHandlingMetrics::RecordExternalProtocolUserInteractionMetrics(
         context, entry_type, reason, should_persist);
   }
+#endif
 }
 
 // Called when ARC returned activity icons for the |handlers|.
@@ -699,6 +710,7 @@
   if (HandleUrl(render_process_host_id, routing_id, url, handlers,
                 handlers.size(), &result, safe_to_bypass_ui,
                 mojo_delegate.get())) {
+#if BUILDFLAG(IS_CHROMEOS_ASH)
     WebContents* web_contents =
         tab_util::GetWebContentsByID(render_process_host_id, routing_id);
     auto* context = web_contents ? web_contents->GetBrowserContext() : nullptr;
@@ -709,6 +721,7 @@
           apps::IntentPickerCloseReason::PREFERRED_APP_FOUND,
           /*should_persist=*/false);
     }
+#endif
     return std::move(handled_cb).Run(/*handled=*/true);
   }
 
diff --git a/chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.h
similarity index 95%
rename from chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h
rename to chrome/browser/chromeos/arc/arc_external_protocol_dialog.h
index 7a6b214..7f6cc030 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h
+++ b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_ASH_ARC_INTENT_HELPER_ARC_EXTERNAL_PROTOCOL_DIALOG_H_
-#define CHROME_BROWSER_ASH_ARC_INTENT_HELPER_ARC_EXTERNAL_PROTOCOL_DIALOG_H_
+#ifndef CHROME_BROWSER_CHROMEOS_ARC_ARC_EXTERNAL_PROTOCOL_DIALOG_H_
+#define CHROME_BROWSER_CHROMEOS_ARC_ARC_EXTERNAL_PROTOCOL_DIALOG_H_
 
 #include <memory>
 #include <string>
@@ -174,4 +174,4 @@
 
 }  // namespace arc
 
-#endif  // CHROME_BROWSER_ASH_ARC_INTENT_HELPER_ARC_EXTERNAL_PROTOCOL_DIALOG_H_
+#endif  // CHROME_BROWSER_CHROMEOS_ARC_ARC_EXTERNAL_PROTOCOL_DIALOG_H_
diff --git a/chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog_unittest.cc b/chrome/browser/chromeos/arc/arc_external_protocol_dialog_unittest.cc
similarity index 99%
rename from chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog_unittest.cc
rename to chrome/browser/chromeos/arc/arc_external_protocol_dialog_unittest.cc
index 5b5ed00c..5968554 100644
--- a/chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog_unittest.cc
+++ b/chrome/browser/chromeos/arc/arc_external_protocol_dialog_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 "chrome/browser/ash/arc/intent_helper/arc_external_protocol_dialog.h"
+#include "chrome/browser/chromeos/arc/arc_external_protocol_dialog.h"
 
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/arc/arc_web_contents_data.h"
diff --git a/chrome/browser/chromeos/arc/start_smart_selection_action_menu.cc b/chrome/browser/chromeos/arc/start_smart_selection_action_menu.cc
index 445a462..2740c1d 100644
--- a/chrome/browser/chromeos/arc/start_smart_selection_action_menu.cc
+++ b/chrome/browser/chromeos/arc/start_smart_selection_action_menu.cc
@@ -133,6 +133,16 @@
     std::vector<ArcIntentHelperMojoDelegate::TextSelectionAction> actions) {
   actions_ = std::move(actions);
 
+  // If there is no item to add to menu, the following steps can be skipped.
+  //
+  // This condition is for avoiding accessing to null menu.
+  // Menu might be null when RequestTextSelectionActions runs synchronously and
+  // menu is not yet created. This might happen when RequestTextSelectionActions
+  // API is not sent via mojo, and it can be detected by checking if the result
+  // given by RequestTextSelectionActions is empty.
+  if (actions_.empty())
+    return;
+
   for (size_t i = 0; i < actions_.size(); ++i) {
     proxy_->UpdateMenuItem(
         IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION1 + i,
diff --git a/chrome/browser/chromeos/extensions/default_app_order.cc b/chrome/browser/chromeos/extensions/default_app_order.cc
index 07e3f19..b0bc8ba 100644
--- a/chrome/browser/chromeos/extensions/default_app_order.cc
+++ b/chrome/browser/chromeos/extensions/default_app_order.cc
@@ -232,7 +232,7 @@
       ReadExternalOrdinalFile(ordinals_file);
   if (ordinals_value) {
     std::string locale = g_browser_process->GetApplicationLocale();
-    for (const base::Value& i : ordinals_value->GetList()) {
+    for (const base::Value& i : ordinals_value->GetListDeprecated()) {
       const base::DictionaryValue* dict = nullptr;
       if (i.is_string()) {
         std::string app_id = i.GetString();
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
index cb880ab7..f93af93 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -733,7 +733,7 @@
   }
 
   auto results_list = std::make_unique<base::ListValue>();
-  for (auto& entry : results->GetList()) {
+  for (auto& entry : results->GetListDeprecated()) {
     base::DictionaryValue dict;
     std::string highlight;
     base::Value* value = entry.FindKey("fileFullPath");
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
index 23299afc..15f58dea 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -253,7 +253,8 @@
       service->GetBoolean(arc::prefs::kArcHasAccessToRemovableMedia);
   std::vector<std::string> folder_shortcuts;
   const auto& value_list =
-      service->GetList(ash::prefs::kFilesAppFolderShortcuts)->GetList();
+      service->GetList(ash::prefs::kFilesAppFolderShortcuts)
+          ->GetListDeprecated();
   for (const base::Value& value : value_list) {
     folder_shortcuts.push_back(value.is_string() ? value.GetString() : "");
   }
diff --git a/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc b/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc
index 53449b4..9202fa2 100644
--- a/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc
@@ -529,7 +529,7 @@
   }
   base::Value::ListView event_arguments;
 
-  event_arguments = event.event_args->GetList();
+  event_arguments = event.event_args->GetListDeprecated();
   if (event_arguments.size() < 1) {
     return;
   }
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc
index 0662d534..b2edf7f 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc
@@ -109,7 +109,7 @@
   const base::Value* exempt_list = profile_->GetPrefs()->GetList(
       prefs::kRestrictedManagedGuestSessionExtensionCleanupExemptList);
 
-  for (const base::Value& value : exempt_list->GetList()) {
+  for (const base::Value& value : exempt_list->GetListDeprecated()) {
     exempt_extensions.insert(value.GetString());
   }
   return exempt_extensions;
diff --git a/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_unittest.cc b/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_unittest.cc
index 571ec92..a8d8272 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_unittest.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login_state/session_state_changed_event_dispatcher_ash_unittest.cc
@@ -62,8 +62,9 @@
 
   const extensions::Event& event = *iter->second;
   CHECK(event.event_args);
-  CHECK_EQ(1u, event.event_args->GetList().size());
-  std::string session_state = (event.event_args->GetList())[0].GetString();
+  CHECK_EQ(1u, event.event_args->GetListDeprecated().size());
+  std::string session_state =
+      (event.event_args->GetListDeprecated())[0].GetString();
   return extensions::api::login_state::ParseSessionState(session_state) ==
          expected_state;
 }
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc
index b129094..b5b03c5 100644
--- a/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc
+++ b/chrome/browser/chromeos/extensions/printing_metrics/print_job_finished_event_dispatcher_unittest.cc
@@ -36,13 +36,13 @@
 
   const extensions::Event& event = *iter->second;
   if (!event.event_args || !event.event_args->is_list() ||
-      event.event_args->GetList().size() != 1u) {
+      event.event_args->GetListDeprecated().size() != 1u) {
     ADD_FAILURE() << "Invalid event args";
     return nullptr;
   }
 
   return extensions::api::printing_metrics::PrintJobInfo::FromValue(
-      event.event_args->GetList()[0]);
+      event.event_args->GetListDeprecated()[0]);
 }
 
 // Creates a new MockPrintJobHistoryService for the given |context|.
diff --git a/chrome/browser/chromeos/extensions/printing_metrics/printing_metrics_api_unittest.cc b/chrome/browser/chromeos/extensions/printing_metrics/printing_metrics_api_unittest.cc
index a421ec5..41c34b3 100644
--- a/chrome/browser/chromeos/extensions/printing_metrics/printing_metrics_api_unittest.cc
+++ b/chrome/browser/chromeos/extensions/printing_metrics/printing_metrics_api_unittest.cc
@@ -108,7 +108,7 @@
 
   ASSERT_TRUE(result);
   ASSERT_TRUE(result->is_list());
-  EXPECT_TRUE(result->GetList().empty());
+  EXPECT_TRUE(result->GetListDeprecated().empty());
 }
 
 // Test that calling |printingMetrics.getPrintJobs()| returns the mock print
@@ -122,9 +122,10 @@
 
   ASSERT_TRUE(result);
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1u, result->GetList().size());
+  ASSERT_EQ(1u, result->GetListDeprecated().size());
   std::unique_ptr<api::printing_metrics::PrintJobInfo> print_job_info =
-      api::printing_metrics::PrintJobInfo::FromValue(result->GetList()[0]);
+      api::printing_metrics::PrintJobInfo::FromValue(
+          result->GetListDeprecated()[0]);
   EXPECT_TRUE(print_job_info);
   EXPECT_EQ(kTitle1, print_job_info->title);
   EXPECT_EQ(api::printing_metrics::PRINT_JOB_STATUS_FAILED,
@@ -143,13 +144,15 @@
 
   ASSERT_TRUE(result);
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(2u, result->GetList().size());
+  ASSERT_EQ(2u, result->GetListDeprecated().size());
   std::unique_ptr<api::printing_metrics::PrintJobInfo> print_job_info1 =
-      api::printing_metrics::PrintJobInfo::FromValue(result->GetList()[0]);
+      api::printing_metrics::PrintJobInfo::FromValue(
+          result->GetListDeprecated()[0]);
   EXPECT_TRUE(print_job_info1);
   EXPECT_EQ(kTitle1, print_job_info1->title);
   std::unique_ptr<api::printing_metrics::PrintJobInfo> print_job_info2 =
-      api::printing_metrics::PrintJobInfo::FromValue(result->GetList()[1]);
+      api::printing_metrics::PrintJobInfo::FromValue(
+          result->GetListDeprecated()[1]);
   EXPECT_TRUE(print_job_info2);
   EXPECT_EQ(kTitle2, print_job_info2->title);
 }
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
index 088944b6..38cced5 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
@@ -268,11 +268,6 @@
   }
 }
 
-void DlpContentManager::SetIsScreenShareWarningModeEnabledForTesting(
-    bool is_enabled) {
-  is_screen_share_warning_mode_enabled_ = is_enabled;
-}
-
 DlpContentManager::DlpContentManager() = default;
 DlpContentManager::~DlpContentManager() = default;
 
@@ -378,7 +373,7 @@
     std::move(callback).Run(false);
     return;
   }
-  if (is_screen_share_warning_mode_enabled_ && IsWarn(info.restriction_info)) {
+  if (IsWarn(info.restriction_info)) {
     // Check which of the contents were already allowed and don't warn for
     // those.
     RemoveAllowedContents(info.confidential_contents,
@@ -446,8 +441,7 @@
       }
       return;
     }
-    if (is_screen_share_warning_mode_enabled_ &&
-        IsWarn(info.restriction_info)) {
+    if (IsWarn(info.restriction_info)) {
       // Check which of the contents were already allowed and don't warn for
       // those.
       RemoveAllowedContents(info.confidential_contents,
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
index 4fc53e96f..118f88c7 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.h
@@ -159,8 +159,6 @@
     base::WeakPtrFactory<ScreenShareInfo> weak_factory_{this};
   };
 
-  void SetIsScreenShareWarningModeEnabledForTesting(bool is_enabled);
-
   // Structure that relates a list of confidential contents to the
   // corresponding restriction level.
   struct ConfidentialContentsInfo {
@@ -287,9 +285,6 @@
   raw_ptr<DlpReportingManager> reporting_manager_{nullptr};
 
   std::unique_ptr<DlpWarnNotifier> warn_notifier_;
-
-  // TODO(https://crbug.com/1278733): Remove this flag
-  bool is_screen_share_warning_mode_enabled_ = false;
 };
 
 }  // namespace policy
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc
index 29cb683..96843f3 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.cc
@@ -84,11 +84,6 @@
   return manager_->user_allowed_contents_cache_.GetSizeForTesting() != 0;
 }
 
-void DlpContentManagerTestHelper::EnableScreenShareWarningMode() {
-  DCHECK(manager_);
-  manager_->SetIsScreenShareWarningModeEnabledForTesting(/*is_enabled=*/true);
-}
-
 int DlpContentManagerTestHelper::ActiveWarningDialogsCount() const {
   DCHECK(manager_);
   return manager_->warn_notifier_->ActiveWarningDialogsCountForTesting();
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h
index 619a73e..bb343222 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager_test_helper.h
@@ -44,8 +44,6 @@
 
   bool HasAnyContentCached() const;
 
-  void EnableScreenShareWarningMode();
-
   int ActiveWarningDialogsCount() const;
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc
index c927dfc..feccb68 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_impl.cc
@@ -101,7 +101,7 @@
   std::string path;
   std::string query;
   bool match_subdomains = true;
-  for (const auto& list_entry : urls->GetList()) {
+  for (const auto& list_entry : urls->GetListDeprecated()) {
     std::string url = list_entry.GetString();
     if (!url_matcher::util::FilterToComponents(
             url, &scheme, &host, &match_subdomains, &port, &path, &query)) {
@@ -415,8 +415,8 @@
       g_browser_process->local_state()->GetList(policy_prefs::kDlpRulesList);
 
   DlpBooleanHistogram(dlp::kDlpPolicyPresentUMA,
-                      rules_list && !rules_list->GetList().empty());
-  if (!rules_list || rules_list->GetList().empty()) {
+                      rules_list && !rules_list->GetListDeprecated().empty());
+  if (!rules_list || rules_list->GetListDeprecated().empty()) {
     DataTransferDlpController::DeleteInstance();
     return;
   }
@@ -428,7 +428,7 @@
   // Constructing request to send the policy to DLP Files daemon.
   ::dlp::SetDlpFilesPolicyRequest request_to_daemon;
 
-  for (const base::Value& rule : rules_list->GetList()) {
+  for (const base::Value& rule : rules_list->GetListDeprecated()) {
     DCHECK(rule.is_dict());
     const auto* sources = rule.FindDictKey("sources");
     DCHECK(sources);
@@ -452,7 +452,8 @@
     const auto* destinations_components =
         destinations ? destinations->FindListKey("components") : nullptr;
     if (destinations_components) {
-      for (const auto& component : destinations_components->GetList()) {
+      for (const auto& component :
+           destinations_components->GetListDeprecated()) {
         DCHECK(component.is_string());
         components_rules_[GetComponentMapping(component.GetString())].insert(
             rules_counter);
@@ -461,7 +462,7 @@
 
     const auto* restrictions = rule.FindListKey("restrictions");
     DCHECK(restrictions);
-    for (const auto& restriction : restrictions->GetList()) {
+    for (const auto& restriction : restrictions->GetListDeprecated()) {
       const auto* rule_class_str = restriction.FindStringKey("class");
       DCHECK(rule_class_str);
       const auto* rule_level_str = restriction.FindStringKey("level");
@@ -477,13 +478,14 @@
 
       // TODO(crbug.com/1172959): Implement Warn level for Files.
       if (rule_restriction == Restriction::kFiles && destinations_urls &&
-          !destinations_urls->GetList().empty() && rule_level != Level::kWarn) {
+          !destinations_urls->GetListDeprecated().empty() &&
+          rule_level != Level::kWarn) {
         ::dlp::DlpFilesRule files_rule;
-        for (const auto& url : sources_urls->GetList()) {
+        for (const auto& url : sources_urls->GetListDeprecated()) {
           DCHECK(url.is_string());
           files_rule.add_source_urls(url.GetString());
         }
-        for (const auto& url : destinations_urls->GetList()) {
+        for (const auto& url : destinations_urls->GetListDeprecated()) {
           DCHECK(url.is_string());
           files_rule.add_destination_urls(url.GetString());
         }
diff --git a/chrome/browser/client_hints/client_hints_browsertest.cc b/chrome/browser/client_hints/client_hints_browsertest.cc
index 4db7ca7..59e217d 100644
--- a/chrome/browser/client_hints/client_hints_browsertest.cc
+++ b/chrome/browser/client_hints/client_hints_browsertest.cc
@@ -4105,8 +4105,9 @@
   EXPECT_EQ(GetLastRequestedURL()->path(), "/simple_3p_ot.html");
 }
 
-IN_PROC_BROWSER_TEST_F(ThirdPartyAcceptChUaReducedOriginTrialBrowserTest,
-                       ThirdPartyIframeUaReducedWithSubresourceRequests) {
+IN_PROC_BROWSER_TEST_F(
+    ThirdPartyAcceptChUaReducedOriginTrialBrowserTest,
+    DISABLED_ThirdPartyIframeUaReducedWithSubresourceRequests) {
   // The first navigation is to opt-into the OT.  Since there are subresource
   // requests, the last processed requests from the first navigation will have
   // the reduced UA string.
diff --git a/chrome/browser/component_updater/chrome_component_updater_configurator.cc b/chrome/browser/component_updater/chrome_component_updater_configurator.cc
index 1b92970..c14609c 100644
--- a/chrome/browser/component_updater/chrome_component_updater_configurator.cc
+++ b/chrome/browser/component_updater/chrome_component_updater_configurator.cc
@@ -17,6 +17,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/component_updater/component_updater_utils.h"
+#include "chrome/browser/component_updater/updater_state.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/update_client/chrome_update_query_params_delegate.h"
 #include "chrome/common/channel_info.h"
@@ -247,10 +248,7 @@
 
 update_client::UpdaterStateProvider
 ChromeConfigurator::GetUpdaterStateProvider() const {
-  // TODO(crbug.com/1286378) - add a dependency on //chrome/updater and
-  // implement this function so that it picks up that updater state, in
-  // addition to Omaha or Keystone updater states.
-  return configurator_impl_.GetUpdaterStateProvider();
+  return base::BindRepeating(&UpdaterState::GetState);
 }
 
 }  // namespace
diff --git a/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc b/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc
index 8ecc39a..d8631b5 100644
--- a/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc
+++ b/chrome/browser/component_updater/first_party_sets_component_installer_unittest.cc
@@ -108,12 +108,16 @@
       base::DeleteFile(FirstPartySetsComponentInstallerPolicy::GetInstalledPath(
           component_install_dir_.GetPath())));
 
+  base::RunLoop run_loop;
   FirstPartySetsComponentInstallerPolicy(
-      base::BindRepeating([](base::File) { CHECK(false); }))
+      base::BindLambdaForTesting([&](base::File file) {
+        EXPECT_FALSE(file.IsValid());
+        run_loop.Quit();
+      }))
       .ComponentReady(base::Version(), component_install_dir_.GetPath(),
                       base::Value(base::Value::Type::DICTIONARY));
 
-  base::RunLoop().RunUntilIdle();
+  run_loop.Run();
 }
 
 TEST_F(FirstPartySetsComponentInstallerFeatureEnabledTest,
@@ -187,7 +191,7 @@
 
   // Install the component, which should be ignored.
   base::ScopedTempDir install_dir;
-  CHECK(install_dir.CreateUniqueTempDirUnderPath(
+  ASSERT_TRUE(install_dir.CreateUniqueTempDirUnderPath(
       component_install_dir_.GetPath()));
   ASSERT_TRUE(
       base::WriteFile(FirstPartySetsComponentInstallerPolicy::GetInstalledPath(
@@ -210,9 +214,11 @@
   const std::string sets_v2 = "first party sets v2";
 
   base::ScopedTempDir dir_v1;
-  CHECK(dir_v1.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
+  ASSERT_TRUE(
+      dir_v1.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
   base::ScopedTempDir dir_v2;
-  CHECK(dir_v2.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
+  ASSERT_TRUE(
+      dir_v2.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
 
   int callback_calls = 0;
   FirstPartySetsComponentInstallerPolicy policy(
@@ -297,9 +303,11 @@
   const std::string sets_v2 = "first party sets v2";
 
   base::ScopedTempDir dir_v1;
-  CHECK(dir_v1.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
+  ASSERT_TRUE(
+      dir_v1.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
   base::ScopedTempDir dir_v2;
-  CHECK(dir_v2.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
+  ASSERT_TRUE(
+      dir_v2.CreateUniqueTempDirUnderPath(component_install_dir_.GetPath()));
 
   FirstPartySetsComponentInstallerPolicy policy(
       base::BindLambdaForTesting([&](base::File file) {
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer.cc b/chrome/browser/component_updater/pki_metadata_component_installer.cc
index ab7799e4c..c33a5245 100644
--- a/chrome/browser/component_updater/pki_metadata_component_installer.cc
+++ b/chrome/browser/component_updater/pki_metadata_component_installer.cc
@@ -40,7 +40,7 @@
 // if it is set). This should never be decreased since that will cause CT
 // enforcement to eventually stop. This should also only be increased if Chrome
 // is compatible with the version it is being incremented to.
-const uint64_t kMaxSupportedCTCompatibilityVersion = 1;
+const uint64_t kMaxSupportedCTCompatibilityVersion = 2;
 
 const char kGoogleOperatorName[] = "Google";
 
diff --git a/chrome/browser/component_updater/sw_reporter_installer_win.cc b/chrome/browser/component_updater/sw_reporter_installer_win.cc
index f61ef6d..122e8bd 100644
--- a/chrome/browser/component_updater/sw_reporter_installer_win.cc
+++ b/chrome/browser/component_updater/sw_reporter_installer_win.cc
@@ -167,7 +167,7 @@
 
   // If there are no launch parameters, create a single invocation with default
   // behaviour.
-  if (!parameter_list || parameter_list->GetList().empty()) {
+  if (!parameter_list || parameter_list->GetListDeprecated().empty()) {
     base::CommandLine command_line(exe_path);
     command_line.AppendSwitchASCII(chrome_cleaner::kSessionIdSwitch,
                                    session_id);
@@ -178,7 +178,7 @@
     return true;
   }
 
-  for (const auto& invocation_params : parameter_list->GetList()) {
+  for (const auto& invocation_params : parameter_list->GetListDeprecated()) {
     if (!invocation_params.is_dict()) {
       ReportConfigurationError(kBadParams);
       return false;
@@ -207,7 +207,7 @@
     }
 
     std::vector<std::wstring> argv = {exe_path.value()};
-    for (const auto& value : arguments->GetList()) {
+    for (const auto& value : arguments->GetListDeprecated()) {
       if (!value.is_string()) {
         ReportConfigurationError(kBadParams);
         return false;
diff --git a/components/update_client/updater_state.cc b/chrome/browser/component_updater/updater_state.cc
similarity index 92%
rename from components/update_client/updater_state.cc
rename to chrome/browser/component_updater/updater_state.cc
index f1d88b0..07e62a67 100644
--- a/components/update_client/updater_state.cc
+++ b/chrome/browser/component_updater/updater_state.cc
@@ -3,7 +3,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/update_client/updater_state.h"
+#include "chrome/browser/component_updater/updater_state.h"
 
 #include <map>
 #include <memory>
@@ -17,7 +17,7 @@
 #include "build/build_config.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace update_client {
+namespace component_updater {
 
 UpdaterState::State::State() = default;
 UpdaterState::State::State(const UpdaterState::State&) = default;
@@ -59,12 +59,11 @@
 
 UpdaterState::~UpdaterState() = default;
 
-std::unique_ptr<UpdaterState::Attributes> UpdaterState::GetState(
-    bool is_machine) {
+UpdaterState::Attributes UpdaterState::GetState(bool is_machine) {
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
-  return std::make_unique<Attributes>(UpdaterState(is_machine).Serialize());
+  return UpdaterState(is_machine).Serialize();
 #else
-  return nullptr;
+  return {};
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 }
 
@@ -121,4 +120,4 @@
   return val;
 }
 
-}  // namespace update_client
+}  // namespace component_updater
diff --git a/components/update_client/updater_state.h b/chrome/browser/component_updater/updater_state.h
similarity index 89%
rename from components/update_client/updater_state.h
rename to chrome/browser/component_updater/updater_state.h
index 7dbf87e..a7cd31d 100644
--- a/components/update_client/updater_state.h
+++ b/chrome/browser/component_updater/updater_state.h
@@ -2,30 +2,30 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_UPDATE_CLIENT_UPDATER_STATE_H_
-#define COMPONENTS_UPDATE_CLIENT_UPDATER_STATE_H_
+#ifndef CHROME_BROWSER_COMPONENT_UPDATER_UPDATER_STATE_H_
+#define CHROME_BROWSER_COMPONENT_UPDATER_UPDATER_STATE_H_
 
-#include <map>
 #include <memory>
 #include <string>
 
+#include "base/containers/flat_map.h"
 #include "base/gtest_prod_util.h"
 #include "base/time/time.h"
 #include "base/version.h"
 #include "build/build_config.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace update_client {
+namespace component_updater {
 
 class UpdaterState {
  public:
-  using Attributes = std::map<std::string, std::string>;
+  using Attributes = base::flat_map<std::string, std::string>;
 
   // Returns a map of items representing the state of an updater.
   // If |is_machine| is true, this indicates that the updater state corresponds
   // to the machine instance of the updater. Returns nullptr on
   // the platforms and builds where this feature is not supported.
-  static std::unique_ptr<Attributes> GetState(bool is_machine);
+  static Attributes GetState(bool is_machine);
 
   ~UpdaterState();
 
@@ -109,6 +109,6 @@
   absl::optional<State> state_;
 };
 
-}  // namespace update_client
+}  // namespace component_updater
 
-#endif  // COMPONENTS_UPDATE_CLIENT_UPDATER_STATE_H_
+#endif  // CHROME_BROWSER_COMPONENT_UPDATER_UPDATER_STATE_H_
diff --git a/components/update_client/updater_state_mac.mm b/chrome/browser/component_updater/updater_state_mac.mm
similarity index 89%
rename from components/update_client/updater_state_mac.mm
rename to chrome/browser/component_updater/updater_state_mac.mm
index 83f6164..741e81a 100644
--- a/components/update_client/updater_state_mac.mm
+++ b/chrome/browser/component_updater/updater_state_mac.mm
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chrome/browser/component_updater/updater_state.h"
+
 #import <Foundation/Foundation.h>
 
 #include "base/enterprise_util.h"
@@ -11,20 +13,19 @@
 #include "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/version.h"
-#include "components/update_client/updater_state.h"
 
-namespace update_client {
+namespace component_updater {
 
 namespace {
 
-const base::FilePath::CharType kKeystonePlist[] = FILE_PATH_LITERAL(
-    "Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/"
-    "Contents/Info.plist");
+const base::FilePath::CharType kKeystonePlist[] =
+    FILE_PATH_LITERAL("Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/"
+                      "Contents/Info.plist");
 
 // Gets a value from the updater settings. Returns a retained object.
 // T should be a toll-free Foundation framework type. See Apple's
 // documentation for toll-free bridging.
-template<class T>
+template <class T>
 base::scoped_nsobject<T> GetUpdaterSettingsValue(NSString* value_name) {
   CFStringRef app_id = CFSTR("com.google.Keystone.Agent");
   base::ScopedCFTypeRef<CFPropertyListRef> plist(
@@ -78,8 +79,8 @@
     bool /*is_machine*/) const {
   // System Keystone trumps user one, so check this one first
   base::FilePath local_library;
-  bool success = base::mac::GetLocalDirectory(NSLibraryDirectory,
-                                              &local_library);
+  bool success =
+      base::mac::GetLocalDirectory(NSLibraryDirectory, &local_library);
   DCHECK(success);
   base::FilePath system_bundle_plist = local_library.Append(kKeystonePlist);
   base::Version system_keystone = GetVersionFromPlist(system_bundle_plist);
@@ -119,4 +120,4 @@
   return -1;  // Keystone does not support update policies.
 }
 
-}  // namespace update_client
+}  // namespace component_updater
diff --git a/components/update_client/updater_state_unittest.cc b/chrome/browser/component_updater/updater_state_unittest.cc
similarity index 88%
rename from components/update_client/updater_state_unittest.cc
rename to chrome/browser/component_updater/updater_state_unittest.cc
index 36b6e74d..9837d42 100644
--- a/components/update_client/updater_state_unittest.cc
+++ b/chrome/browser/component_updater/updater_state_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 "components/update_client/updater_state.h"
+#include "chrome/browser/component_updater/updater_state.h"
 
 #include "base/time/time.h"
 #include "base/version.h"
@@ -10,7 +10,7 @@
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace update_client {
+namespace component_updater {
 
 class UpdaterStateTest : public testing::Test {
  public:
@@ -24,11 +24,11 @@
 
 TEST_F(UpdaterStateTest, Serialize) {
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
-  EXPECT_STREQ("0", UpdaterState::GetState(false)->at("ismachine").c_str());
-  EXPECT_STREQ("1", UpdaterState::GetState(true)->at("ismachine").c_str());
+  EXPECT_STREQ("0", UpdaterState::GetState(false).at("ismachine").c_str());
+  EXPECT_STREQ("1", UpdaterState::GetState(true).at("ismachine").c_str());
 #else
-  EXPECT_FALSE(UpdaterState::GetState(false));
-  EXPECT_FALSE(UpdaterState::GetState(true));
+  EXPECT_TRUE(UpdaterState::GetState(false).empty());
+  EXPECT_TRUE(UpdaterState::GetState(true).empty());
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
 }
 
@@ -56,9 +56,9 @@
   EXPECT_STREQ("1", attributes.at("updatepolicy").c_str());
 
 #if BUILDFLAG(IS_WIN)
-  EXPECT_STREQ("Omaha", UpdaterState::GetState(false)->at("name").c_str());
+  EXPECT_STREQ("Omaha", UpdaterState::GetState(false).at("name").c_str());
 #elif BUILDFLAG(IS_MAC)
-  EXPECT_STREQ("Keystone", UpdaterState::GetState(false)->at("name").c_str());
+  EXPECT_STREQ("Keystone", UpdaterState::GetState(false).at("name").c_str());
 #endif  // BUILDFLAG(IS_WIN)
 
   // Tests some of the remaining values.
@@ -124,4 +124,4 @@
 #endif  // (BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)) &&
         // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
-}  // namespace update_client
+}  // namespace component_updater
diff --git a/components/update_client/updater_state_win.cc b/chrome/browser/component_updater/updater_state_win.cc
similarity index 96%
rename from components/update_client/updater_state_win.cc
rename to chrome/browser/component_updater/updater_state_win.cc
index 099bd0e..8030caa 100644
--- a/components/update_client/updater_state_win.cc
+++ b/chrome/browser/component_updater/updater_state_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 "components/update_client/updater_state.h"
+#include "chrome/browser/component_updater/updater_state.h"
 
 #include <windows.h>
 
@@ -18,7 +18,7 @@
 // TODO(sorin): implement this in terms of
 // chrome/installer/util/google_update_settings (crbug.com/615187).
 
-namespace update_client {
+namespace component_updater {
 
 namespace {
 
@@ -143,4 +143,4 @@
   return -1;
 }
 
-}  // namespace update_client
+}  // namespace component_updater
diff --git a/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc b/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc
index 19db2a6..38b17ff 100644
--- a/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc
+++ b/chrome/browser/content_settings/content_settings_policy_provider_unittest.cc
@@ -192,8 +192,8 @@
   base::Value* cert_filters =
       cert_filter_setting.FindKeyOfType("filters", base::Value::Type::LIST);
   ASSERT_TRUE(cert_filters);
-  ASSERT_FALSE(cert_filters->GetList().empty());
-  auto& filter = cert_filters->GetList().front();
+  ASSERT_FALSE(cert_filters->GetListDeprecated().empty());
+  auto& filter = cert_filters->GetListDeprecated().front();
   ASSERT_TRUE(filter.is_dict());
   const std::string* actual_common_name = filter.FindStringPath("ISSUER.CN");
   ASSERT_TRUE(actual_common_name);
diff --git a/chrome/browser/device_api/device_service_impl.cc b/chrome/browser/device_api/device_service_impl.cc
index 9eabce18..8d21dabb 100644
--- a/chrome/browser/device_api/device_service_impl.cc
+++ b/chrome/browser/device_api/device_service_impl.cc
@@ -42,9 +42,10 @@
   if (!prefs_list)
     return false;
 
-  return base::Contains(prefs_list->GetList(), origin, [](const auto& entry) {
-    return url::Origin::Create(GURL(entry.GetString()));
-  });
+  return base::Contains(prefs_list->GetListDeprecated(), origin,
+                        [](const auto& entry) {
+                          return url::Origin::Create(GURL(entry.GetString()));
+                        });
 }
 
 // Check whether the target origin is the same as the main application running
@@ -73,10 +74,11 @@
   if (!prefs_list)
     return false;
 
-  return base::Contains(prefs_list->GetList(), origin, [](const auto& entry) {
-    std::string entry_url = entry.FindKey(web_app::kUrlKey)->GetString();
-    return url::Origin::Create(GURL(entry_url));
-  });
+  return base::Contains(
+      prefs_list->GetListDeprecated(), origin, [](const auto& entry) {
+        std::string entry_url = entry.FindKey(web_app::kUrlKey)->GetString();
+        return url::Origin::Create(GURL(entry_url));
+      });
 }
 
 const Profile* GetProfile(content::RenderFrameHost* host) {
diff --git a/chrome/browser/device_api/managed_configuration_api.cc b/chrome/browser/device_api/managed_configuration_api.cc
index 3693259..9e8ac94 100644
--- a/chrome/browser/device_api/managed_configuration_api.cc
+++ b/chrome/browser/device_api/managed_configuration_api.cc
@@ -186,7 +186,7 @@
 
   std::set<url::Origin> current_origins;
 
-  for (const auto& entry : managed_configurations->GetList()) {
+  for (const auto& entry : managed_configurations->GetListDeprecated()) {
     const std::string* url = entry.FindStringKey(kOriginKey);
     if (!url)
       continue;
diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc
index f496f7b..94a6365 100644
--- a/chrome/browser/devtools/device/devtools_android_bridge.cc
+++ b/chrome/browser/devtools/device/devtools_android_bridge.cc
@@ -317,10 +317,10 @@
 static std::set<net::HostPortPair> ParseTargetDiscoveryPreferenceValue(
     const base::Value* preferenceValue) {
   std::set<net::HostPortPair> targets;
-  if (!preferenceValue || preferenceValue->GetList().empty())
+  if (!preferenceValue || preferenceValue->GetListDeprecated().empty())
     return targets;
   std::string address;
-  for (const auto& address : preferenceValue->GetList()) {
+  for (const auto& address : preferenceValue->GetListDeprecated()) {
     if (!address.is_string())
       continue;
     net::HostPortPair target =
diff --git a/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc b/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc
index 27412174..d14dd1cc 100644
--- a/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc
+++ b/chrome/browser/devtools/device/devtools_android_bridge_browsertest.cc
@@ -105,10 +105,10 @@
   const base::Value* targets =
       service->GetList(prefs::kDevToolsTCPDiscoveryConfig);
   EXPECT_NE(nullptr, targets);
-  EXPECT_EQ(2ul, targets->GetList().size());
+  EXPECT_EQ(2ul, targets->GetListDeprecated().size());
 
   std::set<std::string> actual;
-  for (const base::Value& item : targets->GetList()) {
+  for (const base::Value& item : targets->GetListDeprecated()) {
     std::string value;
     if (item.is_string())
       value = item.GetString();
diff --git a/chrome/browser/devtools/device/devtools_device_discovery.cc b/chrome/browser/devtools/device/devtools_device_discovery.cc
index 1259c3e..c149101 100644
--- a/chrome/browser/devtools/device/devtools_device_discovery.cc
+++ b/chrome/browser/devtools/device/devtools_device_discovery.cc
@@ -494,7 +494,7 @@
     return;
   absl::optional<base::Value> value = base::JSONReader::Read(response);
   if (value && value->is_list()) {
-    for (base::Value& page_value : value->GetList()) {
+    for (base::Value& page_value : value->GetListDeprecated()) {
       if (page_value.is_dict())
         browser->pages_.push_back(new RemotePage(device, browser->browser_id_,
                                                  browser->version_,
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index 7a2d048..9fd5f39 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -1013,7 +1013,8 @@
   absl::optional<base::Value> parsed_excluded_folders =
       base::JSONReader::Read(excluded_folders_message);
   if (parsed_excluded_folders && parsed_excluded_folders->is_list()) {
-    for (const base::Value& folder_path : parsed_excluded_folders->GetList()) {
+    for (const base::Value& folder_path :
+         parsed_excluded_folders->GetListDeprecated()) {
       if (folder_path.is_string())
         excluded_folders.push_back(folder_path.GetString());
     }
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 4a143261..7cd1cdea 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -281,7 +281,7 @@
   absl::optional<base::Value> parsed_message = base::JSONReader::Read(message);
   if (!parsed_message || !parsed_message->is_list())
     return;
-  for (const auto& list_item : parsed_message->GetList()) {
+  for (const auto& list_item : parsed_message->GetListDeprecated()) {
     if (!list_item.is_dict())
       continue;
     int key_code = list_item.FindIntKey("keyCode").value_or(0);
@@ -1587,7 +1587,7 @@
   absl::optional<base::Value> value = base::JSONReader::Read(cert_chain);
   CHECK(value && value->is_list());
   std::vector<std::string> decoded;
-  for (const auto& item : value->GetList()) {
+  for (const auto& item : value->GetListDeprecated()) {
     CHECK(item.is_string());
     std::string temp;
     CHECK(base::Base64Decode(item.GetString(), &temp));
diff --git a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 0b8c2cd..c1f93faf 100644
--- a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -74,10 +74,10 @@
   ASSERT_FALSE(params.FindPath("visibleSecurityState.safetyTipInfo"));
   const base::Value* security_state_issue_ids =
       params.FindListPath("visibleSecurityState.securityStateIssueIds");
-  ASSERT_TRUE(std::find(security_state_issue_ids->GetList().begin(),
-                        security_state_issue_ids->GetList().end(),
+  ASSERT_TRUE(std::find(security_state_issue_ids->GetListDeprecated().begin(),
+                        security_state_issue_ids->GetListDeprecated().end(),
                         base::Value("scheme-is-not-cryptographic")) !=
-              security_state_issue_ids->GetList().end());
+              security_state_issue_ids->GetListDeprecated().end());
 }
 
 IN_PROC_BROWSER_TEST_F(DevToolsProtocolTest, CreateDeleteContext) {
@@ -505,7 +505,7 @@
   const base::Value* certificate_value =
       certificate_security_state->FindListPath("certificate");
   std::vector<std::string> der_certs;
-  for (const auto& cert : certificate_value->GetList()) {
+  for (const auto& cert : certificate_value->GetListDeprecated()) {
     std::string decoded;
     ASSERT_TRUE(base::Base64Decode(cert.GetString(), &decoded));
     der_certs.push_back(decoded);
@@ -525,7 +525,7 @@
             certificate->CalculateChainFingerprint256());
   const base::Value* security_state_issue_ids =
       params.FindListPath("visibleSecurityState.securityStateIssueIds");
-  EXPECT_EQ(security_state_issue_ids->GetList().size(), 0u);
+  EXPECT_EQ(security_state_issue_ids->GetListDeprecated().size(), 0u);
 
   ASSERT_FALSE(params.FindPath("visibleSecurityState.safetyTipInfo"));
 }
@@ -629,8 +629,8 @@
   const base::Value* sans =
       response.FindListPath("response.securityDetails.sanList");
   ASSERT_TRUE(sans);
-  ASSERT_EQ(1u, sans->GetList().size());
-  EXPECT_EQ(base::Value("127.0.0.1"), sans->GetList()[0]);
+  ASSERT_EQ(1u, sans->GetListDeprecated().size());
+  EXPECT_EQ(base::Value("127.0.0.1"), sans->GetListDeprecated()[0]);
 
   absl::optional<double> valid_from =
       response.FindDoublePath("response.securityDetails.validFrom");
@@ -755,13 +755,13 @@
   const base::Value* sans =
       response.FindListPath("response.securityDetails.sanList");
   ASSERT_TRUE(sans);
-  ASSERT_EQ(6u, sans->GetList().size());
-  EXPECT_EQ(base::Value("a.example"), sans->GetList()[0]);
-  EXPECT_EQ(base::Value("b.example"), sans->GetList()[1]);
-  EXPECT_EQ(base::Value("*.c.example"), sans->GetList()[2]);
-  EXPECT_EQ(base::Value("127.0.0.1"), sans->GetList()[3]);
-  EXPECT_EQ(base::Value("::1"), sans->GetList()[4]);
-  EXPECT_EQ(base::Value("1.2.3.4"), sans->GetList()[5]);
+  ASSERT_EQ(6u, sans->GetListDeprecated().size());
+  EXPECT_EQ(base::Value("a.example"), sans->GetListDeprecated()[0]);
+  EXPECT_EQ(base::Value("b.example"), sans->GetListDeprecated()[1]);
+  EXPECT_EQ(base::Value("*.c.example"), sans->GetListDeprecated()[2]);
+  EXPECT_EQ(base::Value("127.0.0.1"), sans->GetListDeprecated()[3]);
+  EXPECT_EQ(base::Value("::1"), sans->GetListDeprecated()[4]);
+  EXPECT_EQ(base::Value("1.2.3.4"), sans->GetListDeprecated()[5]);
 }
 
 class ExtensionProtocolTest : public DevToolsProtocolTest {
@@ -856,7 +856,7 @@
 
   std::string target_id;
   base::Value ext_target;
-  for (auto& target : result_.FindListKey("targetInfos")->GetList()) {
+  for (auto& target : result_.FindListKey("targetInfos")->GetListDeprecated()) {
     if (*target.FindStringKey("type") == "service_worker") {
       ext_target = target.Clone();
       break;
diff --git a/chrome/browser/devtools/serialize_host_descriptions_unittest.cc b/chrome/browser/devtools/serialize_host_descriptions_unittest.cc
index 2c72d8c..418211f 100644
--- a/chrome/browser/devtools/serialize_host_descriptions_unittest.cc
+++ b/chrome/browser/devtools/serialize_host_descriptions_unittest.cc
@@ -102,21 +102,23 @@
 MATCHER(Node2, "") {
   if (!CheckLabel(arg, 2))
     return false;
-  EXPECT_THAT(GetChildren(arg)->GetList(), UnorderedElementsAre(EmptyNode(4)));
+  EXPECT_THAT(GetChildren(arg)->GetListDeprecated(),
+              UnorderedElementsAre(EmptyNode(4)));
   return true;
 }
 
 MATCHER(Node5, "") {
   if (!CheckLabel(arg, 5))
     return false;
-  EXPECT_THAT(GetChildren(arg)->GetList(), UnorderedElementsAre(Node2()));
+  EXPECT_THAT(GetChildren(arg)->GetListDeprecated(),
+              UnorderedElementsAre(Node2()));
   return true;
 }
 
 MATCHER(Node0, "") {
   if (!CheckLabel(arg, 0))
     return false;
-  EXPECT_THAT(GetChildren(arg)->GetList(),
+  EXPECT_THAT(GetChildren(arg)->GetListDeprecated(),
               UnorderedElementsAre(EmptyNode(1), EmptyNode(3), EmptyNode(6)));
   return true;
 }
diff --git a/chrome/browser/domain_reliability/browsertest.cc b/chrome/browser/domain_reliability/browsertest.cc
index 5c605a2b..2c7a941 100644
--- a/chrome/browser/domain_reliability/browsertest.cc
+++ b/chrome/browser/domain_reliability/browsertest.cc
@@ -170,9 +170,9 @@
 
   const base::ListValue* entries;
   ASSERT_TRUE(dict->GetList("entries", &entries));
-  ASSERT_EQ(1u, entries->GetList().size());
+  ASSERT_EQ(1u, entries->GetListDeprecated().size());
 
-  const base::Value& entry_value = entries->GetList()[0u];
+  const base::Value& entry_value = entries->GetListDeprecated()[0u];
   ASSERT_TRUE(entry_value.is_dict());
   const base::DictionaryValue& entry =
       base::Value::AsDictionaryValue(entry_value);
diff --git a/chrome/browser/download/android/download_open_source.h b/chrome/browser/download/android/download_open_source.h
index 76d4800..915fc6d2e 100644
--- a/chrome/browser/download/android/download_open_source.h
+++ b/chrome/browser/download/android/download_open_source.h
@@ -44,7 +44,9 @@
   kDuplicateDownloadDialog = 14,
   // Download triggered by external app.
   kExternalApp = 15,
-  kMaxValue = kExternalApp
+  // New download tab open button.
+  kNewDownloadTabOpenButton = 16,
+  kMaxValue = kNewDownloadTabOpenButton
 };
 
 #endif  // CHROME_BROWSER_DOWNLOAD_ANDROID_DOWNLOAD_OPEN_SOURCE_H_
diff --git a/chrome/browser/download/download_auto_open_policy_handler.cc b/chrome/browser/download/download_auto_open_policy_handler.cc
index c1680b4..bc992fe 100644
--- a/chrome/browser/download/download_auto_open_policy_handler.cc
+++ b/chrome/browser/download/download_auto_open_policy_handler.cc
@@ -29,7 +29,7 @@
       !policy_value->is_list())
     return false;
 
-  base::Value::ConstListView policy_list = policy_value->GetList();
+  base::Value::ConstListView policy_list = policy_value->GetListDeprecated();
   for (size_t i = 0; i < policy_list.size(); ++i) {
     const std::string extension = policy_list[i].GetString();
     // If it's empty or malformed, then mark it as an error.
@@ -54,7 +54,7 @@
   DCHECK(policy_value->is_list());
 
   base::ListValue pref_values;
-  for (const auto& entry : policy_value->GetList()) {
+  for (const auto& entry : policy_value->GetListDeprecated()) {
     const std::string extension = entry.GetString();
     // If it's empty or malformed, then skip the entry.
     if (extension.empty() ||
diff --git a/chrome/browser/download/download_prefs.cc b/chrome/browser/download/download_prefs.cc
index dbfae7b5..673ed00 100644
--- a/chrome/browser/download/download_prefs.cc
+++ b/chrome/browser/download/download_prefs.cc
@@ -667,7 +667,8 @@
 
   PrefService* prefs = profile_->GetPrefs();
   for (const auto& extension :
-       prefs->GetList(prefs::kDownloadExtensionsToOpenByPolicy)->GetList()) {
+       prefs->GetList(prefs::kDownloadExtensionsToOpenByPolicy)
+           ->GetListDeprecated()) {
     base::FilePath::StringType extension_string =
         StringToFilePathString(extension.GetString());
     auto_open_by_policy_.insert(extension_string);
@@ -683,7 +684,7 @@
 
   // We only need to configure |allowed_urls| if something is set by policy,
   // otherwise the default object does what we want.
-  if (list->GetList().size() != 0) {
+  if (list->GetListDeprecated().size() != 0) {
     allowed_urls->Allow(&base::Value::AsListValue(*list));
 
     // Since we only want to auto-open for the specified urls, block everything
diff --git a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
index 9c21d7f..fed0fe2 100644
--- a/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
+++ b/chrome/browser/enterprise/connectors/analysis/analysis_service_settings.cc
@@ -36,8 +36,8 @@
   matcher_ = std::make_unique<url_matcher::URLMatcher>();
   url_matcher::URLMatcherConditionSet::ID id(0);
   const base::Value* enable = settings_value.FindListKey(kKeyEnable);
-  if (enable && enable->is_list() && !enable->GetList().empty()) {
-    for (const base::Value& value : enable->GetList())
+  if (enable && enable->is_list() && !enable->GetListDeprecated().empty()) {
+    for (const base::Value& value : enable->GetListDeprecated())
       AddUrlPatternSettings(value, true, &id);
   } else {
     return;
@@ -45,7 +45,7 @@
 
   const base::Value* disable = settings_value.FindListKey(kKeyDisable);
   if (disable && disable->is_list()) {
-    for (const base::Value& value : disable->GetList())
+    for (const base::Value& value : disable->GetListDeprecated())
       AddUrlPatternSettings(value, false, &id);
   }
 
@@ -67,7 +67,7 @@
   const base::Value* custom_messages =
       settings_value.FindListKey(kKeyCustomMessages);
   if (custom_messages && custom_messages->is_list()) {
-    for (const base::Value& value : custom_messages->GetList()) {
+    for (const base::Value& value : custom_messages->GetListDeprecated()) {
       // As of now, this list will contain one message per tag. At some point,
       // the server may start sending one message per language/tag pair. If this
       // is the case, this code should be changed to match the language to
@@ -98,7 +98,8 @@
   const base::Value* require_justification_tags =
       settings_value.FindListKey(kKeyRequireJustificationTags);
   if (require_justification_tags && require_justification_tags->is_list()) {
-    for (const base::Value& tag : require_justification_tags->GetList()) {
+    for (const base::Value& tag :
+         require_justification_tags->GetListDeprecated()) {
       tags_requiring_justification_.insert(tag.GetString());
     }
   }
@@ -202,7 +203,7 @@
   if (!tags)
     return;
 
-  for (const base::Value& tag : tags->GetList()) {
+  for (const base::Value& tag : tags->GetListDeprecated()) {
     if (tag.is_string() &&
         (service_provider_->analysis_tags().count(tag.GetString()) == 1)) {
       setting.tags.insert(tag.GetString());
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
index b9779f0..00980b7c 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.cc
@@ -741,6 +741,11 @@
 
 std::u16string ContentAnalysisDialog::GetPendingMessage() const {
   DCHECK(is_pending());
+  if (is_print_scan()) {
+    return l10n_util::GetStringUTF16(
+        IDS_DEEP_SCANNING_DIALOG_PRINT_PENDING_MESSAGE);
+  }
+
   return l10n_util::GetPluralStringFUTF16(
       IDS_DEEP_SCANNING_DIALOG_UPLOAD_PENDING_MESSAGE, files_count_);
 }
@@ -754,6 +759,10 @@
     return GetCustomMessage();
 
   if (final_result_ == ContentAnalysisDelegateBase::FinalResult::LARGE_FILES) {
+    if (is_print_scan()) {
+      return l10n_util::GetStringUTF16(
+          IDS_DEEP_SCANNING_DIALOG_LARGE_PRINT_FAILURE_MESSAGE);
+    }
     return l10n_util::GetPluralStringFUTF16(
         IDS_DEEP_SCANNING_DIALOG_LARGE_FILE_FAILURE_MESSAGE, files_count_);
   }
@@ -764,6 +773,11 @@
         IDS_DEEP_SCANNING_DIALOG_ENCRYPTED_FILE_FAILURE_MESSAGE, files_count_);
   }
 
+  if (is_print_scan()) {
+    return l10n_util::GetStringUTF16(
+        IDS_DEEP_SCANNING_DIALOG_PRINT_WARNING_MESSAGE);
+  }
+
   return l10n_util::GetPluralStringFUTF16(
       IDS_DEEP_SCANNING_DIALOG_UPLOAD_FAILURE_MESSAGE, files_count_);
 }
@@ -776,12 +790,21 @@
   if (has_custom_message())
     return GetCustomMessage();
 
+  if (is_print_scan()) {
+    return l10n_util::GetStringUTF16(
+        IDS_DEEP_SCANNING_DIALOG_PRINT_WARNING_MESSAGE);
+  }
+
   return l10n_util::GetPluralStringFUTF16(
       IDS_DEEP_SCANNING_DIALOG_UPLOAD_WARNING_MESSAGE, files_count_);
 }
 
 std::u16string ContentAnalysisDialog::GetSuccessMessage() const {
   DCHECK(is_success());
+  if (is_print_scan()) {
+    return l10n_util::GetStringUTF16(
+        IDS_DEEP_SCANNING_DIALOG_PRINT_SUCCESS_MESSAGE);
+  }
   return l10n_util::GetPluralStringFUTF16(
       IDS_DEEP_SCANNING_DIALOG_SUCCESS_MESSAGE, files_count_);
 }
@@ -798,6 +821,10 @@
       GetTopImageId(use_dark));
 }
 
+bool ContentAnalysisDialog::is_print_scan() const {
+  return access_point_ == safe_browsing::DeepScanAccessPoint::PRINT;
+}
+
 SkColor ContentAnalysisDialog::GetSideImageLogoColor() const {
   DCHECK(contents_view_);
 
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
index 922eaa28..25763b85 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog.h
@@ -230,6 +230,9 @@
 
   std::u16string GetCustomMessage() const;
 
+  // Helper that indicates if the dialog corresponds to a print scan.
+  bool is_print_scan() const;
+
   void AcceptButtonCallback();
   void CancelButtonCallback();
   void LearnMoreLinkClickedCallback(const ui::Event& event);
diff --git a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
index c650450..acc9769b 100644
--- a/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/content_analysis_dialog_browsertest.cc
@@ -350,8 +350,14 @@
     // The dialog initially shows the pending message for the appropriate access
     // point and scan type.
     std::u16string pending_message = dialog->GetMessageForTesting()->GetText();
-    std::u16string expected_message = l10n_util::GetPluralStringFUTF16(
-        IDS_DEEP_SCANNING_DIALOG_UPLOAD_PENDING_MESSAGE, file_scan() ? 1 : 0);
+    std::u16string expected_message;
+    if (access_point() == safe_browsing::DeepScanAccessPoint::PRINT) {
+      expected_message = l10n_util::GetStringUTF16(
+          IDS_DEEP_SCANNING_DIALOG_PRINT_PENDING_MESSAGE);
+    } else {
+      expected_message = l10n_util::GetPluralStringFUTF16(
+          IDS_DEEP_SCANNING_DIALOG_UPLOAD_PENDING_MESSAGE, file_scan() ? 1 : 0);
+    }
     ASSERT_EQ(pending_message, expected_message);
 
     // The top image is the pending one corresponding to the access point.
@@ -393,6 +399,12 @@
   }
 
   virtual std::u16string GetExpectedMessage() {
+    if (access_point() == safe_browsing::DeepScanAccessPoint::PRINT) {
+      return success() ? l10n_util::GetStringUTF16(
+                             IDS_DEEP_SCANNING_DIALOG_PRINT_SUCCESS_MESSAGE)
+                       : l10n_util::GetStringUTF16(
+                             IDS_DEEP_SCANNING_DIALOG_PRINT_WARNING_MESSAGE);
+    }
     int files_count = file_scan() ? 1 : 0;
     return success()
                ? l10n_util::GetPluralStringFUTF16(
@@ -423,6 +435,13 @@
     : public ContentAnalysisDialogAppearanceBrowserTest {
  private:
   std::u16string GetExpectedMessage() override {
+    if (access_point() == safe_browsing::DeepScanAccessPoint::PRINT) {
+      return success() ? l10n_util::GetStringUTF16(
+                             IDS_DEEP_SCANNING_DIALOG_PRINT_SUCCESS_MESSAGE)
+                       : l10n_util::GetStringFUTF16(
+                             IDS_DEEP_SCANNING_DIALOG_CUSTOM_MESSAGE,
+                             u"Custom message");
+    }
     int files_count = file_scan() ? 1 : 0;
     return success()
                ? l10n_util::GetPluralStringFUTF16(
diff --git a/chrome/browser/enterprise/connectors/connectors_manager.cc b/chrome/browser/enterprise/connectors/connectors_manager.cc
index f3fc199..a07996a9 100644
--- a/chrome/browser/enterprise/connectors/connectors_manager.cc
+++ b/chrome/browser/enterprise/connectors/connectors_manager.cc
@@ -152,7 +152,8 @@
   const base::Value* policy_value =
       pref_change_registrar_.prefs()->GetList(pref);
   if (policy_value && policy_value->is_list()) {
-    for (const base::Value& service_settings : policy_value->GetList())
+    for (const base::Value& service_settings :
+         policy_value->GetListDeprecated())
       analysis_connector_settings_[connector].emplace_back(
           service_settings, *service_provider_config_);
   }
@@ -169,7 +170,8 @@
   const base::Value* policy_value =
       pref_change_registrar_.prefs()->GetList(pref);
   if (policy_value && policy_value->is_list()) {
-    for (const base::Value& service_settings : policy_value->GetList())
+    for (const base::Value& service_settings :
+         policy_value->GetListDeprecated())
       reporting_connector_settings_[connector].emplace_back(
           service_settings, *service_provider_config_);
   }
@@ -186,7 +188,8 @@
   const base::Value* policy_value =
       pref_change_registrar_.prefs()->GetList(pref);
   if (policy_value && policy_value->is_list()) {
-    for (const base::Value& service_settings : policy_value->GetList())
+    for (const base::Value& service_settings :
+         policy_value->GetListDeprecated())
       file_system_connector_settings_[connector].emplace_back(
           service_settings, *service_provider_config_);
   }
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc
index aaddcdb..7c82a03 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.cc
@@ -22,7 +22,7 @@
 
 bool ConnectorPolicyHasValues(PrefService* profile_prefs) {
   const auto* list = GetPolicyUrlPatterns(profile_prefs);
-  return list && !list->GetList().empty();
+  return list && !list->GetListDeprecated().empty();
 }
 
 }  // namespace
@@ -86,7 +86,7 @@
     matcher_ = std::make_unique<url_matcher::URLMatcher>();
   }
 
-  if (url_patterns && !url_patterns->GetList().empty()) {
+  if (url_patterns && !url_patterns->GetListDeprecated().empty()) {
     // Add the new endpoints to the conditions.
     url_matcher::util::AddAllowFilters(
         matcher_.get(), &base::Value::AsListValue(*url_patterns));
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
index 8ec1c7b9..4d8763c 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
@@ -168,6 +168,8 @@
              bool waiting_enabled) {
             std::string token_base64;
             base::Base64Encode(params.dm_token, &token_base64);
+            std::string nonce_base64;
+            base::Base64Encode(params.nonce, &nonce_base64);
 
             DWORD return_code = installer::ROTATE_DTKEY_FAILED;
 
@@ -178,7 +180,7 @@
             for (int i = 0; i < 10; ++i) {
               hr = run_elevated_command(
                   installer::kCmdRotateDeviceTrustKey,
-                  {token_base64, params.dm_server_url, params.nonce},
+                  {token_base64, params.dm_server_url, nonce_base64},
                   &return_code);
               if (hr != GOOPDATE_E_APP_USING_EXTERNAL_UPDATER)
                 break;
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc
index 02f1bb4..f2ce5e3 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc
@@ -16,6 +16,7 @@
 namespace enterprise_connectors {
 
 namespace {
+
 const char kNonce[] = "nonce";
 const char kFakeDMToken[] = "fake-browser-dm-token";
 const char kFakeDmServerUrl[] =
@@ -23,6 +24,18 @@
     "management_service?retry=false&agent=Chrome+1.2.3(456)&apptype=Chrome&"
     "critical=true&deviceid=fake-client-id&devicetype=2&platform=Test%7CUnit%"
     "7C1.2.3&request=browser_public_key_upload";
+
+void CheckCommandArgs(const std::vector<std::string>& args) {
+  std::string token_base64;
+  base::Base64Encode(kFakeDMToken, &token_base64);
+  std::string nonce_base64;
+  base::Base64Encode(kFakeDMToken, &token_base64);
+  base::Base64Encode(kNonce, &nonce_base64);
+  EXPECT_EQ(token_base64, args[0]);
+  EXPECT_EQ(kFakeDmServerUrl, args[1]);
+  EXPECT_EQ(nonce_base64, args[2]);
+}
+
 }  // namespace
 
 class WinKeyRotationCommandTest : public testing::Test {
@@ -41,11 +54,7 @@
   WinKeyRotationCommand command([](const wchar_t* command,
                                    const std::vector<std::string>& args,
                                    DWORD* return_code) {
-    std::string token_base64;
-    base::Base64Encode(kFakeDMToken, &token_base64);
-    EXPECT_EQ(token_base64, args[0]);
-    EXPECT_EQ(kFakeDmServerUrl, args[1]);
-    EXPECT_EQ(kNonce, args[2]);
+    CheckCommandArgs(args);
     *return_code = installer::ROTATE_DTKEY_SUCCESS;
     return S_OK;
   });
@@ -71,11 +80,7 @@
   WinKeyRotationCommand command([](const wchar_t* command,
                                    const std::vector<std::string>& args,
                                    DWORD* return_code) {
-    std::string token_base64;
-    base::Base64Encode(kFakeDMToken, &token_base64);
-    EXPECT_EQ(token_base64, args[0]);
-    EXPECT_EQ(kFakeDmServerUrl, args[1]);
-    EXPECT_EQ(kNonce, args[2]);
+    CheckCommandArgs(args);
     *return_code = installer::ROTATE_DTKEY_FAILED;
     return S_OK;
   });
@@ -101,11 +106,7 @@
   WinKeyRotationCommand command([](const wchar_t* command,
                                    const std::vector<std::string>& args,
                                    DWORD* return_code) {
-    std::string token_base64;
-    base::Base64Encode(kFakeDMToken, &token_base64);
-    EXPECT_EQ(token_base64, args[0]);
-    EXPECT_EQ(kFakeDmServerUrl, args[1]);
-    EXPECT_EQ(kNonce, args[2]);
+    CheckCommandArgs(args);
     // Not setting return_code.
     return E_ABORT;
   });
@@ -131,11 +132,7 @@
   WinKeyRotationCommand command([](const wchar_t* command,
                                    const std::vector<std::string>& args,
                                    DWORD* return_code) {
-    std::string token_base64;
-    base::Base64Encode(kFakeDMToken, &token_base64);
-    EXPECT_EQ(token_base64, args[0]);
-    EXPECT_EQ(kFakeDmServerUrl, args[1]);
-    EXPECT_EQ(kNonce, args[2]);
+    CheckCommandArgs(args);
     // Not setting return_code.
     return WinKeyRotationCommand::GOOPDATE_E_APP_USING_EXTERNAL_UPDATER;
   });
@@ -162,11 +159,7 @@
   WinKeyRotationCommand command([](const wchar_t* command,
                                    const std::vector<std::string>& args,
                                    DWORD* return_code) {
-    std::string token_base64;
-    base::Base64Encode(kFakeDMToken, &token_base64);
-    EXPECT_EQ(token_base64, args[0]);
-    EXPECT_EQ(kFakeDmServerUrl, args[1]);
-    EXPECT_EQ(kNonce, args[2]);
+    CheckCommandArgs(args);
     // Not setting return_code.
     return E_FAIL;
   });
diff --git a/chrome/browser/enterprise/connectors/file_system/box_api_call_flow.cc b/chrome/browser/enterprise/connectors/file_system/box_api_call_flow.cc
index a436c36a..f523384 100644
--- a/chrome/browser/enterprise/connectors/file_system/box_api_call_flow.cc
+++ b/chrome/browser/enterprise/connectors/file_system/box_api_call_flow.cc
@@ -103,7 +103,7 @@
 bool VerifyChunkedUploadParts(const base::Value& parts) {
   DCHECK(parts.is_dict()) << parts;
   DCHECK(parts.FindPath("parts")->is_list()) << parts;
-  auto parts_list = parts.FindPath("parts")->GetList();
+  auto parts_list = parts.FindPath("parts")->GetListDeprecated();
   DCHECK(!parts_list.empty());
   for (auto p = parts_list.begin(); p != parts_list.end(); ++p) {
     DCHECK(p->is_dict()) << parts;
@@ -129,7 +129,7 @@
   }
 
   CHECK(list);
-  *list = entries->GetList();
+  *list = entries->GetListDeprecated();
   return true;
 }
 
@@ -440,9 +440,10 @@
     base::Value* conflict_folders_list =
         result.value->FindListPath("context_info.conflicts");
     if (box_error_code && *box_error_code == "item_name_in_use" &&
-        conflict_folders_list && conflict_folders_list->GetList().size() > 0) {
+        conflict_folders_list &&
+        conflict_folders_list->GetListDeprecated().size() > 0) {
       folder_info_dict = absl::make_optional<base::Value>(
-          conflict_folders_list->GetList()[0].Clone());
+          conflict_folders_list->GetListDeprecated()[0].Clone());
     }
   }
 
diff --git a/chrome/browser/enterprise/connectors/file_system/service_settings.cc b/chrome/browser/enterprise/connectors/file_system/service_settings.cc
index 61ac81bd1..fbc33b2 100644
--- a/chrome/browser/enterprise/connectors/file_system/service_settings.cc
+++ b/chrome/browser/enterprise/connectors/file_system/service_settings.cc
@@ -48,9 +48,9 @@
   url_matcher_ = std::make_unique<url_matcher::URLMatcher>();
   URLMatchingID id(0);
   const base::Value* enable = settings_value.FindListKey(kKeyEnable);
-  if (enable && enable->is_list() && !enable->GetList().empty()) {
+  if (enable && enable->is_list() && !enable->GetListDeprecated().empty()) {
     filters_validated_ = true;
-    for (const base::Value& value : enable->GetList()) {
+    for (const base::Value& value : enable->GetListDeprecated()) {
       filters_validated_ &=
           AddUrlPatternSettings(value, /* enabled = */ true, &id);
     }
@@ -62,8 +62,8 @@
   }
 
   const base::Value* disable = settings_value.FindListKey(kKeyDisable);
-  if (disable && disable->is_list() && !disable->GetList().empty()) {
-    for (const base::Value& value : disable->GetList()) {
+  if (disable && disable->is_list() && !disable->GetListDeprecated().empty()) {
+    for (const base::Value& value : disable->GetListDeprecated()) {
       filters_validated_ &=
           AddUrlPatternSettings(value, /* enabled = */ false, &id);
     }
@@ -206,7 +206,7 @@
     return false;
   }
 
-  for (const base::Value& url : url_list->GetList())
+  for (const base::Value& url : url_list->GetListDeprecated())
     CHECK(url.is_string());
 
   // This pre-increments the id by size of url_list_value.
@@ -220,7 +220,7 @@
 
   URLPatternSettings setting;
   bool has_wildcard = false;
-  for (const base::Value& mime_type : mime_types->GetList()) {
+  for (const base::Value& mime_type : mime_types->GetListDeprecated()) {
     if (mime_type.is_string()) {
       const std::string& m = mime_type.GetString();
       setting.mime_types.insert(m);
diff --git a/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc
index 22e24ae..fa0678b 100644
--- a/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc
+++ b/chrome/browser/enterprise/connectors/reporting/reporting_service_settings.cc
@@ -57,7 +57,7 @@
       settings_value.FindListKey(kKeyEnabledEventNames);
   if (enabled_event_name_list_value) {
     for (const base::Value& enabled_event_name_value :
-         enabled_event_name_list_value->GetList()) {
+         enabled_event_name_list_value->GetListDeprecated()) {
       if (enabled_event_name_value.is_string())
         enabled_event_names_.insert(enabled_event_name_value.GetString());
       else
diff --git a/chrome/browser/enterprise/connectors/service_provider_config.cc b/chrome/browser/enterprise/connectors/service_provider_config.cc
index 80ae32b8..bbe85ee 100644
--- a/chrome/browser/enterprise/connectors/service_provider_config.cc
+++ b/chrome/browser/enterprise/connectors/service_provider_config.cc
@@ -65,7 +65,7 @@
     return;
 
   for (const base::Value& service_provider_value :
-       service_providers->GetList()) {
+       service_providers->GetListDeprecated()) {
     const std::string* name = service_provider_value.FindStringKey(kKeyName);
     if (name)
       service_providers_.emplace(*name, service_provider_value);
@@ -118,7 +118,7 @@
     const base::Value* supported_tags =
         analysis->FindListKey(kKeySupportedTags);
     if (supported_tags) {
-      for (const base::Value& tag : supported_tags->GetList()) {
+      for (const base::Value& tag : supported_tags->GetListDeprecated()) {
         if (!tag.is_dict())
           continue;
 
@@ -169,7 +169,7 @@
 
     const base::Value* scopes = file_system->FindListKey(kKeyFsScopes);
     if (scopes) {
-      for (const base::Value& scope : scopes->GetList()) {
+      for (const base::Value& scope : scopes->GetListDeprecated()) {
         if (!scope.is_string())
           continue;
 
@@ -179,7 +179,7 @@
 
     const base::Value* disbles = file_system->FindListKey(kKeyFsDisable);
     if (disbles) {
-      for (const base::Value& disable : disbles->GetList()) {
+      for (const base::Value& disable : disbles->GetListDeprecated()) {
         if (!disable.is_string())
           continue;
 
@@ -199,7 +199,7 @@
 
   const base::Value* mime_types = tag_value.FindListKey(kKeyMimeTypes);
   if (mime_types) {
-    for (const base::Value& mime_type : mime_types->GetList()) {
+    for (const base::Value& mime_type : mime_types->GetListDeprecated()) {
       if (!mime_type.is_string())
         continue;
 
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn
index 6b0cae6..0d8450b5 100644
--- a/chrome/browser/extensions/BUILD.gn
+++ b/chrome/browser/extensions/BUILD.gn
@@ -61,6 +61,8 @@
     "api/bookmarks/bookmark_api_helpers.h",
     "api/bookmarks/bookmarks_api.cc",
     "api/bookmarks/bookmarks_api.h",
+    "api/bookmarks/bookmarks_api_watcher.cc",
+    "api/bookmarks/bookmarks_api_watcher.h",
     "api/braille_display_private/braille_controller.h",
     "api/braille_display_private/braille_controller_brlapi.h",
     "api/braille_display_private/braille_display_private_api.cc",
@@ -1087,15 +1089,15 @@
       "api/terminal/terminal_private_api.h",
       "api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.cc",
       "api/virtual_keyboard_private/chrome_virtual_keyboard_delegate.h",
+      "ash_extension_keeplist_manager.cc",
+      "ash_extension_keeplist_manager.h",
       "chrome_kiosk_delegate_chromeos.cc",
       "extension_assets_manager_chromeos.cc",
       "extension_assets_manager_chromeos.h",
-      "ash_extension_keeplist_manager.cc",
-      "ash_extension_keeplist_manager.h",
-      "extension_keeplist_ash.cc",
-      "extension_keeplist_ash.h",
       "extension_garbage_collector_chromeos.cc",
       "extension_garbage_collector_chromeos.h",
+      "extension_keeplist_ash.cc",
+      "extension_keeplist_ash.h",
       "system_display/display_info_provider_chromeos.cc",
       "system_display/display_info_provider_chromeos.h",
       "updater/chromeos_extension_cache_delegate.cc",
diff --git a/chrome/browser/extensions/active_tab_permission_granter.cc b/chrome/browser/extensions/active_tab_permission_granter.cc
index 32e3494..3c487b7 100644
--- a/chrome/browser/extensions/active_tab_permission_granter.cc
+++ b/chrome/browser/extensions/active_tab_permission_granter.cc
@@ -45,7 +45,7 @@
 void UpdateTabSpecificPermissions(const std::string& extension_id,
                                   const extensions::URLPatternSet& new_hosts,
                                   int tab_id,
-                                  bool update_origin_whitelist,
+                                  bool update_origin_allowlist,
                                   content::RenderProcessHost* process) {
   mojom::Renderer* renderer =
       RendererStartupHelperFactory::GetForBrowserContext(
@@ -53,13 +53,13 @@
           ->GetRenderer(process);
   if (renderer) {
     renderer->UpdateTabSpecificPermissions(extension_id, new_hosts.Clone(),
-                                           tab_id, update_origin_whitelist);
+                                           tab_id, update_origin_allowlist);
   }
 }
 
 void ClearTabSpecificPermissions(const std::vector<std::string>& extension_ids,
                                  int tab_id,
-                                 bool update_origin_whitelist,
+                                 bool update_origin_allowlist,
                                  content::RenderProcessHost* process) {
   mojom::Renderer* renderer =
       RendererStartupHelperFactory::GetForBrowserContext(
@@ -67,7 +67,7 @@
           ->GetRenderer(process);
   if (renderer) {
     renderer->ClearTabSpecificPermissions(extension_ids, tab_id,
-                                          update_origin_whitelist);
+                                          update_origin_allowlist);
   }
 }
 
diff --git a/chrome/browser/extensions/activity_log/activity_log.cc b/chrome/browser/extensions/activity_log/activity_log.cc
index ec0983e..e536a3bd 100644
--- a/chrome/browser/extensions/activity_log/activity_log.cc
+++ b/chrome/browser/extensions/activity_log/activity_log.cc
@@ -262,7 +262,8 @@
   int url_index = api_info->arg_url_index;
 
   if (!action->args() || url_index < 0 ||
-      static_cast<size_t>(url_index) >= action->args()->GetList().size())
+      static_cast<size_t>(url_index) >=
+          action->args()->GetListDeprecated().size())
     return;
 
   // Do not overwrite an existing arg_url value in the Action, so that callers
@@ -270,7 +271,7 @@
   if (action->arg_url().is_valid())
     return;
 
-  base::Value::ListView args_list = action->mutable_args()->GetList();
+  base::Value::ListView args_list = action->mutable_args()->GetListDeprecated();
 
   GURL arg_url;
   bool arg_incognito = action->page_incognito();
diff --git a/chrome/browser/extensions/activity_log/activity_log_unittest.cc b/chrome/browser/extensions/activity_log/activity_log_unittest.cc
index d8e6260d..08a9f56 100644
--- a/chrome/browser/extensions/activity_log/activity_log_unittest.cc
+++ b/chrome/browser/extensions/activity_log/activity_log_unittest.cc
@@ -116,13 +116,13 @@
   void UpdateTabSpecificPermissions(const std::string& extension_id,
                                     URLPatternSet new_hosts,
                                     int tab_id,
-                                    bool update_origin_whitelist) override {}
+                                    bool update_origin_allowlist) override {}
   void UpdateUserScripts(base::ReadOnlySharedMemoryRegion shared_memory,
                          mojom::HostIDPtr host_id) override {}
   void ClearTabSpecificPermissions(
       const std::vector<std::string>& extension_ids,
       int tab_id,
-      bool update_origin_whitelist) override {}
+      bool update_origin_allowlist) override {}
   void WatchPages(const std::vector<std::string>& css_selectors) override {}
 
   mojo::AssociatedReceiverSet<mojom::Renderer> receivers_;
diff --git a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
index 9408353..71b8dcb 100644
--- a/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
+++ b/chrome/browser/extensions/api/autofill_private/autofill_private_api.cc
@@ -115,7 +115,7 @@
                                        const std::string& country_code,
                                        base::Value* list_value) {
   DCHECK(list_value->is_list());
-  base::Value::ListView list = list_value->GetList();
+  base::Value::ListView list = list_value->GetListDeprecated();
   if (list.size() <= index) {
     NOTREACHED() << "List should have a value at index " << index;
     return;
diff --git a/chrome/browser/extensions/api/automation/automation_apitest.cc b/chrome/browser/extensions/api/automation/automation_apitest.cc
index e365967..8ecfc29 100644
--- a/chrome/browser/extensions/api/automation/automation_apitest.cc
+++ b/chrome/browser/extensions/api/automation/automation_apitest.cc
@@ -613,7 +613,7 @@
 
   int renderer_total_dur = 0;
   int automation_total_dur = 0;
-  for (const base::Value& event : trace_events->GetList()) {
+  for (const base::Value& event : trace_events->GetListDeprecated()) {
     const std::string* cat = event.FindStringKey("cat");
     if (!cat || *cat != "accessibility")
       continue;
diff --git a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
index 9ca2f32..4649df14 100644
--- a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
+++ b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
@@ -29,6 +29,7 @@
 #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
 #include "chrome/browser/extensions/api/bookmarks/bookmark_api_constants.h"
 #include "chrome/browser/extensions/api/bookmarks/bookmark_api_helpers.h"
+#include "chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h"
 #include "chrome/browser/importer/external_process_importer_host.h"
 #include "chrome/browser/importer/importer_uma.h"
 #include "chrome/browser/platform_util.h"
@@ -47,11 +48,9 @@
 #include "components/user_prefs/user_prefs.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_service.h"
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/event_router.h"
 #include "extensions/browser/extension_function_dispatcher.h"
-#include "extensions/browser/notification_types.h"
 #include "ui/base/l10n/l10n_util.h"
 
 using bookmarks::BookmarkModel;
@@ -215,10 +214,8 @@
 void BookmarksFunction::OnResponded() {
   DCHECK(response_type());
   if (*response_type() == ExtensionFunction::SUCCEEDED) {
-    content::NotificationService::current()->Notify(
-        extensions::NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED,
-        content::Source<const Extension>(extension()),
-        content::Details<const BookmarksFunction>(this));
+    BookmarksApiWatcher::GetForBrowserContext(browser_context())
+        ->NotifyApiInvoked(extension(), this);
   }
 }
 
diff --git a/chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.cc b/chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.cc
new file mode 100644
index 0000000..19e05c7
--- /dev/null
+++ b/chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.cc
@@ -0,0 +1,70 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h"
+
+#include "base/memory/singleton.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+namespace extensions {
+namespace {
+
+class BookmarksApiWatcherFactory : public BrowserContextKeyedServiceFactory {
+ public:
+  static BookmarksApiWatcher* GetForBrowserContext(
+      content::BrowserContext* context) {
+    return static_cast<BookmarksApiWatcher*>(
+        GetInstance()->GetServiceForBrowserContext(context, true));
+  }
+
+  static BookmarksApiWatcherFactory* GetInstance() {
+    return base::Singleton<BookmarksApiWatcherFactory>::get();
+  }
+
+  BookmarksApiWatcherFactory()
+      : BrowserContextKeyedServiceFactory(
+            "BookmarksApiWatcher",
+            BrowserContextDependencyManager::GetInstance()) {}
+
+ private:
+  // BrowserContextKeyedServiceFactory overrides
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override {
+    return new BookmarksApiWatcher();
+  }
+
+  content::BrowserContext* GetBrowserContextToUse(
+      content::BrowserContext* context) const override {
+    return context;
+  }
+};
+
+}  // namespace
+
+BookmarksApiWatcher::BookmarksApiWatcher() = default;
+BookmarksApiWatcher::~BookmarksApiWatcher() = default;
+
+// static
+BookmarksApiWatcher* BookmarksApiWatcher::GetForBrowserContext(
+    content::BrowserContext* browser_context) {
+  return BookmarksApiWatcherFactory::GetForBrowserContext(browser_context);
+}
+
+void BookmarksApiWatcher::AddObserver(Observer* observer) {
+  observers_.AddObserver(observer);
+}
+
+void BookmarksApiWatcher::RemoveObserver(Observer* observer) {
+  observers_.RemoveObserver(observer);
+}
+
+void BookmarksApiWatcher::NotifyApiInvoked(
+    const extensions::Extension* extension,
+    const extensions::BookmarksFunction* func) {
+  for (auto& observer : observers_)
+    observer.OnBookmarksApiInvoked(extension, func);
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h b/chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h
new file mode 100644
index 0000000..7842b00
--- /dev/null
+++ b/chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h
@@ -0,0 +1,52 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_API_BOOKMARKS_BOOKMARKS_API_WATCHER_H_
+#define CHROME_BROWSER_EXTENSIONS_API_BOOKMARKS_BOOKMARKS_API_WATCHER_H_
+
+#include "base/observer_list.h"
+#include "base/observer_list_types.h"
+#include "build/build_config.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+#include "content/public/browser/browser_context.h"
+
+namespace extensions {
+class BookmarksFunction;
+class Extension;
+
+// This KeyedService is meant to observe the bookmark api and provide
+// notifications
+class BookmarksApiWatcher : public KeyedService {
+ public:
+  class Observer : public base::CheckedObserver {
+   public:
+    // Notifies listeners that the bookmark API was invoked.
+    virtual void OnBookmarksApiInvoked(
+        const extensions::Extension* extension,
+        const extensions::BookmarksFunction* func) {}
+  };
+
+  static BookmarksApiWatcher* GetForBrowserContext(
+      content::BrowserContext* browser_context);
+
+  BookmarksApiWatcher();
+  ~BookmarksApiWatcher() override;
+  BookmarksApiWatcher(const BookmarksApiWatcher&) = delete;
+  BookmarksApiWatcher& operator=(const BookmarksApiWatcher&) = delete;
+
+  void NotifyApiInvoked(const extensions::Extension* extension,
+                        const extensions::BookmarksFunction* func);
+
+  // Add/remove observer.
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
+ private:
+  base::ObserverList<Observer> observers_;
+};
+
+}  // namespace extensions
+
+#endif  // CHROME_BROWSER_EXTENSIONS_API_BOOKMARKS_BOOKMARKS_API_WATCHER_H_
diff --git a/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h b/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h
index 06a1bb7..d1f0c51 100644
--- a/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h
+++ b/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.h
@@ -13,6 +13,7 @@
 #include "base/files/file_path_watcher.h"
 #include "base/memory/singleton.h"
 #include "base/observer_list.h"
+#include "base/time/time.h"
 #include "chrome/browser/extensions/api/braille_display_private/braille_controller.h"
 #include "chrome/browser/extensions/api/braille_display_private/brlapi_connection.h"
 #include "library_loaders/libbrlapi.h"
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
index 7acbd3cb..74465113 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.cc
@@ -104,9 +104,9 @@
   void GetBucketsForArgs(const base::Value* args,
                          QuotaLimitHeuristic::BucketList* buckets) override {
     DCHECK(args->is_list());
-    if (args->GetList().empty())
+    if (args->GetListDeprecated().empty())
       return;
-    const base::Value& details = args->GetList()[0];
+    const base::Value& details = args->GetListDeprecated()[0];
     if (!details.is_dict())
       return;
     const base::Value* sign_request_id =
diff --git a/chrome/browser/extensions/api/chrome_extensions_api_client.cc b/chrome/browser/extensions/api/chrome_extensions_api_client.cc
index b13f110..38c4681 100644
--- a/chrome/browser/extensions/api/chrome_extensions_api_client.cc
+++ b/chrome/browser/extensions/api/chrome_extensions_api_client.cc
@@ -335,7 +335,7 @@
   const base::ListValue* policy_list;
   if (ash::CrosSettings::Get()->GetList(ash::kUsbDetachableAllowlist,
                                         &policy_list)) {
-    for (const auto& entry : policy_list->GetList()) {
+    for (const auto& entry : policy_list->GetListDeprecated()) {
       if (entry.FindIntKey(ash::kUsbDetachableAllowlistKeyVid) == vid &&
           entry.FindIntKey(ash::kUsbDetachableAllowlistKeyPid) == pid) {
         return true;
diff --git a/chrome/browser/extensions/api/cookies/cookies_api.cc b/chrome/browser/extensions/api/cookies/cookies_api.cc
index f73d567..f30e82d9 100644
--- a/chrome/browser/extensions/api/cookies/cookies_api.cc
+++ b/chrome/browser/extensions/api/cookies/cookies_api.cc
@@ -578,12 +578,12 @@
   }
   // Return a list of all cookie stores with at least one open tab.
   std::vector<api::cookies::CookieStore> cookie_stores;
-  if (original_tab_ids->GetList().size() > 0) {
+  if (original_tab_ids->GetListDeprecated().size() > 0) {
     cookie_stores.push_back(cookies_helpers::CreateCookieStore(
         original_profile, std::move(original_tab_ids)));
   }
-  if (incognito_tab_ids.get() && incognito_tab_ids->GetList().size() > 0 &&
-      incognito_profile) {
+  if (incognito_tab_ids.get() &&
+      incognito_tab_ids->GetListDeprecated().size() > 0 && incognito_profile) {
     cookie_stores.push_back(cookies_helpers::CreateCookieStore(
         incognito_profile, std::move(incognito_tab_ids)));
   }
diff --git a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
index db3ded58..2e19fb2 100644
--- a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
+++ b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
@@ -203,7 +203,7 @@
   const base::Value* const permit_attestation =
       prefs->GetList(prefs::kSecurityKeyPermitAttestation);
 
-  for (const auto& entry : permit_attestation->GetList()) {
+  for (const auto& entry : permit_attestation->GetListDeprecated()) {
     if (entry.GetString() == app_id)
       return RespondNow(OneArgument(base::Value(true)));
   }
diff --git a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc
index 12e4389..bea14b5 100644
--- a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api_unittest.cc
@@ -43,17 +43,17 @@
     return false;
   }
 
-  if (result_list->GetList().size() != 1u) {
+  if (result_list->GetListDeprecated().size() != 1u) {
     ADD_FAILURE() << "Invalid number of results.";
     return false;
   }
 
-  if (!result_list->GetList()[0].is_bool()) {
+  if (!result_list->GetListDeprecated()[0].is_bool()) {
     ADD_FAILURE() << "Result is not boolean.";
     return false;
   }
 
-  *result = result_list->GetList()[0].GetBool();
+  *result = result_list->GetListDeprecated()[0].GetBool();
   return true;
 }
 
@@ -185,7 +185,7 @@
   ASSERT_TRUE(extension_function_test_utils::RunFunction(
       function.get(), base::ListValue::From(std::move(args)), browser(),
       api_test_utils::NONE));
-  ASSERT_EQ(function->GetResultList()->GetList().size(), 0u);
+  ASSERT_EQ(function->GetResultList()->GetListDeprecated().size(), 0u);
 
   web_feature_waiter.Wait();
 }
@@ -211,7 +211,7 @@
   ASSERT_TRUE(extension_function_test_utils::RunFunction(
       function.get(), base::ListValue::From(std::move(args)), browser(),
       api_test_utils::NONE));
-  ASSERT_EQ(function->GetResultList()->GetList().size(), 0u);
+  ASSERT_EQ(function->GetResultList()->GetListDeprecated().size(), 0u);
 
   web_feature_waiter.Wait();
 }
diff --git a/chrome/browser/extensions/api/declarative_content/content_action.cc b/chrome/browser/extensions/api/declarative_content/content_action.cc
index 64c5f4f..6f801d4 100644
--- a/chrome/browser/extensions/api/declarative_content/content_action.cc
+++ b/chrome/browser/extensions/api/declarative_content/content_action.cc
@@ -264,14 +264,16 @@
     return false;
   }
   if (css) {
-    if (!css->is_list() || !AppendJSStringsToCPPStrings(
-                               css->GetList(), &script_data->css_file_names)) {
+    if (!css->is_list() ||
+        !AppendJSStringsToCPPStrings(css->GetListDeprecated(),
+                                     &script_data->css_file_names)) {
       return false;
     }
   }
   if (js) {
-    if (!js->is_list() || !AppendJSStringsToCPPStrings(
-                              js->GetList(), &script_data->js_file_names)) {
+    if (!js->is_list() ||
+        !AppendJSStringsToCPPStrings(js->GetListDeprecated(),
+                                     &script_data->js_file_names)) {
       return false;
     }
   }
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
index a24ea50..a3d06ba 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
@@ -509,7 +509,7 @@
     if (expected_rules_count)
       rules_count = *expected_rules_count;
     else if (rules_value_ && rules_value_->is_list())
-      rules_count = rules_value_->GetList().size();
+      rules_count = rules_value_->GetListDeprecated().size();
     else
       rules_count = rules_list_.size();
 
diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
index dbe4a9cd..d7aa7a2 100644
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_action_unittest.cc
@@ -54,7 +54,7 @@
   CHECK(parsed_value->is_list());
 
   WebRequestActionSet::Values actions;
-  for (const base::Value& entry : parsed_value->GetList()) {
+  for (const base::Value& entry : parsed_value->GetListDeprecated()) {
     CHECK(entry.is_dict());
     actions.push_back(base::DictionaryValue::From(
         base::Value::ToUniquePtrValue(entry.Clone())));
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index 70c8b39..6e88c7b 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -82,7 +82,6 @@
 #include "extensions/browser/management_policy.h"
 #include "extensions/browser/notification_types.h"
 #include "extensions/browser/path_util.h"
-#include "extensions/browser/permissions_manager.h"
 #include "extensions/browser/process_manager_factory.h"
 #include "extensions/browser/ui_util.h"
 #include "extensions/browser/warning_service.h"
@@ -259,6 +258,20 @@
   return pattern;
 }
 
+developer::UserSiteSettings ConvertToUserSiteSettings(
+    const PermissionsManager::UserPermissionsSettings& settings) {
+  api::developer_private::UserSiteSettings user_site_settings;
+  user_site_settings.permitted_sites.reserve(settings.permitted_sites.size());
+  for (const auto& origin : settings.permitted_sites)
+    user_site_settings.permitted_sites.push_back(origin.Serialize());
+
+  user_site_settings.restricted_sites.reserve(settings.restricted_sites.size());
+  for (const auto& origin : settings.restricted_sites)
+    user_site_settings.restricted_sites.push_back(origin.Serialize());
+
+  return user_site_settings;
+}
+
 }  // namespace
 
 namespace ChoosePath = api::developer_private::ChoosePath;
@@ -336,6 +349,7 @@
   DependsOn(CommandService::GetFactoryInstance());
   DependsOn(EventRouterFactory::GetInstance());
   DependsOn(ExtensionSystemFactory::GetInstance());
+  DependsOn(PermissionsManager::GetFactory());
 }
 
 // static
@@ -362,6 +376,7 @@
   command_service_observation_.Observe(CommandService::Get(profile));
   extension_allowlist_observer_.Observe(
       ExtensionSystem::Get(profile)->extension_service()->allowlist());
+  permissions_manager_observation_.Observe(PermissionsManager::Get(profile));
   pref_change_registrar_.Init(profile->GetPrefs());
   // The unretained is safe, since the PrefChangeRegistrar unregisters the
   // callback on destruction.
@@ -524,6 +539,19 @@
     BroadcastItemStateChanged(developer::EVENT_TYPE_WARNINGS_CHANGED, id);
 }
 
+void DeveloperPrivateEventRouter::UserPermissionsSettingsChanged(
+    const PermissionsManager::UserPermissionsSettings& settings) {
+  developer::UserSiteSettings user_site_settings =
+      ConvertToUserSiteSettings(settings);
+  std::vector<base::Value> args;
+  args.push_back(base::Value::FromUniquePtrValue(user_site_settings.ToValue()));
+
+  auto event = std::make_unique<Event>(
+      events::DEVELOPER_PRIVATE_ON_USER_SITE_SETTINGS_CHANGED,
+      developer::OnUserSiteSettingsChanged::kEventName, std::move(args));
+  event_router_->BroadcastEvent(std::move(event));
+}
+
 void DeveloperPrivateEventRouter::Observe(
     int type,
     const content::NotificationSource& source,
@@ -648,6 +676,8 @@
 void DeveloperPrivateAPI::RegisterNotifications() {
   EventRouter::Get(profile_)->RegisterObserver(
       this, developer::OnItemStateChanged::kEventName);
+  EventRouter::Get(profile_)->RegisterObserver(
+      this, developer::OnUserSiteSettingsChanged::kEventName);
 }
 
 const DeveloperPrivateAPI::WebContentsData*
@@ -688,8 +718,10 @@
 void DeveloperPrivateAPI::OnListenerRemoved(
     const EventListenerInfo& details) {
   if (!EventRouter::Get(profile_)->HasEventListener(
-          developer::OnItemStateChanged::kEventName)) {
-    developer_private_event_router_.reset(NULL);
+          developer::OnItemStateChanged::kEventName) &&
+      !EventRouter::Get(profile_)->HasEventListener(
+          developer::OnUserSiteSettingsChanged::kEventName)) {
+    developer_private_event_router_.reset(nullptr);
   } else {
     developer_private_event_router_->RemoveExtensionId(details.extension_id);
   }
@@ -2119,17 +2151,8 @@
 
 ExtensionFunction::ResponseAction
 DeveloperPrivateGetUserSiteSettingsFunction::Run() {
-  const PermissionsManager::UserPermissionsSettings& settings =
-      PermissionsManager::Get(browser_context())->GetUserPermissionsSettings();
-
-  developer::UserSiteSettings user_site_settings;
-  user_site_settings.permitted_sites.reserve(settings.permitted_sites.size());
-  for (const auto& origin : settings.permitted_sites)
-    user_site_settings.permitted_sites.push_back(origin.Serialize());
-
-  user_site_settings.restricted_sites.reserve(settings.restricted_sites.size());
-  for (const auto& origin : settings.restricted_sites)
-    user_site_settings.restricted_sites.push_back(origin.Serialize());
+  developer::UserSiteSettings user_site_settings = ConvertToUserSiteSettings(
+      PermissionsManager::Get(browser_context())->GetUserPermissionsSettings());
 
   return RespondNow(OneArgument(
       base::Value::FromUniquePtrValue(user_site_settings.ToValue())));
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.h b/chrome/browser/extensions/api/developer_private/developer_private_api.h
index 6264309..d21d2ea 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.h
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.h
@@ -34,6 +34,7 @@
 #include "extensions/browser/extension_prefs_observer.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
+#include "extensions/browser/permissions_manager.h"
 #include "extensions/browser/process_manager.h"
 #include "extensions/browser/process_manager_observer.h"
 #include "extensions/browser/warning_service.h"
@@ -71,7 +72,8 @@
                                     public ExtensionAllowlist::Observer,
                                     public ExtensionManagement::Observer,
                                     public WarningService::Observer,
-                                    public content::NotificationObserver {
+                                    public content::NotificationObserver,
+                                    public PermissionsManager::Observer {
  public:
   explicit DeveloperPrivateEventRouter(Profile* profile);
 
@@ -145,6 +147,10 @@
                const content::NotificationSource& source,
                const content::NotificationDetails& details) override;
 
+  // PermissionsManager::Observer:
+  void UserPermissionsSettingsChanged(
+      const PermissionsManager::UserPermissionsSettings& settings) override;
+
   // Handles a profile preference change.
   void OnProfilePrefChanged();
 
@@ -175,6 +181,8 @@
       command_service_observation_{this};
   base::ScopedObservation<ExtensionAllowlist, ExtensionAllowlist::Observer>
       extension_allowlist_observer_{this};
+  base::ScopedObservation<PermissionsManager, PermissionsManager::Observer>
+      permissions_manager_observation_{this};
 
   raw_ptr<Profile> profile_;
 
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
index b8c078f..fc3f751 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api_unittest.cc
@@ -98,10 +98,10 @@
 
   const Event& event = *iter->second;
   CHECK(event.event_args);
-  CHECK_GE(1u, event.event_args->GetList().size());
+  CHECK_GE(1u, event.event_args->GetListDeprecated().size());
   std::unique_ptr<api::developer_private::EventData> event_data =
       api::developer_private::EventData::FromValue(
-          event.event_args->GetList()[0]);
+          event.event_args->GetListDeprecated()[0]);
   if (!event_data)
     return false;
 
@@ -113,6 +113,50 @@
   return true;
 }
 
+bool WasUserSiteSettingsChangedEventDispatched(
+    const TestEventRouterObserver& observer,
+    api::developer_private::UserSiteSettings* settings) {
+  const std::string kEventName =
+      api::developer_private::OnUserSiteSettingsChanged::kEventName;
+  const auto& event_map = observer.events();
+  auto iter = event_map.find(kEventName);
+  if (iter == event_map.end())
+    return false;
+
+  const Event& event = *iter->second;
+  CHECK(event.event_args);
+  CHECK_GE(1u, event.event_args->GetList().size());
+  auto site_settings = api::developer_private::UserSiteSettings::FromValue(
+      event.event_args->GetList()[0]);
+  if (!site_settings)
+    return false;
+
+  *settings = std::move(*site_settings);
+  return true;
+}
+
+void AddUserSpecifiedSite(Profile* profile, const char* site, bool restricted) {
+  scoped_refptr<ExtensionFunction> function =
+      base::MakeRefCounted<api::DeveloperPrivateAddUserSpecifiedSiteFunction>();
+  std::string args =
+      base::StringPrintf(R"([{"siteList":"%s","host":"%s"}])",
+                         restricted ? "RESTRICTED" : "PERMITTED", site);
+  EXPECT_TRUE(api_test_utils::RunFunction(function.get(), args, profile))
+      << function->GetError();
+}
+
+void RemoveUserSpecifiedSite(Profile* profile,
+                             const char* site,
+                             bool restricted) {
+  scoped_refptr<ExtensionFunction> function = base::MakeRefCounted<
+      api::DeveloperPrivateRemoveUserSpecifiedSiteFunction>();
+  std::string args =
+      base::StringPrintf(R"([{"siteList":"%s","host":"%s"}])",
+                         restricted ? "RESTRICTED" : "PERMITTED", site);
+  EXPECT_TRUE(api_test_utils::RunFunction(function.get(), args, profile))
+      << function->GetError();
+}
+
 }  // namespace
 
 class DeveloperPrivateApiUnitTest : public ExtensionServiceTestWithInstall {
@@ -291,7 +335,8 @@
 
   // Extract the result. We don't have to test this here, since it's verified as
   // part of the general extension api system.
-  const base::Value& response_value = function->GetResultList()->GetList()[0];
+  const base::Value& response_value =
+      function->GetResultList()->GetListDeprecated()[0];
   std::unique_ptr<api::developer_private::PackDirectoryResponse> response =
       api::developer_private::PackDirectoryResponse::FromValue(response_value);
   CHECK(response);
@@ -329,8 +374,9 @@
   EXPECT_TRUE(RunFunction(function, args)) << function->GetError();
 
   ASSERT_TRUE(function->GetResultList());
-  ASSERT_EQ(1u, function->GetResultList()->GetList().size());
-  const base::Value& response_value = function->GetResultList()->GetList()[0];
+  ASSERT_EQ(1u, function->GetResultList()->GetListDeprecated().size());
+  const base::Value& response_value =
+      function->GetResultList()->GetListDeprecated()[0];
   *profile_info =
       api::developer_private::ProfileInfo::FromValue(response_value);
 }
@@ -501,7 +547,8 @@
   const base::Value* result_list = function->GetResultList();
   ASSERT_TRUE(result_list);
   ASSERT_TRUE(result_list->is_list());
-  base::Value::ConstListView result_list_view = result_list->GetList();
+  base::Value::ConstListView result_list_view =
+      result_list->GetListDeprecated();
   ASSERT_GT(result_list_view.size(), 0u);
   ASSERT_TRUE(result_list_view[0].is_string());
   path = result_list_view[0].GetString();
@@ -520,7 +567,7 @@
   result_list = function->GetResultList();
   ASSERT_TRUE(result_list);
   ASSERT_TRUE(result_list->is_list());
-  result_list_view = result_list->GetList();
+  result_list_view = result_list->GetListDeprecated();
   ASSERT_GT(result_list_view.size(), 0u);
   ASSERT_TRUE(result_list_view[0].is_string());
   path = result_list_view[0].GetString();
@@ -1024,7 +1071,8 @@
   file_source_args.Append(properties.ToValue());
   EXPECT_TRUE(RunFunction(function, file_source_args)) << function->GetError();
 
-  const base::Value& response_value = function->GetResultList()->GetList()[0];
+  const base::Value& response_value =
+      function->GetResultList()->GetListDeprecated()[0];
   std::unique_ptr<api::developer_private::RequestFileSourceResponse> response =
       api::developer_private::RequestFileSourceResponse::FromValue(
           response_value);
@@ -1047,7 +1095,7 @@
       new api::DeveloperPrivateGetExtensionsInfoFunction());
   EXPECT_TRUE(RunFunction(function, base::ListValue())) << function->GetError();
   const base::ListValue* results = function->GetResultList();
-  base::Value::ConstListView results_list = results->GetList();
+  base::Value::ConstListView results_list = results->GetListDeprecated();
   ASSERT_EQ(1u, results_list.size());
   ASSERT_TRUE(results_list[0].is_list());
   base::Value::ConstListView list = results_list[0].GetList();
@@ -1064,7 +1112,7 @@
   args.Append(false);
   EXPECT_TRUE(RunFunction(function, args)) << function->GetError();
   results = function->GetResultList();
-  results_list = results->GetList();
+  results_list = results->GetListDeprecated();
   ASSERT_EQ(1u, results_list.size());
   ASSERT_TRUE(results_list[0].is_list());
   list = results_list[0].GetList();
@@ -1820,8 +1868,9 @@
   base::ListValue args;
   EXPECT_TRUE(RunFunction(function, args)) << function->GetError();
   ASSERT_TRUE(function->GetResultList());
-  ASSERT_EQ(1u, function->GetResultList()->GetList().size());
-  const base::Value& response_value = function->GetResultList()->GetList()[0];
+  ASSERT_EQ(1u, function->GetResultList()->GetListDeprecated().size());
+  const base::Value& response_value =
+      function->GetResultList()->GetListDeprecated()[0];
   std::unique_ptr<api::developer_private::UserSiteSettings> settings =
       api::developer_private::UserSiteSettings::FromValue(response_value);
 
@@ -1843,31 +1892,14 @@
   const url::Origin chromium_url = url::Origin::Create(GURL(kChromium));
   const url::Origin google_url = url::Origin::Create(GURL(kGoogle));
 
-  auto add_site = [this](const char* site, bool restricted) {
-    scoped_refptr<ExtensionFunction> function = base::MakeRefCounted<
-        api::DeveloperPrivateAddUserSpecifiedSiteFunction>();
-    std::string args =
-        base::StringPrintf(R"([{"siteList":"%s","host":"%s"}])",
-                           restricted ? "RESTRICTED" : "PERMITTED", site);
-    EXPECT_TRUE(api_test_utils::RunFunction(function.get(), args, profile()))
-        << function->GetError();
-  };
-
-  auto remove_site = [this](const char* site, bool restricted) {
-    scoped_refptr<ExtensionFunction> function = base::MakeRefCounted<
-        api::DeveloperPrivateRemoveUserSpecifiedSiteFunction>();
-    std::string args =
-        base::StringPrintf(R"([{"siteList":"%s","host":"%s"}])",
-                           restricted ? "RESTRICTED" : "PERMITTED", site);
-    EXPECT_TRUE(api_test_utils::RunFunction(function.get(), args, profile()))
-        << function->GetError();
-  };
-
   // First, add some permitted and restricted sites, and check that these sites
   // are stored in the manager.
-  add_site(kExample, /*restricted=*/false);
-  add_site(kChromium, /*restricted=*/false);
-  add_site(kGoogle, /*restricted=*/true);
+  EXPECT_NO_FATAL_FAILURE(
+      AddUserSpecifiedSite(profile(), kExample, /*restricted=*/false));
+  EXPECT_NO_FATAL_FAILURE(
+      AddUserSpecifiedSite(profile(), kChromium, /*restricted=*/false));
+  EXPECT_NO_FATAL_FAILURE(
+      AddUserSpecifiedSite(profile(), kGoogle, /*restricted=*/true));
 
   PermissionsManager* manager = PermissionsManager::Get(browser_context());
   EXPECT_THAT(manager->GetUserPermissionsSettings().permitted_sites,
@@ -1876,15 +1908,70 @@
               testing::UnorderedElementsAre(google_url));
 
   // Attempting to add a restricted site should remove it as a permitted site.
-  add_site(kChromium, /*restricted=*/true);
-  remove_site(kExample, /*restricted=*/false);
-  remove_site(kGoogle, /*restricted=*/true);
+  EXPECT_NO_FATAL_FAILURE(
+      AddUserSpecifiedSite(profile(), kChromium, /*restricted=*/true));
+  EXPECT_NO_FATAL_FAILURE(
+      RemoveUserSpecifiedSite(profile(), kExample, /*restricted=*/false));
+  EXPECT_NO_FATAL_FAILURE(
+      RemoveUserSpecifiedSite(profile(), kGoogle, /*restricted=*/true));
 
   EXPECT_TRUE(manager->GetUserPermissionsSettings().permitted_sites.empty());
   EXPECT_THAT(manager->GetUserPermissionsSettings().restricted_sites,
               testing::UnorderedElementsAre(chromium_url));
 }
 
+// Test that the OnUserSiteSettingsChanged event is fired whenever the user
+// defined site settings updates.
+TEST_F(DeveloperPrivateApiUnitTest, OnUserSiteSettingsChanged) {
+  static constexpr char kExample[] = "http://example.com";
+
+  // We need to call DeveloperPrivateAPI::Get() in order to instantiate the
+  // keyed service, since it's not created by default in unit tests.
+  DeveloperPrivateAPI::Get(profile());
+  EventRouter* event_router = EventRouter::Get(profile());
+
+  // The DeveloperPrivateEventRouter will only dispatch events if there's at
+  // least one listener to dispatch to. Create one.
+  const char* kEventName =
+      api::developer_private::OnUserSiteSettingsChanged::kEventName;
+  event_router->AddEventListener(kEventName, /*process=*/nullptr,
+                                 crx_file::id_util::GenerateId("listener"));
+
+  TestEventRouterObserver test_observer(event_router);
+
+  api::developer_private::UserSiteSettings settings;
+  EXPECT_FALSE(
+      WasUserSiteSettingsChangedEventDispatched(test_observer, &settings));
+
+  // Add a permitted site, and check that it is contained within the event's
+  // payload.
+  EXPECT_NO_FATAL_FAILURE(
+      AddUserSpecifiedSite(profile(), kExample, /*restricted=*/false));
+  EXPECT_TRUE(
+      WasUserSiteSettingsChangedEventDispatched(test_observer, &settings));
+  EXPECT_THAT(settings.permitted_sites,
+              testing::UnorderedElementsAre(kExample));
+  EXPECT_TRUE(settings.restricted_sites.empty());
+
+  // Add the same site to the restricted site, and check the event that it's
+  // only contained in the restricted list.
+  EXPECT_NO_FATAL_FAILURE(
+      AddUserSpecifiedSite(profile(), kExample, /*restricted=*/true));
+  EXPECT_TRUE(
+      WasUserSiteSettingsChangedEventDispatched(test_observer, &settings));
+  EXPECT_TRUE(settings.permitted_sites.empty());
+  EXPECT_THAT(settings.restricted_sites,
+              testing::UnorderedElementsAre(kExample));
+
+  // Remove the site, and check the event that both lists are empty.
+  EXPECT_NO_FATAL_FAILURE(
+      RemoveUserSpecifiedSite(profile(), kExample, /*restricted=*/true));
+  EXPECT_TRUE(
+      WasUserSiteSettingsChangedEventDispatched(test_observer, &settings));
+  EXPECT_TRUE(settings.permitted_sites.empty());
+  EXPECT_TRUE(settings.restricted_sites.empty());
+}
+
 class DeveloperPrivateApiAllowlistUnitTest
     : public DeveloperPrivateApiUnitTest {
  public:
diff --git a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
index 9511f8f..0b0176a 100644
--- a/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
+++ b/chrome/browser/extensions/api/downloads/downloads_api_browsertest.cc
@@ -1056,7 +1056,7 @@
   ASSERT_TRUE(result);
   download_item = NULL;
   ASSERT_TRUE(result->is_list());
-  base::Value::ListView result_list = result->GetList();
+  base::Value::ListView result_list = result->GetListDeprecated();
   ASSERT_EQ(1UL, result_list.size());
   ASSERT_TRUE(result_list[0].is_int());
   EXPECT_EQ(id, result_list[0].GetInt());
@@ -1199,7 +1199,7 @@
       RunFunctionAndReturnResult(new DownloadsSearchFunction(), "[{}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
 }
 
 // Test that file existence check should be performed after search.
@@ -1218,7 +1218,7 @@
       RunFunctionAndReturnResult(new DownloadsSearchFunction(), "[{}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
 
   // Check file removal update will eventually come. WaitForEvent() will
   // immediately return if the file is already removed.
@@ -1265,8 +1265,8 @@
       new DownloadsSearchFunction(), "[{\"filenameRegex\": \"foobar\"}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
-  const base::Value& item_value = result->GetList()[0];
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
+  const base::Value& item_value = result->GetListDeprecated()[0];
   ASSERT_TRUE(item_value.is_dict());
   absl::optional<int> item_id = item_value.FindIntKey("id");
   ASSERT_TRUE(item_id);
@@ -1285,8 +1285,8 @@
       base::StringPrintf("[{\"id\": %u}]", items[0]->GetId())));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
-  const base::Value& item_value = result->GetList()[0];
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
+  const base::Value& item_value = result->GetListDeprecated()[0];
   ASSERT_TRUE(item_value.is_dict());
   absl::optional<int> item_id = item_value.FindIntKey("id");
   ASSERT_TRUE(item_id);
@@ -1306,7 +1306,7 @@
                                  "[{\"id\": 0, \"filename\": \"foobar\"}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(0UL, result->GetList().size());
+  ASSERT_EQ(0UL, result->GetListDeprecated().size());
 }
 
 // Test a single |orderBy| parameter for search().
@@ -1325,9 +1325,9 @@
       new DownloadsSearchFunction(), "[{\"orderBy\": [\"filename\"]}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(2UL, result->GetList().size());
-  const base::Value& item0_value = result->GetList()[0];
-  const base::Value& item1_value = result->GetList()[1];
+  ASSERT_EQ(2UL, result->GetListDeprecated().size());
+  const base::Value& item0_value = result->GetListDeprecated()[0];
+  const base::Value& item1_value = result->GetListDeprecated()[1];
   ASSERT_TRUE(item0_value.is_dict());
   ASSERT_TRUE(item1_value.is_dict());
   const std::string* item0_name = item0_value.FindStringKey("filename");
@@ -1355,9 +1355,9 @@
       new DownloadsSearchFunction(), "[{\"orderBy\": []}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(2UL, result->GetList().size());
-  const base::Value& item0_value = result->GetList()[0];
-  const base::Value& item1_value = result->GetList()[1];
+  ASSERT_EQ(2UL, result->GetListDeprecated().size());
+  const base::Value& item0_value = result->GetListDeprecated()[0];
+  const base::Value& item1_value = result->GetListDeprecated()[1];
   ASSERT_TRUE(item0_value.is_dict());
   ASSERT_TRUE(item1_value.is_dict());
   const std::string* item0_name = item0_value.FindStringKey("filename");
@@ -1389,7 +1389,7 @@
       new DownloadsSearchFunction(), "[{\"danger\": \"content\"}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
 }
 
 // Test the |state| option for search().
@@ -1405,7 +1405,7 @@
       new DownloadsSearchFunction(), "[{\"state\": \"in_progress\"}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
 }
 
 // Test the |limit| option for search().
@@ -1419,7 +1419,7 @@
       new DownloadsSearchFunction(), "[{\"limit\": 1}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
 }
 
 // Test invalid search parameters.
@@ -1463,8 +1463,8 @@
                                  "\"limit\": 1}]"));
   ASSERT_TRUE(result.get());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(1UL, result->GetList().size());
-  const base::Value& item_value = result->GetList()[0];
+  ASSERT_EQ(1UL, result->GetListDeprecated().size());
+  const base::Value& item_value = result->GetListDeprecated()[0];
   ASSERT_TRUE(item_value.is_dict());
   const std::string* item_name = item_value.FindStringKey("filename");
   ASSERT_TRUE(item_name);
@@ -1504,9 +1504,9 @@
       RunFunctionAndReturnResult(new DownloadsSearchFunction(), "[{}]");
   ASSERT_TRUE(result_value.get());
   ASSERT_TRUE(result_value->is_list());
-  ASSERT_EQ(2UL, result_value->GetList().size());
+  ASSERT_EQ(2UL, result_value->GetListDeprecated().size());
   {
-    const base::Value& result_dict = result_value->GetList()[0];
+    const base::Value& result_dict = result_value->GetListDeprecated()[0];
     ASSERT_TRUE(result_dict.is_dict());
     const std::string* filename = result_dict.FindStringKey("filename");
     ASSERT_TRUE(filename);
@@ -1517,7 +1517,7 @@
     EXPECT_FALSE(is_incognito.value());
   }
   {
-    const base::Value& result_dict = result_value->GetList()[1];
+    const base::Value& result_dict = result_value->GetListDeprecated()[1];
     ASSERT_TRUE(result_dict.is_dict());
     const std::string* filename = result_dict.FindStringKey("filename");
     ASSERT_TRUE(filename);
@@ -1535,9 +1535,9 @@
       RunFunctionAndReturnResult(new DownloadsSearchFunction(), "[{}]");
   ASSERT_TRUE(result_value.get());
   ASSERT_TRUE(result_value->is_list());
-  ASSERT_EQ(1UL, result_value->GetList().size());
+  ASSERT_EQ(1UL, result_value->GetListDeprecated().size());
   {
-    const base::Value& result_dict = result_value->GetList()[0];
+    const base::Value& result_dict = result_value->GetListDeprecated()[0];
     ASSERT_TRUE(result_dict.is_dict());
     const std::string* filename = result_dict.FindStringKey("filename");
     ASSERT_TRUE(filename);
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
index 0adefd0..ff8f886 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
@@ -136,8 +136,9 @@
       profile->GetPrefs()->GetList(prefs::kAttestationExtensionAllowlist);
   DCHECK_NE(list, nullptr);
   base::Value value(extension->id());
-  return std::find(list->GetList().begin(), list->GetList().end(), value) !=
-         list->GetList().end();
+  return std::find(list->GetListDeprecated().begin(),
+                   list->GetListDeprecated().end(),
+                   value) != list->GetListDeprecated().end();
 }
 
 }  // namespace platform_keys
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
index 18d51bb..aa08bf6 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_unittest.cc
@@ -139,8 +139,8 @@
     EXPECT_TRUE(function->GetError().empty())
         << "Unexpected error: " << function->GetError();
     if (function->GetResultList() &&
-        !function->GetResultList()->GetList().empty()) {
-      return function->GetResultList()->GetList()[0].Clone();
+        !function->GetResultList()->GetListDeprecated().empty()) {
+      return function->GetResultList()->GetListDeprecated()[0].Clone();
     }
     return base::Value();
   }
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc
index 608315f8..d8013de 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_unittest.cc
@@ -124,7 +124,7 @@
                                              browser(),
                                              extensions::api_test_utils::NONE);
   ASSERT_TRUE(function->GetResultList());
-  EXPECT_EQ(0u, function->GetResultList()->GetList().size());
+  EXPECT_EQ(0u, function->GetResultList()->GetListDeprecated().size());
   EXPECT_TRUE(function->GetError().empty());
 }
 
@@ -137,10 +137,11 @@
                                              browser(),
                                              extensions::api_test_utils::NONE);
   ASSERT_TRUE(function->GetResultList());
-  EXPECT_EQ(1u, function->GetResultList()->GetList().size());
+  EXPECT_EQ(1u, function->GetResultList()->GetListDeprecated().size());
   EXPECT_TRUE(function->GetError().empty());
 
-  const base::Value& single_result = function->GetResultList()->GetList()[0];
+  const base::Value& single_result =
+      function->GetResultList()->GetListDeprecated()[0];
   ASSERT_TRUE(single_result.is_blob());
   EXPECT_EQ(base::Value::BlobStorage(), single_result.GetBlob());
 }
@@ -167,7 +168,7 @@
                                              browser(),
                                              extensions::api_test_utils::NONE);
   ASSERT_TRUE(function->GetResultList());
-  EXPECT_EQ(0u, function->GetResultList()->GetList().size());
+  EXPECT_EQ(0u, function->GetResultList()->GetListDeprecated().size());
   EXPECT_FALSE(function->GetError().empty());
 }
 
@@ -193,7 +194,7 @@
                                              extensions::api_test_utils::NONE);
   ASSERT_TRUE(get_function->GetResultList());
   const base::Value& single_result =
-      get_function->GetResultList()->GetList()[0];
+      get_function->GetResultList()->GetListDeprecated()[0];
   EXPECT_TRUE(get_function->GetError().empty());
   ASSERT_TRUE(single_result.is_blob());
   EXPECT_EQ(base::Value::BlobStorage({1, 2, 3}), single_result.GetBlob());
@@ -218,11 +219,11 @@
                                              std::move(values2), browser(),
                                              extensions::api_test_utils::NONE);
   ASSERT_TRUE(get_function2->GetResultList());
-  EXPECT_EQ(1u, get_function2->GetResultList()->GetList().size());
+  EXPECT_EQ(1u, get_function2->GetResultList()->GetListDeprecated().size());
   EXPECT_TRUE(get_function2->GetError().empty());
 
   const base::Value& single_result2 =
-      get_function2->GetResultList()->GetList()[0];
+      get_function2->GetResultList()->GetListDeprecated()[0];
   ASSERT_TRUE(single_result2.is_blob());
   EXPECT_EQ(base::Value::BlobStorage(), single_result2.GetBlob());
 }
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index 1cc36444..d437f1c 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -546,7 +546,7 @@
   EXTENSION_FUNCTION_VALIDATE(color_value);
   SkColor color = 0;
   if (color_value->is_list()) {
-    base::Value::ConstListView list = color_value->GetList();
+    base::Value::ConstListView list = color_value->GetListDeprecated();
 
     EXTENSION_FUNCTION_VALIDATE(list.size() == 4);
 
diff --git a/chrome/browser/extensions/api/font_settings/font_settings_api.cc b/chrome/browser/extensions/api/font_settings/font_settings_api.cc
index d08ab75..75a7d6c 100644
--- a/chrome/browser/extensions/api/font_settings/font_settings_api.cc
+++ b/chrome/browser/extensions/api/font_settings/font_settings_api.cc
@@ -297,7 +297,7 @@
 ExtensionFunction::ResponseValue
 FontSettingsGetFontListFunction::CopyFontsToResult(base::ListValue* fonts) {
   std::unique_ptr<base::ListValue> result(new base::ListValue());
-  for (const auto& entry : fonts->GetList()) {
+  for (const auto& entry : fonts->GetListDeprecated()) {
     if (!entry.is_list()) {
       NOTREACHED();
       return Error("");
diff --git a/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.cc b/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.cc
index 517d807..d1701fd4 100644
--- a/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.cc
+++ b/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.cc
@@ -75,7 +75,7 @@
   // policy::AffiliationTestHelper::PreLoginUser() in the PRE_ test.
   const base::Value* users =
       g_browser_process->local_state()->GetList("LoggedInUsers");
-  if (!users->GetList().empty()) {
+  if (!users->GetListDeprecated().empty()) {
     policy::AffiliationTestHelper::LoginUser(affiliation_mixin_.account_id());
   }
 
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc
index ad52da06..5b908b27 100644
--- a/chrome/browser/extensions/api/identity/identity_apitest.cc
+++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -176,7 +176,7 @@
         << "Unexpected error: " << function->GetError();
     EXPECT_NE(nullptr, function->GetResultList());
 
-    const auto& result_list = function->GetResultList()->GetList();
+    const auto& result_list = function->GetResultList()->GetListDeprecated();
     EXPECT_EQ(2ul, result_list.size());
 
     *first_result = result_list[0].Clone();
@@ -633,7 +633,7 @@
     if (!callback_arguments)
       return GenerateFailureResult(gaia_ids, absl::nullopt) << "NULL result";
     base::Value::ConstListView callback_arguments_list =
-        callback_arguments->GetList();
+        callback_arguments->GetListDeprecated();
 
     if (callback_arguments_list.size() != 1u) {
       return GenerateFailureResult(gaia_ids, absl::nullopt)
@@ -998,7 +998,7 @@
         << "Unexpected error: " << function->GetError();
     EXPECT_NE(nullptr, function->GetResultList());
 
-    const auto& result_list = function->GetResultList()->GetList();
+    const auto& result_list = function->GetResultList()->GetListDeprecated();
     EXPECT_EQ(2ul, result_list.size());
 
     const auto& access_token_value = result_list[0];
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc
index 03ac4b17..058c22b3 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api_unittest.cc
@@ -50,7 +50,7 @@
       ImageWriterPrivateListRemovableStorageDevicesFunction>();
   std::unique_ptr<base::Value> devices =
       RunFunctionAndReturnList(function.get(), "[]");
-  ASSERT_TRUE(devices.get() && devices.get()->GetList().empty())
+  ASSERT_TRUE(devices.get() && devices.get()->GetListDeprecated().empty())
       << "Under policy ListDevices should return an empty list.";
 }
 
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
index 2c267bb..072a48ca 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -82,7 +82,7 @@
 // Returns the set of allowed UI locales.
 base::flat_set<std::string> GetAllowedLanguages(PrefService* prefs) {
   const auto& allowed_languages_values =
-      prefs->GetList(prefs::kAllowedLanguages)->GetList();
+      prefs->GetList(prefs::kAllowedLanguages)->GetListDeprecated();
   return base::MakeFlatSet<std::string>(
       allowed_languages_values, {},
       [](const auto& locale_value) { return locale_value.GetString(); });
@@ -313,7 +313,7 @@
     UpdateSupportedPlatformDictionaries() {
   SpellcheckService* service =
       SpellcheckServiceFactory::GetForContext(browser_context());
-  for (auto& language_val : language_list_->GetList()) {
+  for (auto& language_val : language_list_->GetListDeprecated()) {
     if (service->UsesWindowsDictionary(*language_val.FindStringKey("code"))) {
       language_val.SetBoolKey("supportsSpellcheck", new bool(true));
     }
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
index abf8c00f..1b3cff0 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api_unittest.cc
@@ -237,9 +237,11 @@
   ASSERT_NE(nullptr, result) << function->GetError();
   EXPECT_TRUE(result->is_list());
 
-  ASSERT_EQ(result->GetList().size(), always_translate_languages.size());
-  for (size_t i = 0; i < result->GetList().size(); i++) {
-    EXPECT_EQ(result->GetList()[i].GetString(), always_translate_languages[i]);
+  ASSERT_EQ(result->GetListDeprecated().size(),
+            always_translate_languages.size());
+  for (size_t i = 0; i < result->GetListDeprecated().size(); i++) {
+    EXPECT_EQ(result->GetListDeprecated()[i].GetString(),
+              always_translate_languages[i]);
   }
 }
 
@@ -296,9 +298,11 @@
   ASSERT_NE(nullptr, result) << function->GetError();
   EXPECT_TRUE(result->is_list());
 
-  ASSERT_EQ(result->GetList().size(), never_translate_languages.size());
-  for (size_t i = 0; i < result->GetList().size(); i++) {
-    EXPECT_EQ(result->GetList()[i].GetString(), never_translate_languages[i]);
+  ASSERT_EQ(result->GetListDeprecated().size(),
+            never_translate_languages.size());
+  for (size_t i = 0; i < result->GetListDeprecated().size(); i++) {
+    EXPECT_EQ(result->GetListDeprecated()[i].GetString(),
+              never_translate_languages[i]);
   }
 }
 
@@ -390,7 +394,7 @@
   EXPECT_TRUE(result->is_list());
 
   size_t languages_to_test_found_count = 0;
-  for (auto& language_val : result->GetList()) {
+  for (auto& language_val : result->GetListDeprecated()) {
     EXPECT_TRUE(language_val.is_dict());
     std::string* language_code_ptr = language_val.FindStringKey("code");
     ASSERT_NE(nullptr, language_code_ptr);
@@ -545,26 +549,27 @@
 
   base::Value* input_methods = result->FindListKey("thirdPartyExtensionImes");
   ASSERT_NE(input_methods, nullptr);
-  EXPECT_EQ(3u, input_methods->GetList().size());
+  EXPECT_EQ(3u, input_methods->GetListDeprecated().size());
 
-  for (auto& input_method : input_methods->GetList()) {
+  for (auto& input_method : input_methods->GetListDeprecated()) {
     base::Value* ime_tags_ptr = input_method.FindListKey("tags");
     ASSERT_NE(nullptr, ime_tags_ptr);
 
     // Check tags contain input method's display name
     base::Value* ime_name_ptr = input_method.FindKey("displayName");
-    EXPECT_TRUE(base::Contains(ime_tags_ptr->GetList(), *ime_name_ptr));
+    EXPECT_TRUE(
+        base::Contains(ime_tags_ptr->GetListDeprecated(), *ime_name_ptr));
 
     // Check tags contain input method's language codes' display names
     base::Value* ime_language_codes_ptr =
         input_method.FindListKey("languageCodes");
     ASSERT_NE(nullptr, ime_language_codes_ptr);
-    for (auto& language_code : ime_language_codes_ptr->GetList()) {
+    for (auto& language_code : ime_language_codes_ptr->GetListDeprecated()) {
       std::string language_display_name =
           base::UTF16ToUTF8(l10n_util::GetDisplayNameForLocale(
               language_code.GetString(), "en", true));
       if (!language_display_name.empty())
-        EXPECT_TRUE(base::Contains(ime_tags_ptr->GetList(),
+        EXPECT_TRUE(base::Contains(ime_tags_ptr->GetListDeprecated(),
                                    base::Value(language_display_name)));
     }
   }
diff --git a/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chrome/browser/extensions/api/management/management_api_browsertest.cc
index d1c2134..9c6e6fa 100644
--- a/chrome/browser/extensions/api/management/management_api_browsertest.cc
+++ b/chrome/browser/extensions/api/management/management_api_browsertest.cc
@@ -280,7 +280,7 @@
       test_utils::RunFunctionAndReturnSingleResult(function.get(), "[]",
                                                    browser()));
   ASSERT_TRUE(result->is_list());
-  EXPECT_EQ(1U, result->GetList().size());
+  EXPECT_EQ(1U, result->GetListDeprecated().size());
 
   // And it should continue to do so even after it crashes.
   ASSERT_TRUE(CrashEnabledExtension(extension->id()));
@@ -289,7 +289,7 @@
   result = test_utils::RunFunctionAndReturnSingleResult(function.get(), "[]",
                                                         browser());
   ASSERT_TRUE(result->is_list());
-  EXPECT_EQ(1U, result->GetList().size());
+  EXPECT_EQ(1U, result->GetListDeprecated().size());
 }
 
 class ExtensionManagementApiEscalationTest :
diff --git a/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc b/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
index 77ceb90d..83620024 100644
--- a/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
+++ b/chrome/browser/extensions/api/mdns/mdns_api_unittest.cc
@@ -126,23 +126,24 @@
       *listener << "event.event_arg is null when it shouldn't be";
       return false;
     }
-    if (e.event_args->GetList().size() != 1) {
+    if (e.event_args->GetListDeprecated().size() != 1) {
       *listener << "event.event_arg.GetSize() should be 1 but is "
-                << e.event_args->GetList().size();
+                << e.event_args->GetListDeprecated().size();
       return false;
     }
     const base::ListValue* services = nullptr;
     {
-      const base::Value& out = e.event_args->GetList()[0];
+      const base::Value& out = e.event_args->GetListDeprecated()[0];
       services = static_cast<const base::ListValue*>(&out);
     }
     if (!services) {
       *listener << "event's service list argument is not a ListValue";
       return false;
     }
-    *listener << "number of services is " << services->GetList().size();
+    *listener << "number of services is "
+              << services->GetListDeprecated().size();
     return static_cast<testing::Matcher<size_t>>(testing::Eq(expected_size_))
-        .MatchAndExplain(services->GetList().size(), listener);
+        .MatchAndExplain(services->GetListDeprecated().size(), listener);
   }
 
   virtual void DescribeTo(::std::ostream* os) const {
diff --git a/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc b/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc
index 2c583cd..441237f 100644
--- a/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc
+++ b/chrome/browser/extensions/api/messaging/chrome_messaging_delegate.cc
@@ -59,8 +59,8 @@
   // Check if the name or the wildcard is in the blocklist.
   base::Value name_value(native_host_name);
   base::Value wildcard_value("*");
-  if (!base::Contains(blocklist->GetList(), name_value) &&
-      !base::Contains(blocklist->GetList(), wildcard_value)) {
+  if (!base::Contains(blocklist->GetListDeprecated(), name_value) &&
+      !base::Contains(blocklist->GetListDeprecated(), wildcard_value)) {
     return allow_result;
   }
 
@@ -69,7 +69,7 @@
           pref_names::kNativeMessagingAllowlist)) {
     const base::Value* allowlist =
         pref_service->GetList(pref_names::kNativeMessagingAllowlist);
-    if (allowlist && base::Contains(allowlist->GetList(), name_value))
+    if (allowlist && base::Contains(allowlist->GetListDeprecated(), name_value))
       return allow_result;
   }
 
diff --git a/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc b/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
index 15f2017..fd8c618 100644
--- a/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
+++ b/chrome/browser/extensions/api/messaging/native_message_process_host_unittest.cc
@@ -350,8 +350,8 @@
   const base::ListValue* args_value = nullptr;
   ASSERT_TRUE(last_message_parsed_->GetList("args", &args_value));
   std::vector<base::CommandLine::StringType> args;
-  args.reserve(args_value->GetList().size());
-  for (auto& arg : args_value->GetList()) {
+  args.reserve(args_value->GetListDeprecated().size());
+  for (auto& arg : args_value->GetListDeprecated()) {
     ASSERT_TRUE(arg.is_string());
 #if BUILDFLAG(IS_WIN)
     args.push_back(base::UTF8ToWide(arg.GetString()));
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
index 3acfe06..0098511 100644
--- a/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
+++ b/chrome/browser/extensions/api/messaging/native_messaging_host_manifest.cc
@@ -110,7 +110,7 @@
     return false;
   }
   allowed_origins_.ClearPatterns();
-  for (const auto& entry : allowed_origins_list->GetList()) {
+  for (const auto& entry : allowed_origins_list->GetListDeprecated()) {
     if (!entry.is_string()) {
       *error_message = "allowed_origins must be list of strings.";
       return false;
diff --git a/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc b/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc
index 45f36fe..52e2935 100644
--- a/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc
+++ b/chrome/browser/extensions/api/notifications/extension_notification_handler_unittest.cc
@@ -44,7 +44,7 @@
                  std::unique_ptr<base::ListValue> args) final {
     EXPECT_EQ(event_name_, event_name);
     EXPECT_EQ(extension_id_, extension_id);
-    EXPECT_EQ(param_count_, args->GetList().size());
+    EXPECT_EQ(param_count_, args->GetListDeprecated().size());
   }
 
  private:
diff --git a/chrome/browser/extensions/api/omnibox/omnibox_unittest.cc b/chrome/browser/extensions/api/omnibox/omnibox_unittest.cc
index b239bf2..2921ab4 100644
--- a/chrome/browser/extensions/api/omnibox/omnibox_unittest.cc
+++ b/chrome/browser/extensions/api/omnibox/omnibox_unittest.cc
@@ -77,7 +77,7 @@
   styles_expected.push_back(ACMatchClassification(9, kNone));
 
   std::unique_ptr<SendSuggestions::Params> params(
-      SendSuggestions::Params::Create(list->GetList()));
+      SendSuggestions::Params::Create(list->GetListDeprecated()));
   EXPECT_TRUE(params);
   ASSERT_FALSE(params->suggest_results.empty());
   CompareClassification(styles_expected, StyleTypesToACMatchClassifications(
@@ -109,7 +109,7 @@
           .Build();
 
   std::unique_ptr<SendSuggestions::Params> swapped_params(
-      SendSuggestions::Params::Create(swap_list->GetList()));
+      SendSuggestions::Params::Create(swap_list->GetListDeprecated()));
   EXPECT_TRUE(swapped_params);
   ASSERT_FALSE(swapped_params->suggest_results.empty());
   CompareClassification(
@@ -173,7 +173,7 @@
   styles_expected.push_back(ACMatchClassification(9, kMatch | kDim));
 
   std::unique_ptr<SendSuggestions::Params> params(
-      SendSuggestions::Params::Create(list->GetList()));
+      SendSuggestions::Params::Create(list->GetListDeprecated()));
   EXPECT_TRUE(params);
   ASSERT_FALSE(params->suggest_results.empty());
   CompareClassification(styles_expected, StyleTypesToACMatchClassifications(
@@ -221,7 +221,7 @@
           .Build();
 
   std::unique_ptr<SendSuggestions::Params> moved_params(
-      SendSuggestions::Params::Create(moved_list->GetList()));
+      SendSuggestions::Params::Create(moved_list->GetListDeprecated()));
   EXPECT_TRUE(moved_params);
   ASSERT_FALSE(moved_params->suggest_results.empty());
   CompareClassification(styles_expected, StyleTypesToACMatchClassifications(
@@ -280,7 +280,7 @@
   styles_expected.push_back(ACMatchClassification(5, kNone));
 
   std::unique_ptr<SendSuggestions::Params> params(
-      SendSuggestions::Params::Create(list->GetList()));
+      SendSuggestions::Params::Create(list->GetListDeprecated()));
   EXPECT_TRUE(params);
   ASSERT_FALSE(params->suggest_results.empty());
   CompareClassification(styles_expected, StyleTypesToACMatchClassifications(
@@ -332,7 +332,7 @@
           .Build();
 
   std::unique_ptr<SetDefaultSuggestion::Params> params(
-      SetDefaultSuggestion::Params::Create(list->GetList()));
+      SetDefaultSuggestion::Params::Create(list->GetListDeprecated()));
   EXPECT_TRUE(params);
 }
 
diff --git a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
index e8681e5..27e83cf5 100644
--- a/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
+++ b/chrome/browser/extensions/api/passwords_private/password_check_delegate_unittest.cc
@@ -1100,7 +1100,7 @@
   EXPECT_EQ(events::PASSWORDS_PRIVATE_ON_PASSWORD_CHECK_STATUS_CHANGED,
             event_iter->second->histogram_value);
   auto status = PasswordCheckStatus::FromValue(
-      event_iter->second->event_args->GetList().front());
+      event_iter->second->event_args->GetListDeprecated().front());
   EXPECT_EQ(api::passwords_private::PASSWORD_CHECK_STATE_RUNNING,
             status->state);
   EXPECT_EQ(0, *status->already_processed);
@@ -1110,7 +1110,7 @@
       LeakCheckCredential(kUsername1, kPassword1), IsLeaked(false));
 
   status = PasswordCheckStatus::FromValue(
-      event_iter->second->event_args->GetList().front());
+      event_iter->second->event_args->GetListDeprecated().front());
   EXPECT_EQ(api::passwords_private::PASSWORD_CHECK_STATE_RUNNING,
             status->state);
   EXPECT_EQ(2, *status->already_processed);
@@ -1120,7 +1120,7 @@
       LeakCheckCredential(kUsername2, kPassword2), IsLeaked(false));
 
   status = PasswordCheckStatus::FromValue(
-      event_iter->second->event_args->GetList().front());
+      event_iter->second->event_args->GetListDeprecated().front());
   EXPECT_EQ(api::passwords_private::PASSWORD_CHECK_STATE_RUNNING,
             status->state);
   EXPECT_EQ(4, *status->already_processed);
diff --git a/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc b/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
index 9c919d5..691814e 100644
--- a/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
+++ b/chrome/browser/extensions/api/permissions/permissions_api_unittest.cc
@@ -124,7 +124,7 @@
         function.get(), args_string, browser(), api_test_utils::NONE);
     EXPECT_TRUE(run_result) << function->GetError();
 
-    const auto args_list = function->GetResultList()->GetList();
+    const auto args_list = function->GetResultList()->GetListDeprecated();
     if (args_list.empty()) {
       ADD_FAILURE() << "Result unexpectedly empty.";
       return false;
@@ -233,7 +233,7 @@
       ADD_FAILURE() << "Running function failed: " << function->GetError();
     }
 
-    return function->GetResultList()->GetList()[0].GetBool();
+    return function->GetResultList()->GetListDeprecated()[0].GetBool();
   };
 
   auto get_all = [this, &extension]() {
@@ -248,14 +248,16 @@
     }
 
     const base::Value* results = function->GetResultList();
-    if (results->GetList().size() != 1u || !results->GetList()[0].is_dict()) {
+    if (results->GetListDeprecated().size() != 1u ||
+        !results->GetListDeprecated()[0].is_dict()) {
       ADD_FAILURE() << "Invalid result value";
       return origins;
     }
 
     const base::Value* origins_value =
-        results->GetList()[0].FindKeyOfType("origins", base::Value::Type::LIST);
-    for (const auto& value : origins_value->GetList())
+        results->GetListDeprecated()[0].FindKeyOfType("origins",
+                                                      base::Value::Type::LIST);
+    for (const auto& value : origins_value->GetListDeprecated())
       origins.push_back(value.GetString());
 
     return origins;
diff --git a/chrome/browser/extensions/api/preference/preference_helpers.cc b/chrome/browser/extensions/api/preference/preference_helpers.cc
index 7187b93e1..c2020dff 100644
--- a/chrome/browser/extensions/api/preference/preference_helpers.cc
+++ b/chrome/browser/extensions/api/preference/preference_helpers.cc
@@ -112,7 +112,7 @@
         extension->permissions_data()->HasAPIPermission(permission) &&
         (!incognito || util::IsIncognitoEnabled(extension->id(), profile))) {
       // Inject level of control key-value.
-      base::Value::ListView args_list = args->GetList();
+      base::Value::ListView args_list = args->GetListDeprecated();
       DCHECK(!args_list.empty());
       DCHECK(args_list[0].is_dict());
 
diff --git a/chrome/browser/extensions/api/printing/print_job_submitter.cc b/chrome/browser/extensions/api/printing/print_job_submitter.cc
index ac4aef6..9b410aad 100644
--- a/chrome/browser/extensions/api/printing/print_job_submitter.cc
+++ b/chrome/browser/extensions/api/printing/print_job_submitter.cc
@@ -79,7 +79,7 @@
       Profile::FromBrowserContext(browser_context)
           ->GetPrefs()
           ->GetList(prefs::kPrintingAPIExtensionsAllowlist);
-  return !base::Contains(list->GetList(), base::Value(extension_id));
+  return !base::Contains(list->GetListDeprecated(), base::Value(extension_id));
 }
 
 }  // namespace
diff --git a/chrome/browser/extensions/api/printing/printing_api_handler.h b/chrome/browser/extensions/api/printing/printing_api_handler.h
index a4f66db..18c6fcd2 100644
--- a/chrome/browser/extensions/api/printing/printing_api_handler.h
+++ b/chrome/browser/extensions/api/printing/printing_api_handler.h
@@ -98,11 +98,6 @@
   // Returns the current instance for |browser_context|.
   static PrintingAPIHandler* Get(content::BrowserContext* browser_context);
 
-  // Print jobs should be registered before OnPrintJobUpdate() is called.
-  void RegisterPrintJob(const std::string& printer_id,
-                        int job_id,
-                        const std::string& extension_id);
-
   // crosapi::mojom::PrintJobObserver:
   void OnPrintJobUpdate(const std::string& printer_id,
                         unsigned int job_id,
diff --git a/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc b/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc
index d88af50c..fbb847a7 100644
--- a/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc
+++ b/chrome/browser/extensions/api/printing/printing_api_handler_unittest.cc
@@ -583,9 +583,9 @@
   ASSERT_TRUE(color);
   const base::Value* color_options = color->FindListKey("option");
   ASSERT_TRUE(color_options);
-  ASSERT_EQ(1u, color_options->GetList().size());
+  ASSERT_EQ(1u, color_options->GetListDeprecated().size());
   const std::string* color_type =
-      color_options->GetList()[0].FindStringKey("type");
+      color_options->GetListDeprecated()[0].FindStringKey("type");
   ASSERT_TRUE(color_type);
   EXPECT_EQ("STANDARD_MONOCHROME", *color_type);
 
@@ -595,10 +595,10 @@
   const base::Value* page_orientation_options =
       page_orientation->FindListKey("option");
   ASSERT_TRUE(page_orientation_options);
-  ASSERT_EQ(3u, page_orientation_options->GetList().size());
+  ASSERT_EQ(3u, page_orientation_options->GetListDeprecated().size());
   std::vector<std::string> page_orientation_types;
   for (const base::Value& page_orientation_option :
-       page_orientation_options->GetList()) {
+       page_orientation_options->GetListDeprecated()) {
     const std::string* page_orientation_type =
         page_orientation_option.FindStringKey("type");
     ASSERT_TRUE(page_orientation_type);
diff --git a/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc b/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc
index 61e84f00..357f4d69 100644
--- a/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc
+++ b/chrome/browser/extensions/api/proxy/proxy_api_helpers.cc
@@ -328,7 +328,8 @@
     return false;
   }
 
-  return JoinUrlList(bypass_list->GetList(), ",", out, error, bad_message);
+  return JoinUrlList(bypass_list->GetListDeprecated(), ",", out, error,
+                     bad_message);
 }
 
 std::unique_ptr<base::Value> CreateProxyConfigDict(
diff --git a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc
index bc5e193..38504fb 100644
--- a/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc
+++ b/chrome/browser/extensions/api/quick_unlock_private/quick_unlock_private_api_unittest.cc
@@ -332,7 +332,7 @@
     QuickUnlockModeList modes;
 
     EXPECT_TRUE(result->is_list());
-    for (const base::Value& value : result->GetList()) {
+    for (const base::Value& value : result->GetListDeprecated()) {
       EXPECT_TRUE(value.is_string());
       modes.push_back(
           quick_unlock_private::ParseQuickUnlockMode(value.GetString()));
@@ -350,7 +350,7 @@
     QuickUnlockModeList modes;
 
     EXPECT_TRUE(result->is_list());
-    for (const base::Value& value : result->GetList()) {
+    for (const base::Value& value : result->GetListDeprecated()) {
       EXPECT_TRUE(value.is_string());
       modes.push_back(
           quick_unlock_private::ParseQuickUnlockMode(value.GetString()));
@@ -643,7 +643,7 @@
     auto dispatcher = std::make_unique<ExtensionFunctionDispatcher>(profile());
     api_test_utils::RunFunction(func.get(), std::move(params),
                                 std::move(dispatcher), api_test_utils::NONE);
-    EXPECT_TRUE(func->GetResultList()->GetList().empty());
+    EXPECT_TRUE(func->GetResultList()->GetListDeprecated().empty());
     base::RunLoop().RunUntilIdle();
     return func->GetError();
   }
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
index 5f000827..004d722 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -318,7 +318,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -353,7 +353,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -392,7 +392,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -441,7 +441,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -481,7 +481,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -515,7 +515,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -559,7 +559,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -840,7 +840,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -864,8 +864,9 @@
   base::Value* triggered_rule_info =
       event->FindKey(SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleInfo);
   ASSERT_NE(nullptr, triggered_rule_info);
-  ASSERT_EQ(1u, triggered_rule_info->GetList().size());
-  base::Value triggered_rule = std::move(triggered_rule_info->GetList()[0]);
+  ASSERT_EQ(1u, triggered_rule_info->GetListDeprecated().size());
+  base::Value triggered_rule =
+      std::move(triggered_rule_info->GetListDeprecated()[0]);
   EXPECT_EQ(
       safe_browsing::EventResultToString(safe_browsing::EventResult::ALLOWED),
       *event->FindStringKey(SafeBrowsingPrivateEventRouter::kKeyEventResult));
@@ -892,7 +893,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -916,8 +917,9 @@
   base::Value* triggered_rule_info =
       event->FindKey(SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleInfo);
   ASSERT_NE(nullptr, triggered_rule_info);
-  ASSERT_EQ(1u, triggered_rule_info->GetList().size());
-  base::Value triggered_rule = std::move(triggered_rule_info->GetList()[0]);
+  ASSERT_EQ(1u, triggered_rule_info->GetListDeprecated().size());
+  base::Value triggered_rule =
+      std::move(triggered_rule_info->GetListDeprecated()[0]);
   EXPECT_EQ(
       safe_browsing::EventResultToString(safe_browsing::EventResult::BLOCKED),
       *event->FindStringKey(SafeBrowsingPrivateEventRouter::kKeyEventResult));
@@ -944,7 +946,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
@@ -988,7 +990,7 @@
       report.FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  base::Value::ListView mutable_list = event_list->GetList();
+  base::Value::ListView mutable_list = event_list->GetListDeprecated();
   ASSERT_EQ(1, (int)mutable_list.size());
   base::Value wrapper = std::move(mutable_list[0]);
   EXPECT_EQ(base::Value::Type::DICTIONARY, wrapper.type());
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
index 5d2b230..ad5f77d 100644
--- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -113,13 +113,13 @@
     EXPECT_EQ(kSessionTags[i], api_test_utils::GetString(device, "deviceName"));
     const std::unique_ptr<base::ListValue> sessions =
         api_test_utils::GetList(device, "sessions");
-    EXPECT_EQ(num_sessions, sessions->GetList().size());
+    EXPECT_EQ(num_sessions, sessions->GetListDeprecated().size());
     // Because this test is hurried, really there are only ever 0 or 1
     // sessions, and if 1, that will be a Window. Grab it.
     if (num_sessions == 0)
       continue;
     const base::Value::DictStorage session =
-        utils::ToDictionary(sessions->GetList()[0]);
+        utils::ToDictionary(sessions->GetListDeprecated()[0]);
     const base::Value::DictStorage window =
         api_test_utils::GetDict(session, "window");
     // Only the tabs are interesting.
@@ -129,10 +129,10 @@
       return testing::AssertionFailure()
              << "window dictionary does not contain a tabs list entry";
     }
-    EXPECT_EQ(base::size(kTabIDs), tabs->GetList().size());
-    for (size_t j = 0; j < tabs->GetList().size(); ++j) {
+    EXPECT_EQ(base::size(kTabIDs), tabs->GetListDeprecated().size());
+    for (size_t j = 0; j < tabs->GetListDeprecated().size(); ++j) {
       const base::Value::DictStorage tab =
-          utils::ToDictionary(tabs->GetList()[j]);
+          utils::ToDictionary(tabs->GetListDeprecated()[j]);
       EXPECT_FALSE(tab.contains("id"));  // sessions API does not give tab IDs
       EXPECT_EQ(static_cast<int>(j), api_test_utils::GetInteger(tab, "index"));
       EXPECT_EQ(0, api_test_utils::GetInteger(tab, "windowId"));
@@ -303,7 +303,7 @@
 
   ASSERT_TRUE(result);
   base::ListValue* devices = result.get();
-  EXPECT_EQ(0u, devices->GetList().size());
+  EXPECT_EQ(0u, devices->GetListDeprecated().size());
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, RestoreForeignSessionWindow) {
@@ -320,12 +320,12 @@
   ASSERT_TRUE(result);
 
   base::ListValue* windows = result.get();
-  EXPECT_EQ(2u, windows->GetList().size());
+  EXPECT_EQ(2u, windows->GetListDeprecated().size());
   const base::Value::DictStorage restored_window =
       api_test_utils::GetDict(restored_window_session, "window");
   base::Value::DictStorage window;
   int restored_id = api_test_utils::GetInteger(restored_window, "id");
-  for (base::Value& window_value : windows->GetList()) {
+  for (base::Value& window_value : windows->GetListDeprecated()) {
     window = utils::ToDictionary(std::move(window_value));
     if (api_test_utils::GetInteger(window, "id") == restored_id)
       break;
@@ -360,7 +360,7 @@
           CreateIncognitoBrowser())));
   ASSERT_TRUE(result);
   base::ListValue* sessions = result.get();
-  EXPECT_EQ(0u, sessions->GetList().size());
+  EXPECT_EQ(0u, sessions->GetListDeprecated().size());
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionSessionsTest, GetRecentlyClosedMaxResults) {
@@ -385,7 +385,7 @@
         browser()));
     ASSERT_TRUE(result);
     ASSERT_TRUE(result->is_list());
-    EXPECT_EQ(kTabCount, result->GetList().size());
+    EXPECT_EQ(kTabCount, result->GetListDeprecated().size());
   }
   {
     std::unique_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult(
@@ -393,7 +393,7 @@
         "[{\"maxResults\": 0}]", browser()));
     ASSERT_TRUE(result);
     ASSERT_TRUE(result->is_list());
-    EXPECT_EQ(0u, result->GetList().size());
+    EXPECT_EQ(0u, result->GetListDeprecated().size());
   }
   {
     std::unique_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult(
@@ -401,7 +401,7 @@
         "[{\"maxResults\": 2}]", browser()));
     ASSERT_TRUE(result);
     ASSERT_TRUE(result->is_list());
-    EXPECT_EQ(2u, result->GetList().size());
+    EXPECT_EQ(2u, result->GetListDeprecated().size());
   }
 }
 
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 813fbbc..51658535 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -835,6 +835,8 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
   (*s_allowlist)[::prefs::kSettingsShowOSBanner] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
+  (*s_allowlist)[::prefs::kPrintingAPIExtensionsAllowlist] =
+      settings_api::PrefType::PREF_TYPE_LIST;
 #endif
 
   // Proxy settings.
diff --git a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
index d3cc4e6..b562cec 100644
--- a/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
+++ b/chrome/browser/extensions/api/signed_in_devices/signed_in_devices_api_unittest.cc
@@ -129,7 +129,7 @@
 const base::Value* GetDictionaryFromList(int index, base::Value* value) {
   const base::Value* dictionary = nullptr;
   int cur_index = 0;
-  for (const auto& item : value->GetList()) {
+  for (const auto& item : value->GetListDeprecated()) {
     if (cur_index++ != index)
       continue;
     if (!item.is_dict()) {
diff --git a/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc b/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
index 8fea6b3..78738d3a 100644
--- a/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
+++ b/chrome/browser/extensions/api/tab_groups/tab_groups_api_unittest.cc
@@ -190,9 +190,9 @@
   std::unique_ptr<base::ListValue> groups_list(
       RunTabGroupsQueryFunction(browser(), extension.get(), kTitleQueryInfo));
   ASSERT_TRUE(groups_list);
-  ASSERT_EQ(1u, groups_list->GetList().size());
+  ASSERT_EQ(1u, groups_list->GetListDeprecated().size());
 
-  const base::Value& group_info = groups_list->GetList()[0];
+  const base::Value& group_info = groups_list->GetListDeprecated()[0];
   ASSERT_EQ(base::Value::Type::DICTIONARY, group_info.type());
   EXPECT_EQ(
       tab_groups_util::GetGroupId(group1),
@@ -227,9 +227,9 @@
   std::unique_ptr<base::ListValue> groups_list(
       RunTabGroupsQueryFunction(browser(), extension.get(), kColorQueryInfo));
   ASSERT_TRUE(groups_list);
-  ASSERT_EQ(1u, groups_list->GetList().size());
+  ASSERT_EQ(1u, groups_list->GetListDeprecated().size());
 
-  const base::Value& group_info = groups_list->GetList()[0];
+  const base::Value& group_info = groups_list->GetListDeprecated()[0];
   ASSERT_EQ(base::Value::Type::DICTIONARY, group_info.type());
   EXPECT_EQ(
       tab_groups_util::GetGroupId(group3),
diff --git a/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc b/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
index 470dc8b..1af0d421 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api_unittest.cc
@@ -309,7 +309,7 @@
   std::unique_ptr<base::ListValue> tabs_list_without_permission(
       RunTabsQueryFunction(browser(), extension.get(), kTitleAndURLQueryInfo));
   ASSERT_TRUE(tabs_list_without_permission);
-  EXPECT_EQ(0u, tabs_list_without_permission->GetList().size());
+  EXPECT_EQ(0u, tabs_list_without_permission->GetListDeprecated().size());
 
   // An extension with "tabs" permission however will see the third tab.
   scoped_refptr<const Extension> extension_with_permission =
@@ -326,9 +326,10 @@
       RunTabsQueryFunction(browser(), extension_with_permission.get(),
                            kTitleAndURLQueryInfo));
   ASSERT_TRUE(tabs_list_with_permission);
-  ASSERT_EQ(1u, tabs_list_with_permission->GetList().size());
+  ASSERT_EQ(1u, tabs_list_with_permission->GetListDeprecated().size());
 
-  const base::Value& third_tab_info = tabs_list_with_permission->GetList()[0];
+  const base::Value& third_tab_info =
+      tabs_list_with_permission->GetListDeprecated()[0];
   ASSERT_TRUE(third_tab_info.is_dict());
   absl::optional<int> third_tab_id = third_tab_info.FindIntKey("id");
   EXPECT_EQ(ExtensionTabUtil::GetTabId(web_contentses[2]), third_tab_id);
@@ -382,9 +383,10 @@
         RunTabsQueryFunction(browser(), extension_with_permission.get(),
                              kTitleAndURLQueryInfo));
     ASSERT_TRUE(tabs_list_with_permission);
-    ASSERT_EQ(1u, tabs_list_with_permission->GetList().size());
+    ASSERT_EQ(1u, tabs_list_with_permission->GetListDeprecated().size());
 
-    const base::Value& third_tab_info = tabs_list_with_permission->GetList()[0];
+    const base::Value& third_tab_info =
+        tabs_list_with_permission->GetListDeprecated()[0];
     ASSERT_TRUE(third_tab_info.is_dict());
     absl::optional<int> third_tab_id = third_tab_info.FindIntKey("id");
     EXPECT_EQ(ExtensionTabUtil::GetTabId(web_contentses[2]), third_tab_id);
@@ -397,11 +399,13 @@
         RunTabsQueryFunction(browser(), extension_with_permission.get(),
                              kURLQueryInfo));
     ASSERT_TRUE(tabs_list_with_permission);
-    ASSERT_EQ(2u, tabs_list_with_permission->GetList().size());
+    ASSERT_EQ(2u, tabs_list_with_permission->GetListDeprecated().size());
 
-    const base::Value& first_tab_info = tabs_list_with_permission->GetList()[0];
+    const base::Value& first_tab_info =
+        tabs_list_with_permission->GetListDeprecated()[0];
     ASSERT_TRUE(first_tab_info.is_dict());
-    const base::Value& third_tab_info = tabs_list_with_permission->GetList()[1];
+    const base::Value& third_tab_info =
+        tabs_list_with_permission->GetListDeprecated()[1];
     ASSERT_TRUE(third_tab_info.is_dict());
 
     std::vector<int> expected_tabs_ids;
diff --git a/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc b/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
index 2f27c823d..af43328 100644
--- a/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_interactive_test.cc
@@ -108,8 +108,8 @@
 
   base::ListValue* result_tabs = result.get();
   // We should have one initial tab and one added tab.
-  EXPECT_EQ(2u, result_tabs->GetList().size());
-  for (const base::Value& result_tab : result_tabs->GetList()) {
+  EXPECT_EQ(2u, result_tabs->GetListDeprecated().size());
+  for (const base::Value& result_tab : result_tabs->GetListDeprecated()) {
     EXPECT_EQ(focused_window_id,
               api_test_utils::GetInteger(utils::ToDictionary(result_tab),
                                          keys::kWindowIdKey));
@@ -123,8 +123,8 @@
 
   result_tabs = result.get();
   // We should get one tab for each extra window and one for the initial window.
-  EXPECT_EQ(kExtraWindows + 1, result_tabs->GetList().size());
-  for (const base::Value& result_tab : result_tabs->GetList()) {
+  EXPECT_EQ(kExtraWindows + 1, result_tabs->GetListDeprecated().size());
+  for (const base::Value& result_tab : result_tabs->GetListDeprecated()) {
     EXPECT_NE(focused_window_id,
               api_test_utils::GetInteger(utils::ToDictionary(result_tab),
                                          keys::kWindowIdKey));
diff --git a/chrome/browser/extensions/api/tabs/tabs_test.cc b/chrome/browser/extensions/api/tabs/tabs_test.cc
index dbdf82d..83c9e71f 100644
--- a/chrome/browser/extensions/api/tabs/tabs_test.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_test.cc
@@ -185,8 +185,9 @@
   std::unique_ptr<base::ListValue> tabs =
       api_test_utils::GetList(result, keys::kTabsKey);
   ASSERT_TRUE(tabs);
-  ASSERT_FALSE(tabs->GetList().empty());
-  absl::optional<int> tab0_id = tabs->GetList()[0].FindIntKey(keys::kIdKey);
+  ASSERT_FALSE(tabs->GetListDeprecated().empty());
+  absl::optional<int> tab0_id =
+      tabs->GetListDeprecated()[0].FindIntKey(keys::kIdKey);
   ASSERT_TRUE(tab0_id.has_value());
   EXPECT_GE(*tab0_id, 0);
 
@@ -271,8 +272,9 @@
   std::unique_ptr<base::ListValue> tabs =
       api_test_utils::GetList(result, keys::kTabsKey);
   ASSERT_TRUE(tabs);
-  ASSERT_FALSE(tabs->GetList().empty());
-  absl::optional<int> tab0_id = tabs->GetList()[0].FindIntKey(keys::kIdKey);
+  ASSERT_FALSE(tabs->GetListDeprecated().empty());
+  absl::optional<int> tab0_id =
+      tabs->GetListDeprecated()[0].FindIntKey(keys::kIdKey);
   ASSERT_TRUE(tab0_id.has_value());
   // The tab id should not be -1 as this is a browser window.
   EXPECT_GE(*tab0_id, 0);
@@ -305,8 +307,8 @@
       utils::RunFunctionAndReturnSingleResult(function.get(), "[]", browser()));
 
   base::ListValue* windows = result.get();
-  EXPECT_EQ(window_ids.size(), windows->GetList().size());
-  for (const base::Value& result_window : windows->GetList()) {
+  EXPECT_EQ(window_ids.size(), windows->GetListDeprecated().size());
+  for (const base::Value& result_window : windows->GetListDeprecated()) {
     result_ids.insert(GetWindowId(utils::ToDictionary(result_window)));
 
     // "populate" was not passed in so tabs are not populated.
@@ -323,8 +325,8 @@
       function.get(), "[{\"populate\": true}]", browser()));
 
   windows = result.get();
-  EXPECT_EQ(window_ids.size(), windows->GetList().size());
-  for (const base::Value& result_window : windows->GetList()) {
+  EXPECT_EQ(window_ids.size(), windows->GetListDeprecated().size());
+  for (const base::Value& result_window : windows->GetListDeprecated()) {
     result_ids.insert(GetWindowId(utils::ToDictionary(result_window)));
 
     // "populate" was enabled so tabs should be populated.
@@ -373,8 +375,8 @@
           browser())));
 
   base::ListValue* windows = result.get();
-  EXPECT_EQ(window_ids.size(), windows->GetList().size());
-  for (const base::Value& result_window : windows->GetList()) {
+  EXPECT_EQ(window_ids.size(), windows->GetListDeprecated().size());
+  for (const base::Value& result_window : windows->GetListDeprecated()) {
     result_ids.insert(GetWindowId(utils::ToDictionary(result_window)));
 
     // "populate" was not passed in so tabs are not populated.
@@ -394,8 +396,8 @@
       browser()));
 
   windows = result.get();
-  EXPECT_EQ(window_ids.size(), windows->GetList().size());
-  for (const base::Value& result_window : windows->GetList()) {
+  EXPECT_EQ(window_ids.size(), windows->GetListDeprecated().size());
+  for (const base::Value& result_window : windows->GetListDeprecated()) {
     result_ids.insert(GetWindowId(utils::ToDictionary(result_window)));
 
     // "populate" was enabled so tabs should be populated.
@@ -608,8 +610,8 @@
 
   base::ListValue* result_tabs = result.get();
   // We should have one initial tab and one added tab.
-  EXPECT_EQ(2u, result_tabs->GetList().size());
-  for (const base::Value& result_tab : result_tabs->GetList()) {
+  EXPECT_EQ(2u, result_tabs->GetListDeprecated().size());
+  for (const base::Value& result_tab : result_tabs->GetListDeprecated()) {
     EXPECT_EQ(window_id, GetTabWindowId(utils::ToDictionary(result_tab)));
   }
 
@@ -621,8 +623,8 @@
 
   result_tabs = result.get();
   // We should have one tab for each extra window.
-  EXPECT_EQ(kExtraWindows, result_tabs->GetList().size());
-  for (const base::Value& result_tab : result_tabs->GetList()) {
+  EXPECT_EQ(kExtraWindows, result_tabs->GetListDeprecated().size());
+  for (const base::Value& result_tab : result_tabs->GetListDeprecated()) {
     EXPECT_NE(window_id, GetTabWindowId(utils::ToDictionary(result_tab)));
   }
 }
@@ -650,8 +652,8 @@
   std::set<int> result_ids;
   base::ListValue* result_tabs = result.get();
   // We should have one tab per browser except for DevTools.
-  EXPECT_EQ(kNumWindows, result_tabs->GetList().size());
-  for (const base::Value& result_tab : result_tabs->GetList()) {
+  EXPECT_EQ(kNumWindows, result_tabs->GetListDeprecated().size());
+  for (const base::Value& result_tab : result_tabs->GetListDeprecated()) {
     result_ids.insert(GetTabWindowId(utils::ToDictionary(result_tab)));
   }
   EXPECT_EQ(window_ids, result_ids);
@@ -676,7 +678,7 @@
       utils::ToList(utils::RunFunctionAndReturnSingleResult(function.get(),
                                                             args, browser())));
 
-  EXPECT_EQ(2u, result->GetList().size());
+  EXPECT_EQ(2u, result->GetListDeprecated().size());
 }
 
 IN_PROC_BROWSER_TEST_F(ExtensionTabsTest, DontCreateTabInClosingPopupWindow) {
@@ -1133,14 +1135,14 @@
         RunQueryFunction("[{\"discarded\": false}]"));
 
     // The two created plus the default tab.
-    EXPECT_EQ(3u, result->GetList().size());
+    EXPECT_EQ(3u, result->GetListDeprecated().size());
   }
 
   // Get discarded tabs.
   {
     std::unique_ptr<base::ListValue> result(
         RunQueryFunction("[{\"discarded\": true}]"));
-    EXPECT_EQ(0u, result->GetList().size());
+    EXPECT_EQ(0u, result->GetListDeprecated().size());
   }
 
   TabStripModel* tab_strip_model = browser()->tab_strip_model();
@@ -1164,19 +1166,20 @@
   {
     std::unique_ptr<base::ListValue> result(
         RunQueryFunction("[{\"discarded\": false}]"));
-    EXPECT_EQ(2u, result->GetList().size());
+    EXPECT_EQ(2u, result->GetListDeprecated().size());
   }
 
   // Get discarded tabs after discarding one tab.
   {
     std::unique_ptr<base::ListValue> result(
         RunQueryFunction("[{\"discarded\": true}]"));
-    EXPECT_EQ(1u, result->GetList().size());
+    EXPECT_EQ(1u, result->GetListDeprecated().size());
 
     // Make sure the returned tab is the correct one.
     int tab_id_a = ExtensionTabUtil::GetTabId(web_contents_a);
 
-    absl::optional<int> id = result->GetList()[0].FindIntKey(keys::kIdKey);
+    absl::optional<int> id =
+        result->GetListDeprecated()[0].FindIntKey(keys::kIdKey);
     ASSERT_TRUE(id);
 
     EXPECT_EQ(tab_id_a, *id);
@@ -1189,13 +1192,14 @@
   {
     std::unique_ptr<base::ListValue> result(
         RunQueryFunction("[{\"discarded\": false}]"));
-    ASSERT_EQ(1u, result->GetList().size());
+    ASSERT_EQ(1u, result->GetListDeprecated().size());
 
     // Make sure the returned tab is the correct one.
     int tab_id_c =
         ExtensionTabUtil::GetTabId(tab_strip_model->GetWebContentsAt(0));
 
-    absl::optional<int> id = result->GetList()[0].FindIntKey(keys::kIdKey);
+    absl::optional<int> id =
+        result->GetListDeprecated()[0].FindIntKey(keys::kIdKey);
     ASSERT_TRUE(id);
 
     EXPECT_EQ(tab_id_c, *id);
@@ -1205,7 +1209,7 @@
   {
     std::unique_ptr<base::ListValue> result(
         RunQueryFunction("[{\"discarded\": true}]"));
-    EXPECT_EQ(2u, result->GetList().size());
+    EXPECT_EQ(2u, result->GetListDeprecated().size());
   }
 
   // Activates the first created tab.
@@ -1215,14 +1219,14 @@
   {
     std::unique_ptr<base::ListValue> result(
         RunQueryFunction("[{\"discarded\": false}]"));
-    EXPECT_EQ(2u, result->GetList().size());
+    EXPECT_EQ(2u, result->GetListDeprecated().size());
   }
 
   // Get discarded tabs after activating a discarded tab.
   {
     std::unique_ptr<base::ListValue> result(
         RunQueryFunction("[{\"discarded\": true}]"));
-    EXPECT_EQ(1u, result->GetList().size());
+    EXPECT_EQ(1u, result->GetListDeprecated().size());
   }
 }
 
@@ -1376,11 +1380,11 @@
   // Get auto-discardable tabs. Returns all since tabs are auto-discardable
   // by default.
   query_result = RunQueryFunction(kAutoDiscardableQueryInfo);
-  EXPECT_EQ(3u, query_result->GetList().size());
+  EXPECT_EQ(3u, query_result->GetListDeprecated().size());
 
   // Get non auto-discardable tabs.
   query_result = RunQueryFunction(kNonAutoDiscardableQueryInfo);
-  EXPECT_EQ(0u, query_result->GetList().size());
+  EXPECT_EQ(0u, query_result->GetListDeprecated().size());
 
   // Update the auto-discardable state of web contents A.
   int tab_id_a = ExtensionTabUtil::GetTabId(web_contents_a);
@@ -1396,15 +1400,15 @@
 
   // Get auto-discardable tabs after changing the status of web contents A.
   query_result = RunQueryFunction(kAutoDiscardableQueryInfo);
-  EXPECT_EQ(2u, query_result->GetList().size());
+  EXPECT_EQ(2u, query_result->GetListDeprecated().size());
 
   // Get non auto-discardable tabs after changing the status of web contents A.
   query_result = RunQueryFunction(kNonAutoDiscardableQueryInfo);
-  ASSERT_EQ(1u, query_result->GetList().size());
+  ASSERT_EQ(1u, query_result->GetListDeprecated().size());
 
   // Make sure the returned tab is the correct one.
   absl::optional<int> tab_id =
-      query_result->GetList()[0].FindIntKey(keys::kIdKey);
+      query_result->GetListDeprecated()[0].FindIntKey(keys::kIdKey);
   ASSERT_TRUE(tab_id);
   EXPECT_EQ(tab_id_a, *tab_id);
 
@@ -1417,18 +1421,18 @@
 
   // Get auto-discardable tabs after changing the status of both created tabs.
   query_result = RunQueryFunction(kAutoDiscardableQueryInfo);
-  EXPECT_EQ(1u, query_result->GetList().size());
+  EXPECT_EQ(1u, query_result->GetListDeprecated().size());
 
   // Make sure the returned tab is the correct one.
   absl::optional<int> id_value =
-      query_result->GetList()[0].FindIntKey(keys::kIdKey);
+      query_result->GetListDeprecated()[0].FindIntKey(keys::kIdKey);
   ASSERT_TRUE(id_value);
   EXPECT_EQ(ExtensionTabUtil::GetTabId(tab_strip_model->GetWebContentsAt(0)),
             *id_value);
 
   // Get auto-discardable tabs after changing the status of both created tabs.
   query_result = RunQueryFunction(kNonAutoDiscardableQueryInfo);
-  EXPECT_EQ(2u, query_result->GetList().size());
+  EXPECT_EQ(2u, query_result->GetListDeprecated().size());
 
   // Resets the first tab back to auto-discardable.
   update_result = RunUpdateFunction(
@@ -1438,11 +1442,11 @@
 
   // Get auto-discardable tabs after resetting the status of web contents A.
   query_result = RunQueryFunction(kAutoDiscardableQueryInfo);
-  EXPECT_EQ(2u, query_result->GetList().size());
+  EXPECT_EQ(2u, query_result->GetListDeprecated().size());
 
   // Get non auto-discardable tabs after resetting the status of web contents A.
   query_result = RunQueryFunction(kNonAutoDiscardableQueryInfo);
-  EXPECT_EQ(1u, query_result->GetList().size());
+  EXPECT_EQ(1u, query_result->GetListDeprecated().size());
 }
 
 // Tester class for the tabs.zoom* api functions.
diff --git a/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc b/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc
index c672b319..f2b74fd2 100644
--- a/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc
+++ b/chrome/browser/extensions/api/top_sites/top_sites_apitest.cc
@@ -80,7 +80,8 @@
   std::unique_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult(
       get_top_sites_function.get(), "[]", browser()));
   ASSERT_TRUE(result->is_list());
-  EXPECT_GE(result->GetList().size(), top_sites_prepopulated_pages_size());
+  EXPECT_GE(result->GetListDeprecated().size(),
+            top_sites_prepopulated_pages_size());
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc
index 6780ede9..91824f5 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc
+++ b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.cc
@@ -18,6 +18,7 @@
 #include "device/fido/public_key_credential_params.h"
 #include "device/fido/public_key_credential_rp_entity.h"
 #include "device/fido/public_key_credential_user_entity.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
 namespace extensions {
@@ -40,6 +41,52 @@
       input, base::Base64UrlDecodePolicy::DISALLOW_PADDING, output);
 }
 
+// Base64url-decodes the value of `key` from `dict`. Returns `nullopt` if the
+// key isn't present or decoding failed.
+absl::optional<std::string> Base64UrlDecodeStringKey(const base::Value& dict,
+                                                     const std::string& key) {
+  const std::string* b64url_data = dict.FindStringKey(key);
+  if (!b64url_data) {
+    return absl::nullopt;
+  }
+  std::string decoded;
+  if (!Base64UrlDecode(*b64url_data, &decoded)) {
+    return absl::nullopt;
+  }
+  return decoded;
+}
+
+// Like `Base64UrlDecodeStringKey()` attempts to find and base64-decode the
+// value of `key` in `dict`. However, the value may also be of
+// `base::Value::Type::NONE`. Returns true on success and the decoded result if
+// the value was a string. Returns `{false, absl::nullopt}` if the key wasn't
+// found or if decoding the string failed.
+//
+// This is useful for extracting attributes that are defined as nullable
+// ArrayBuffers in the WebIDL since the JS `null` value maps to
+// `base::Value::Type::NONE`.
+std::tuple<bool, absl::optional<std::string>> Base64UrlDecodeNullableStringKey(
+    const base::Value& dict,
+    const std::string& key) {
+  const base::Value* value = dict.FindKey(key);
+  if (!value || (!value->is_string() && !value->is_none())) {
+    return {false, absl::nullopt};
+  }
+  if (value->is_none()) {
+    return {true, absl::nullopt};
+  }
+  DCHECK(value->is_string());
+  const std::string* b64url_data = dict.FindStringKey(key);
+  if (!b64url_data) {
+    return {false, absl::nullopt};
+  }
+  std::string decoded;
+  if (!Base64UrlDecode(*b64url_data, &decoded)) {
+    return {false, absl::nullopt};
+  }
+  return {true, decoded};
+}
+
 std::vector<uint8_t> ToByteVector(const std::string& in) {
   const uint8_t* in_ptr = reinterpret_cast<const uint8_t*>(in.data());
   return std::vector<uint8_t>(in_ptr, in_ptr + in.size());
@@ -171,11 +218,13 @@
 }
 
 absl::optional<device::AuthenticatorAttachment>
-AuthenticatorAttachmentFromValue(const base::Value& value) {
+NullableAuthenticatorAttachmentFromValue(const base::Value& value) {
   if (!value.is_none() && !value.is_string()) {
     return absl::nullopt;
   }
   if (value.is_none()) {
+    // PublicKeyCredential.authenticatorAttachment can be `null`, which is
+    // equivalent to `AuthenticatorAttachment::kAny`.
     return device::AuthenticatorAttachment::kAny;
   }
   const std::string& attachment_name = value.GetString();
@@ -220,8 +269,28 @@
   return value;
 }
 
-blink::mojom::MakeCredentialAuthenticatorResponsePtr FromValue(
-    const base::Value& value) {
+base::Value ToValue(
+    const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options) {
+  base::Value value(base::Value::Type::DICTIONARY);
+  value.SetStringKey("challenge", Base64UrlEncode(options->challenge));
+  value.SetStringKey("rpId", options->relying_party_id);
+
+  std::vector<base::Value> allow_credentials;
+  for (const device::PublicKeyCredentialDescriptor& descriptor :
+       options->allow_credentials) {
+    allow_credentials.push_back(ToValue(descriptor));
+  }
+  value.SetKey("allowCredentials", base::Value(std::move(allow_credentials)));
+
+  value.SetKey("userVerification", ToValue(options->user_verification));
+
+  // TODO(https://crbug.com/1231802): Serialize extensions.
+
+  return value;
+}
+
+blink::mojom::MakeCredentialAuthenticatorResponsePtr
+MakeCredentialResponseFromValue(const base::Value& value) {
   if (!value.is_dict()) {
     return nullptr;
   }
@@ -239,15 +308,11 @@
     return nullptr;
   }
   response->info->id = *id;
-  const std::string* raw_id_b64url = value.FindStringKey("rawId");
-  if (!id) {
+  absl::optional<std::string> raw_id = Base64UrlDecodeStringKey(value, "rawId");
+  if (!raw_id) {
     return nullptr;
   }
-  std::string raw_id_string;
-  if (!Base64UrlDecode(*raw_id_b64url, &raw_id_string)) {
-    return nullptr;
-  }
-  response->info->raw_id = ToByteVector(raw_id_string);
+  response->info->raw_id = ToByteVector(*raw_id);
 
   const base::Value* authenticator_attachment_value =
       value.FindKey("authenticatorAttachment");
@@ -255,7 +320,7 @@
     return nullptr;
   }
   absl::optional<device::AuthenticatorAttachment> authenticator_attachment =
-      AuthenticatorAttachmentFromValue(*authenticator_attachment_value);
+      NullableAuthenticatorAttachmentFromValue(*authenticator_attachment_value);
   if (!authenticator_attachment) {
     return nullptr;
   }
@@ -266,28 +331,20 @@
     return nullptr;
   }
 
-  const std::string* client_data_json_b64url =
-      response_dict->FindStringKey("clientDataJSON");
-  if (!client_data_json_b64url) {
+  absl::optional<std::string> client_data_json =
+      Base64UrlDecodeStringKey(*response_dict, "clientDataJSON");
+  if (!client_data_json) {
     return nullptr;
   }
-  std::string client_data_json;
-  if (!Base64UrlDecode(*client_data_json_b64url, &client_data_json)) {
-    return nullptr;
-  }
-  response->info->client_data_json = ToByteVector(client_data_json);
+  response->info->client_data_json = ToByteVector(*client_data_json);
 
-  const std::string* attestation_object_b64url =
-      response_dict->FindStringKey("attestationObject");
-  if (!attestation_object_b64url) {
-    return nullptr;
-  }
-  std::string attestation_object_bytes;
-  if (!Base64UrlDecode(*attestation_object_b64url, &attestation_object_bytes)) {
+  absl::optional<std::string> attestation_object_bytes =
+      Base64UrlDecodeStringKey(*response_dict, "attestationObject");
+  if (!attestation_object_bytes) {
     return nullptr;
   }
   absl::optional<cbor::Value> attestation_object_cbor = cbor::Reader::Read(
-      base::as_bytes(base::make_span(attestation_object_bytes)));
+      base::as_bytes(base::make_span(*attestation_object_bytes)));
   if (!attestation_object_cbor) {
     return nullptr;
   }
@@ -296,7 +353,7 @@
   if (!attestation_object) {
     return nullptr;
   }
-  response->attestation_object = ToByteVector(attestation_object_bytes);
+  response->attestation_object = ToByteVector(*attestation_object_bytes);
   response->info->authenticator_data =
       attestation_object->authenticator_data().SerializeToByteArray();
 
@@ -304,7 +361,7 @@
   if (!transports) {
     return nullptr;
   }
-  for (const base::Value& transport_name : transports->GetList()) {
+  for (const base::Value& transport_name : transports->GetListDeprecated()) {
     absl::optional<device::FidoTransportProtocol> transport =
         FidoTransportProtocolFromValue(transport_name);
     if (!transport) {
@@ -318,4 +375,79 @@
   return response;
 }
 
+blink::mojom::GetAssertionAuthenticatorResponsePtr
+GetAssertionResponseFromValue(const base::Value& value) {
+  if (!value.is_dict()) {
+    return nullptr;
+  }
+
+  const std::string* type = value.FindStringKey("type");
+  if (!type || *type != device::kPublicKey) {
+    return nullptr;
+  }
+
+  auto response = blink::mojom::GetAssertionAuthenticatorResponse::New();
+  response->info = blink::mojom::CommonCredentialInfo::New();
+
+  const std::string* id = value.FindStringKey("id");
+  if (!id) {
+    return nullptr;
+  }
+  response->info->id = *id;
+  absl::optional<std::string> raw_id = Base64UrlDecodeStringKey(value, "rawId");
+  if (!raw_id) {
+    return nullptr;
+  }
+  response->info->raw_id = ToByteVector(*raw_id);
+
+  const base::Value* authenticator_attachment_value =
+      value.FindKey("authenticatorAttachment");
+  if (!authenticator_attachment_value) {
+    return nullptr;
+  }
+  absl::optional<device::AuthenticatorAttachment> authenticator_attachment =
+      NullableAuthenticatorAttachmentFromValue(*authenticator_attachment_value);
+  if (!authenticator_attachment) {
+    return nullptr;
+  }
+  response->authenticator_attachment = *authenticator_attachment;
+
+  const base::Value* response_dict = value.FindDictKey("response");
+  if (!response_dict) {
+    return nullptr;
+  }
+
+  absl::optional<std::string> client_data_json =
+      Base64UrlDecodeStringKey(*response_dict, "clientDataJSON");
+  if (!client_data_json) {
+    return nullptr;
+  }
+  response->info->client_data_json = ToByteVector(*client_data_json);
+
+  absl::optional<std::string> authenticator_data =
+      Base64UrlDecodeStringKey(*response_dict, "authenticatorData");
+  if (!authenticator_data) {
+    return nullptr;
+  }
+  response->info->authenticator_data = ToByteVector(*authenticator_data);
+
+  absl::optional<std::string> signature =
+      Base64UrlDecodeStringKey(*response_dict, "signature");
+  if (!signature) {
+    return nullptr;
+  }
+  response->signature = ToByteVector(*signature);
+
+  // userHandle is non-optional but nullable.
+  auto [ok, opt_user_handle] =
+      Base64UrlDecodeNullableStringKey(*response_dict, "userHandle");
+  if (!ok) {
+    return nullptr;
+  }
+  if (opt_user_handle) {
+    response->user_handle = ToByteVector(*opt_user_handle);
+  }
+  return response;
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.h b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.h
index c8e21b5..572b22e 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.h
+++ b/chrome/browser/extensions/api/web_authentication_proxy/value_conversions.h
@@ -10,13 +10,16 @@
 
 namespace extensions {
 
+// TODO(https://crbug.com/1231802): Cover with unit tests.
+
 // Converts a `PublicKeyCredentialCreationOptions` into a `base::Value`, which
 // can be JSON serialized and included in an
 // `webAuthenticationProxy.onCreateRequest` event.
 //
 // The output conforms to the WebAuthn `PublicKeyCredentialCreationOptions`
-// dictionary IDL, but with all ArrayBuffer-valued attributes represented as
-// base64URL-encoded strings instead.
+// dictionary IDL, but with all ArrayBuffer and BufferSource attributes
+// represented as base64url-encoded strings instead. The `timeout` field is
+// omitted.
 // (https://w3c.github.io/webauthn/#dictdef-publickeycredentialcreationoptions)
 //
 // TODO(crbug.com/1231802): Reference serialization method once available. Also
@@ -24,17 +27,44 @@
 base::Value ToValue(
     const blink::mojom::PublicKeyCredentialCreationOptionsPtr& options);
 
-// Converts a `base::Value` encoding a WebAuthn
-// `PublicKeyCredential` instance into an equivalent
-// `MakeCredentialAuthenticatorResponse`.
+// Converts a `PublicKeyCredentialRequestOptions` into a `base::Value`, which
+// can be JSON serialized and included in an
+// `webAuthenticationProxy.onGetRequest` event.
 //
-// The input is expected to be a JSON-serialized `PublicKeyCredential` in which
-// ArrayBuffer-valued attributes are replaced by base64URL-encoded strings.
+// The output conforms to the WebAuthn `PublicKeyCredentialRequestOptions`
+// dictionary IDL, but with all ArrayBuffer and BufferSource attributes
+// represented as base64url-encoded strings instead. The `timeout` field is
+// omitted.
+// (https://w3c.github.io/webauthn/#dictdef-publickeycredentialrequestoptions)
 //
 // TODO(crbug.com/1231802): Reference serialization method once available. Also
 // update the IDL docs at that point.
-blink::mojom::MakeCredentialAuthenticatorResponsePtr FromValue(
-    const base::Value& value);
+base::Value ToValue(
+    const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options);
+
+// Converts a `base::Value` encoding a `PublicKeyCredential` instance from a
+// WebAuthn `get()` request into a `MakeCredentialAuthenticatorResponse`.
+//
+// The input is expected to be a JSON-serialized `PublicKeyCredential` in which
+// ArrayBuffer-valued attributes are replaced by base64url-encoded strings. The
+// `response` value must be a an `AuthenticatorAttestationResponse`.
+//
+// TODO(crbug.com/1231802): Reference serialization method once available. Also
+// update the IDL docs at that point.
+blink::mojom::MakeCredentialAuthenticatorResponsePtr
+MakeCredentialResponseFromValue(const base::Value& value);
+
+// Converts a `base::Value` encoding a `PublicKeyCredential` instance from a
+// WebAuthn `get()` request into a `GetAssertionAuthenticatorResponse`.
+//
+// The input is expected to be a JSON-serialized `PublicKeyCredential` in which
+// ArrayBuffer-valued attributes are replaced by base64url-encoded strings. The
+// `response` value must be a an `AuthenticatorAssertionResponse`.
+//
+// TODO(crbug.com/1231802): Reference serialization method once available. Also
+// update the IDL docs at that point.
+blink::mojom::GetAssertionAuthenticatorResponsePtr
+GetAssertionResponseFromValue(const base::Value& value);
 
 }  // namespace extensions
 
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc
index 387ea93..ff63862 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc
+++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.cc
@@ -75,6 +75,30 @@
   return RespondNow(NoArguments());
 }
 
+WebAuthenticationProxyCompleteGetRequestFunction::
+    WebAuthenticationProxyCompleteGetRequestFunction() = default;
+WebAuthenticationProxyCompleteGetRequestFunction::
+    ~WebAuthenticationProxyCompleteGetRequestFunction() = default;
+
+ExtensionFunction::ResponseAction
+WebAuthenticationProxyCompleteGetRequestFunction::Run() {
+  DCHECK(extension());
+  auto params =
+      api::web_authentication_proxy::CompleteGetRequest::Params::Create(args());
+  EXTENSION_FUNCTION_VALIDATE(params.get());
+  WebAuthenticationProxyService* proxy_service =
+      WebAuthenticationProxyServiceFactory::GetForBrowserContext(
+          browser_context());
+  if (proxy_service->GetActiveRequestProxy() != extension()) {
+    return RespondNow(Error("Invalid sender"));
+  }
+  std::string error;
+  if (!proxy_service->CompleteGetRequest(params->details, &error)) {
+    return RespondNow(Error(error));
+  }
+  return RespondNow(NoArguments());
+}
+
 WebAuthenticationProxyCompleteIsUvpaaRequestFunction::
     WebAuthenticationProxyCompleteIsUvpaaRequestFunction() = default;
 WebAuthenticationProxyCompleteIsUvpaaRequestFunction::
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.h b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.h
index adc98600..c1d441c8 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.h
+++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_api.h
@@ -50,6 +50,20 @@
                              WEB_AUTHENTICATION_PROXY_COMPLETE_CREATE_REQUEST)
 };
 
+class WebAuthenticationProxyCompleteGetRequestFunction
+    : public ExtensionFunction {
+ public:
+  WebAuthenticationProxyCompleteGetRequestFunction();
+
+ protected:
+  ~WebAuthenticationProxyCompleteGetRequestFunction() override;
+
+  // ExtensionFunction:
+  ResponseAction Run() override;
+  DECLARE_EXTENSION_FUNCTION("webAuthenticationProxy.completeGetRequest",
+                             WEB_AUTHENTICATION_PROXY_COMPLETE_GET_REQUEST)
+};
+
 class WebAuthenticationProxyCompleteIsUvpaaRequestFunction
     : public ExtensionFunction {
  public:
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc
index c1a96ec..871a7ba 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc
+++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_apitest.cc
@@ -92,12 +92,12 @@
         R"((async () => {
               let abort = new AbortController();
               let createPromise = navigator.credentials.create({publicKey: {
-                rp: {'id': 'a.test', 'name': 'A'},
-                challenge: new ArrayBuffer(),
-                user: {displayName : 'A', name: 'A', id: new ArrayBuffer()},
-                pubKeyCredParams: [],
-              },
-              signal: abort.signal});
+                  rp: {'id': 'a.test', 'name': 'A'},
+                  challenge: new ArrayBuffer(),
+                  user: {displayName : 'A', name: 'A', id: new ArrayBuffer()},
+                  pubKeyCredParams: [],
+                },
+                signal: abort.signal});
               abort.abort();
               let err = await createPromise;
               return err;
@@ -107,6 +107,46 @@
                .error.find("AbortError") >= 0;
   }
 
+  content::EvalJsResult NavigateAndCallGetAssertion() {
+    if (!ui_test_utils::NavigateToURL(
+            browser(), https_test_server_.GetURL(kTestDomain, "/page.html"))) {
+      ADD_FAILURE() << "Failed to navigate to test URL";
+    }
+    constexpr char kGetAssertionJs[] =
+        R"((async () => {
+              let credential = await navigator.credentials.get({publicKey: {
+                challenge: new ArrayBuffer(),
+                rpId: 'a.test',
+              }});
+              return credential.id;
+            })();)";
+    return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
+                           kGetAssertionJs);
+  }
+
+  bool NavigateAndCallGetAssertionThenCancel() {
+    if (!ui_test_utils::NavigateToURL(
+            browser(), https_test_server_.GetURL(kTestDomain, "/page.html"))) {
+      ADD_FAILURE() << "Failed to navigate to test URL";
+      return false;
+    }
+    constexpr char kGetAssertionJs[] =
+        R"((async () => {
+              let abort = new AbortController();
+              let getPromise = navigator.credentials.get({publicKey: {
+                  challenge: new ArrayBuffer(),
+                  rpId: 'a.test',
+                },
+                signal: abort.signal});
+              abort.abort();
+              let err = await getPromise;
+              return err;
+            })();)";
+    return content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
+                           kGetAssertionJs)
+               .error.find("AbortError") >= 0;
+  }
+
   base::FilePath extension_dir_;
   net::EmbeddedTestServer https_test_server_{
       net::EmbeddedTestServer::TYPE_HTTPS};
@@ -244,6 +284,7 @@
       "AbortError",
       "NotReadableError",
       "SecurityError",
+      // clang-format on
   };
   for (auto* error_name : kDomErrorNames) {
     ASSERT_TRUE(error_listener.WaitUntilSatisfied());
@@ -295,5 +336,89 @@
   EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
 }
 
+IN_PROC_BROWSER_TEST_F(WebAuthenticationProxyApiTest, GetAssertion) {
+  SetJsTestName("getAssertion");
+  ResultCatcher result_catcher;
+
+  ExtensionTestMessageListener ready_listener("ready", false);
+  ASSERT_TRUE(LoadExtension(extension_dir_)) << message_;
+  ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
+
+  EXPECT_EQ(NavigateAndCallGetAssertion().ExtractString(), kTestCredentialId);
+  EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
+}
+
+IN_PROC_BROWSER_TEST_F(WebAuthenticationProxyApiTest, GetAssertionError) {
+  SetJsTestName("getAssertionError");
+  ResultCatcher result_catcher;
+
+  ExtensionTestMessageListener request_listener("nextRequest", false);
+  ExtensionTestMessageListener error_listener("nextError", true);
+  ASSERT_TRUE(LoadExtension(extension_dir_)) << message_;
+
+  // The JS side listens for DOMError names to pass to completeCreateRequest().
+  // The DOMError observed by the client-side JS that made the WebAuthn request
+  // should match.
+  constexpr const char* kDomErrorNames[] = {
+      // clang-format off
+      "NotAllowedError",
+      "InvalidStateError",
+      "OperationError",
+      "NotSupportedError",
+      "AbortError",
+      "NotReadableError",
+      "SecurityError",
+      // clang-format on
+  };
+  for (auto* error_name : kDomErrorNames) {
+    ASSERT_TRUE(error_listener.WaitUntilSatisfied());
+    error_listener.Reply(error_name);
+    error_listener.Reset();
+    ASSERT_TRUE(request_listener.WaitUntilSatisfied());
+    request_listener.Reset();
+    // `TEST_ERROR_MESSAGE` in `main/test.js`.
+    constexpr char kErrorMessage[] = "test error message";
+    EXPECT_THAT(NavigateAndCallGetAssertion(),
+                IsJsErrorWithMessage(error_name, kErrorMessage));
+  }
+
+  // Tell the JS side to stop expecting more errors and end the test.
+  ASSERT_TRUE(error_listener.WaitUntilSatisfied());
+  error_listener.Reply("");
+  EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
+}
+
+IN_PROC_BROWSER_TEST_F(WebAuthenticationProxyApiTest,
+                       GetAssertionResolvesOnDetach) {
+  SetJsTestName("getAssertionResolvesOnDetach");
+  ResultCatcher result_catcher;
+
+  ExtensionTestMessageListener ready_listener("ready", true);
+  ASSERT_TRUE(LoadExtension(extension_dir_)) << message_;
+  ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
+
+  // Call getAssertion() and tell the extension that there is a result. The
+  // extension never resolves the request but detaches itself.
+  EXPECT_THAT(NavigateAndCallGetAssertion(), IsJsError("AbortError"));
+  ready_listener.Reply("");
+  EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
+}
+
+IN_PROC_BROWSER_TEST_F(WebAuthenticationProxyApiTest, GetAssertionCancel) {
+  SetJsTestName("getAssertionCancel");
+  ResultCatcher result_catcher;
+
+  ExtensionTestMessageListener ready_listener("ready", false);
+  ASSERT_TRUE(LoadExtension(extension_dir_)) << message_;
+  ASSERT_TRUE(ready_listener.WaitUntilSatisfied());
+
+  ExtensionTestMessageListener request_listener("request", true);
+  EXPECT_TRUE(NavigateAndCallGetAssertionThenCancel());
+  ASSERT_TRUE(request_listener.WaitUntilSatisfied());
+  request_listener.Reply("");
+
+  EXPECT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
+}
+
 }  // namespace
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc
index eda6d7f..f2765078 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc
+++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc
@@ -108,7 +108,51 @@
     return false;
   }
   blink::mojom::MakeCredentialAuthenticatorResponsePtr response =
-      FromValue(*response_value);
+      MakeCredentialResponseFromValue(*response_value);
+  if (!response) {
+    *error_out = "Invalid responseJson";
+    return false;
+  }
+
+  std::move(callback).Run(details.request_id, nullptr, std::move(response));
+  return true;
+}
+
+bool WebAuthenticationProxyService::CompleteGetRequest(
+    const api::web_authentication_proxy::GetResponseDetails& details,
+    std::string* error_out) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(error_out);
+  auto callback_it = pending_get_callbacks_.find(details.request_id);
+  if (callback_it == pending_get_callbacks_.end()) {
+    *error_out = "Invalid requestId";
+    return false;
+  }
+  GetCallback callback = std::move(callback_it->second);
+  pending_get_callbacks_.erase(callback_it);
+
+  if (details.error) {
+    std::move(callback).Run(details.request_id,
+                            blink::mojom::WebAuthnDOMExceptionDetails::New(
+                                details.error->name, details.error->message),
+                            nullptr);
+    return true;
+  }
+  if (!details.response_json) {
+    *error_out = "Missing GetResponseDetails.responseJson";
+    return false;
+  }
+
+  JSONStringValueDeserializer deserializer(*details.response_json);
+  std::string deserialize_error;
+  std::unique_ptr<base::Value> response_value =
+      deserializer.Deserialize(/*error_code=*/nullptr, &deserialize_error);
+  if (!response_value) {
+    *error_out = "Parsing responseJson failed: " + deserialize_error;
+    return false;
+  }
+  blink::mojom::GetAssertionAuthenticatorResponsePtr response =
+      GetAssertionResponseFromValue(*response_value);
   if (!response) {
     *error_out = "Invalid responseJson";
     return false;
@@ -136,6 +180,8 @@
   DCHECK(IsActive());
   if (base::Contains(pending_create_callbacks_, request_id)) {
     pending_create_callbacks_.erase(request_id);
+  } else if (base::Contains(pending_get_callbacks_, request_id)) {
+    pending_get_callbacks_.erase(request_id);
   } else {
     // Invalid `request_id`. Note that isUvpaa requests cannot be cancelled.
     return;
@@ -153,13 +199,17 @@
 void WebAuthenticationProxyService::CancelPendingCallbacks() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsActive());
-  auto create_callbacks = std::move(pending_create_callbacks_);
-  for (auto& pair : create_callbacks) {
-    auto error = blink::mojom::WebAuthnDOMExceptionDetails::New();
-    error->name = "AbortError";
-    error->message = "The operation was aborted.";
-    std::move(pair.second).Run(pair.first, std::move(error), nullptr);
-  }
+
+  auto abort_pending_callbacks = [](auto callbacks) {
+    for (auto& pair : callbacks) {
+      auto error = blink::mojom::WebAuthnDOMExceptionDetails::New(
+          "AbortError", "The operation was aborted.");
+      std::move(pair.second).Run(pair.first, std::move(error), nullptr);
+    }
+  };
+
+  abort_pending_callbacks(std::move(pending_create_callbacks_));
+  abort_pending_callbacks(std::move(pending_get_callbacks_));
 
   auto is_uvpaa_callbacks = std::move(pending_is_uvpaa_callbacks_);
   for (auto& pair : is_uvpaa_callbacks) {
@@ -175,7 +225,8 @@
   // requests. However, there's no real risk to this happening (no security or
   // DOS concerns).
   while (base::Contains(pending_is_uvpaa_callbacks_, request_id) ||
-         base::Contains(pending_create_callbacks_, request_id)) {
+         base::Contains(pending_create_callbacks_, request_id) ||
+         base::Contains(pending_get_callbacks_, request_id)) {
     request_id = base::RandGenerator(std::numeric_limits<uint32_t>::max()) + 1;
   }
   return request_id;
@@ -213,6 +264,33 @@
 }
 
 WebAuthenticationProxyService::RequestId
+WebAuthenticationProxyService::SignalGetRequest(
+    const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options_ptr,
+    GetCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(IsActive());
+
+  uint32_t request_id = NewRequestId();
+  pending_get_callbacks_.emplace(request_id, std::move(callback));
+
+  api::web_authentication_proxy::GetRequest request;
+  request.request_id = request_id;
+
+  base::Value options_value = ToValue(options_ptr);
+  std::string request_json;
+  JSONStringValueSerializer serializer(&request.request_details_json);
+  CHECK(serializer.Serialize(options_value));
+
+  event_router_->DispatchEventToExtension(
+      *active_request_proxy_extension_id_,
+      std::make_unique<Event>(
+          events::WEB_AUTHENTICATION_PROXY_ON_GET_REQUEST,
+          api::web_authentication_proxy::OnGetRequest::kEventName,
+          api::web_authentication_proxy::OnGetRequest::Create(request)));
+  return request_id;
+}
+
+WebAuthenticationProxyService::RequestId
 WebAuthenticationProxyService::SignalIsUvpaaRequest(IsUvpaaCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(IsActive());
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h
index 1a5a0de1b..b51caab 100644
--- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h
+++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h
@@ -45,9 +45,8 @@
   // Unregisters the currently active request proxy extension, if any.
   void ClearActiveRequestProxy();
 
-  // Injects the result for the
-  // `events::WEB_AUTHENTICATION_PROXY_CREATE_REQUEST` with `EventId` matching
-  // the one in `details`.
+  // Injects the result for the `onCreateRequest` extension API event
+  // with `EventId` matching the one in `details`.
   //
   // Returns whether completing the request succeeded. If it didn't, `error_out`
   // contains an error message.
@@ -55,6 +54,15 @@
       const api::web_authentication_proxy::CreateResponseDetails& details,
       std::string* error_out);
 
+  // Injects the result for the `onGetRequest` extension API event with
+  // `EventId` matching the one in `details`.
+  //
+  // Returns whether completing the request succeeded. If it didn't, `error_out`
+  // contains an error message.
+  bool CompleteGetRequest(
+      const api::web_authentication_proxy::GetResponseDetails& details,
+      std::string* error_out);
+
   // Injects the result for the
   // `events::WEB_AUTHENTICATION_PROXY_ON_ISUVPAA_REQUEST` event with
   // `event_id`. `is_uvpaa` is the result to be returned to the original caller
@@ -79,6 +87,9 @@
   RequestId SignalCreateRequest(
       const blink::mojom::PublicKeyCredentialCreationOptionsPtr& options,
       CreateCallback callback) override;
+  RequestId SignalGetRequest(
+      const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options,
+      GetCallback callback) override;
   RequestId SignalIsUvpaaRequest(IsUvpaaCallback callback) override;
   void CancelRequest(RequestId request_id) override;
 
@@ -100,6 +111,7 @@
 
   std::map<RequestId, IsUvpaaCallback> pending_is_uvpaa_callbacks_;
   std::map<RequestId, CreateCallback> pending_create_callbacks_;
+  std::map<RequestId, GetCallback> pending_get_callbacks_;
 
   SEQUENCE_CHECKER(sequence_checker_);
 };
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 0d5eda4..9c48ea2 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -4700,8 +4700,9 @@
 
 IN_PROC_BROWSER_TEST_P(ExtensionWebRequestApiFencedFrameTest, Load) {
   ASSERT_TRUE(StartEmbeddedTestServer());
-  ASSERT_TRUE(
-      RunExtensionTest("webrequest", {.page_url = "test_fenced_frames.html"}))
+  ASSERT_TRUE(RunExtensionTest(
+      "webrequest", {.page_url = "test_fenced_frames.html",
+                     .custom_arg = !GetParam() ? R"({"mparch": true})" : ""}))
       << message_;
 }
 
diff --git a/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
index 7acd2f20..6982d38 100644
--- a/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_event_details_unittest.cc
@@ -94,15 +94,19 @@
         details.GetFilteredDict(kFilter, nullptr, std::string(), false);
     base::Value* filtered_headers = dict->FindKey("responseHeaders");
     ASSERT_TRUE(filtered_headers);
-    ASSERT_EQ(2u, filtered_headers->GetList().size());
-    EXPECT_EQ("Key1",
-              filtered_headers->GetList()[0].FindKey("name")->GetString());
-    EXPECT_EQ("Value1",
-              filtered_headers->GetList()[0].FindKey("value")->GetString());
-    EXPECT_EQ("X-Chrome-ID-Consistency-Response",
-              filtered_headers->GetList()[1].FindKey("name")->GetString());
-    EXPECT_EQ("Value2",
-              filtered_headers->GetList()[1].FindKey("value")->GetString());
+    ASSERT_EQ(2u, filtered_headers->GetListDeprecated().size());
+    EXPECT_EQ(
+        "Key1",
+        filtered_headers->GetListDeprecated()[0].FindKey("name")->GetString());
+    EXPECT_EQ(
+        "Value1",
+        filtered_headers->GetListDeprecated()[0].FindKey("value")->GetString());
+    EXPECT_EQ(
+        "X-Chrome-ID-Consistency-Response",
+        filtered_headers->GetListDeprecated()[1].FindKey("name")->GetString());
+    EXPECT_EQ(
+        "Value2",
+        filtered_headers->GetListDeprecated()[1].FindKey("value")->GetString());
   }
 
   {
@@ -116,11 +120,13 @@
         gaia_details.GetFilteredDict(kFilter, nullptr, std::string(), false);
     base::Value* filtered_headers = dict->FindKey("responseHeaders");
     ASSERT_TRUE(filtered_headers);
-    ASSERT_EQ(1u, filtered_headers->GetList().size());
-    EXPECT_EQ("Key1",
-              filtered_headers->GetList()[0].FindKey("name")->GetString());
-    EXPECT_EQ("Value1",
-              filtered_headers->GetList()[0].FindKey("value")->GetString());
+    ASSERT_EQ(1u, filtered_headers->GetListDeprecated().size());
+    EXPECT_EQ(
+        "Key1",
+        filtered_headers->GetListDeprecated()[0].FindKey("name")->GetString());
+    EXPECT_EQ(
+        "Value1",
+        filtered_headers->GetListDeprecated()[0].FindKey("value")->GetString());
   }
 }
 
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
index 4475f1d..ef61190 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_unittest.cc
@@ -391,7 +391,8 @@
 
   void VerifyUserCancelledFunctionResult(ExtensionFunction* function) {
     ASSERT_TRUE(function->GetResultList());
-    const base::Value& result = function->GetResultList()->GetList()[0];
+    const base::Value& result =
+        function->GetResultList()->GetListDeprecated()[0];
     EXPECT_EQ("user_cancelled", result.GetString());
     EXPECT_EQ(kWebstoreUserCancelledError, function->GetError());
   }
@@ -400,7 +401,8 @@
       WebstorePrivateBeginInstallWithManifest3Function* function,
       const std::u16string& expected_blocked_message) {
     ASSERT_TRUE(function->GetResultList());
-    const base::Value& result = function->GetResultList()->GetList()[0];
+    const base::Value& result =
+        function->GetResultList()->GetListDeprecated()[0];
     EXPECT_EQ("blocked_by_policy", result.GetString());
     EXPECT_EQ(kWebstoreBlockByPolicy, function->GetError());
     EXPECT_EQ(expected_blocked_message,
diff --git a/chrome/browser/extensions/extension_assets_manager_chromeos.cc b/chrome/browser/extensions/extension_assets_manager_chromeos.cc
index fa537392..3e64c1b 100644
--- a/chrome/browser/extensions/extension_assets_manager_chromeos.cc
+++ b/chrome/browser/extensions/extension_assets_manager_chromeos.cc
@@ -310,7 +310,7 @@
   if (shared_path && users) {
     // This extension version already in shared location.
     bool user_found = false;
-    for (const base::Value& user : users->GetList()) {
+    for (const base::Value& user : users->GetListDeprecated()) {
       const std::string* temp = user.GetIfString();
       if (temp && *temp == user_id) {
         // Re-installation for the same user.
@@ -454,7 +454,8 @@
       NOTREACHED();
       continue;
     }
-    if (users->EraseListValue(user_name) && users->GetList().empty()) {
+    if (users->EraseListValue(user_name) &&
+        users->GetListDeprecated().empty()) {
       std::string* shared_path =
           version_info->FindStringKey(kSharedExtensionPath);
       if (!shared_path) {
@@ -515,9 +516,9 @@
       return false;
     }
 
-    size_t num_users = users->GetList().size();
+    size_t num_users = users->GetListDeprecated().size();
     for (size_t i = 0; i < num_users; i++) {
-      const std::string* user_id = users->GetList()[i].GetIfString();
+      const std::string* user_id = users->GetListDeprecated()[i].GetIfString();
       if (!user_id) {
         NOTREACHED();
         return false;
@@ -547,7 +548,7 @@
       }
 
       if (not_used) {
-        users->EraseListIter(users->GetList().begin() + i);
+        users->EraseListIter(users->GetListDeprecated().begin() + i);
 
         i--;
         num_users--;
diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc
index 81b359d..17833f27 100644
--- a/chrome/browser/extensions/extension_browsertest.cc
+++ b/chrome/browser/extensions/extension_browsertest.cc
@@ -251,7 +251,8 @@
   }
 
   // Number of JS scripts must be >= 1.
-  base::Value::ConstListView scripts_list = background_scripts_list->GetList();
+  base::Value::ConstListView scripts_list =
+      background_scripts_list->GetListDeprecated();
   if (scripts_list.size() < 1) {
     ADD_FAILURE() << extension_root.value()
                   << ": Only event pages with JS script(s) can be loaded "
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc
index fa99e90d..8c6587c 100644
--- a/chrome/browser/extensions/extension_context_menu_model.cc
+++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -298,16 +298,7 @@
     case PAGE_ACCESS_RUN_ON_SITE:
     case PAGE_ACCESS_RUN_ON_ALL_SITES:
     case PAGE_ACCESS_LEARN_MORE: {
-      content::WebContents* web_contents = GetActiveWebContents();
-      if (!web_contents)
-        return false;
-      // TODO(devlin): This can lead to some fun race-like conditions, where the
-      // menu is constructed during navigation. Since we get the URL both here
-      // and in execution of the command, there's a chance we'll find two
-      // different URLs. This would be solved if we maintained the URL that the
-      // menu was showing for.
-      const GURL& url = web_contents->GetLastCommittedURL();
-      return IsPageAccessCommandEnabled(*extension, url, command_id);
+      return IsPageAccessCommandEnabled(*extension, command_id);
     }
     // Extension pinning/unpinning is not available for Incognito as this leaves
     // a trace of user activity.
@@ -485,39 +476,40 @@
 
 bool ExtensionContextMenuModel::IsPageAccessCommandEnabled(
     const Extension& extension,
-    const GURL& url,
     int command_id) const {
-  // The "Can't access this site" entry is, by design, always disabled.
+  content::WebContents* web_contents = GetActiveWebContents();
+  if (!web_contents)
+    return false;
+
+  // The "Can't access this site" command is, by design, always disabled.
   if (command_id == PAGE_ACCESS_CANT_ACCESS)
     return false;
 
-  ScriptingPermissionsModifier modifier(profile_, &extension);
-  DCHECK(modifier.CanAffectExtension());
-
-  ScriptingPermissionsModifier::SiteAccess site_access =
-      modifier.GetSiteAccess(url);
-
   // Verify the extension wants access to the page - that's the only time these
   // commands should be shown.
-  DCHECK(site_access.has_site_access || site_access.withheld_site_access ||
-         extension.permissions_data()->HasAPIPermission(
-             mojom::APIPermissionID::kActiveTab));
+  const GURL& url = web_contents->GetLastCommittedURL();
+  SitePermissionsHelper permissions(profile_);
+  DCHECK(permissions.HasActiveTabAndCanAccess(extension, url) ||
+         (ScriptingPermissionsModifier(profile_, &extension)
+              .CanAffectExtension() &&
+          permissions.CanSelectSiteAccess(
+              extension, url, SitePermissionsHelper::SiteAccess::kOnClick)));
 
   switch (command_id) {
     case PAGE_ACCESS_SUBMENU:
     case PAGE_ACCESS_LEARN_MORE:
-    case PAGE_ACCESS_RUN_ON_CLICK:
-      // These are always enabled.
+      // When these commands are shown, they are always enabled.
       return true;
+    case PAGE_ACCESS_RUN_ON_CLICK:
     case PAGE_ACCESS_RUN_ON_SITE:
-      // The "on this site" option is only enabled if the extension wants to
-      // always run on the site without user interaction.
-      return site_access.has_site_access || site_access.withheld_site_access;
     case PAGE_ACCESS_RUN_ON_ALL_SITES:
-      // The "on all sites" option is only enabled if the extension wants to be
-      // able to run everywhere.
-      return site_access.has_all_sites_access ||
-             site_access.withheld_all_sites_access;
+      // TODO(devlin): This can lead to some fun race-like conditions, where the
+      // menu is constructed during navigation. Since we get the URL both here
+      // and in execution of the command, there's a chance we'll find two
+      // different URLs. This would be solved if we maintained the URL that the
+      // menu was showing for.
+      return permissions.CanSelectSiteAccess(extension, url,
+                                             CommandIdToSiteAccess(command_id));
     default:
       break;
   }
@@ -532,29 +524,32 @@
   if (!web_contents)
     return;
 
+  SitePermissionsHelper permissions(profile_);
   ScriptingPermissionsModifier modifier(profile_, extension);
-  if (!modifier.CanAffectExtension())
-    return;
-
   const GURL& url = web_contents->GetLastCommittedURL();
-  ScriptingPermissionsModifier::SiteAccess site_access =
-      modifier.GetSiteAccess(url);
 
-  bool has_active_tab = extension->permissions_data()->HasAPIPermission(
-      mojom::APIPermissionID::kActiveTab);
-  bool wants_site_access =
-      site_access.has_site_access || site_access.withheld_site_access;
-  if (!wants_site_access && !has_active_tab) {
+  // The extension does not want site access if it does not request host
+  // permissions and active tab.
+  if (!modifier.CanAffectExtension() &&
+      !permissions.HasActiveTabAndCanAccess(*extension, url)) {
+    return;
+  }
+
+  // The extension wants site access but cant't run on the page if it does not
+  // have at least "on click" access.
+  if (!permissions.CanSelectSiteAccess(
+          *extension, url, SitePermissionsHelper::SiteAccess::kOnClick)) {
     AddItemWithStringId(PAGE_ACCESS_CANT_ACCESS,
                         IDS_EXTENSIONS_CONTEXT_MENU_CANT_ACCESS_PAGE);
     return;
   }
 
+  // The extension wants site access and can ran on the page.  Add the three
+  // options for "on click", "on this site", "on all sites". Though we always
+  // add these three, some may be disabled.
   const int kRadioGroup = 0;
   page_access_submenu_ = std::make_unique<ui::SimpleMenuModel>(this);
 
-  // Add the three options for "on click", "on this site", "on all sites".
-  // Though we always add these three, some may be disabled.
   page_access_submenu_->AddRadioItemWithStringId(
       PAGE_ACCESS_RUN_ON_CLICK,
       IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK, kRadioGroup);
diff --git a/chrome/browser/extensions/extension_context_menu_model.h b/chrome/browser/extensions/extension_context_menu_model.h
index ecf0eeb..4b38ef1 100644
--- a/chrome/browser/extensions/extension_context_menu_model.h
+++ b/chrome/browser/extensions/extension_context_menu_model.h
@@ -13,7 +13,6 @@
 #include "ui/base/models/simple_menu_model.h"
 
 class Browser;
-class GURL;
 class Profile;
 
 namespace content {
@@ -134,7 +133,6 @@
 
   // Returns true if the given page access command is enabled in the menu.
   bool IsPageAccessCommandEnabled(const Extension& extension,
-                                  const GURL& url,
                                   int command_id) const;
 
   void HandlePageAccessCommand(int command_id,
diff --git a/chrome/browser/extensions/extension_context_menu_model_unittest.cc b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
index 00f3594..f995019 100644
--- a/chrome/browser/extensions/extension_context_menu_model_unittest.cc
+++ b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
@@ -1326,14 +1326,8 @@
   const Entries kOnAllSites = Entries::PAGE_ACCESS_RUN_ON_ALL_SITES;
   const Entries kLearnMore = Entries::PAGE_ACCESS_LEARN_MORE;
 
-  // Add an extension that has activeTab. Note: we add permission for b.com so
-  // that the extension is seen as affectable by the runtime host permissions
-  // feature; otherwise the page access menu entry is omitted entirely.
-  // TODO(devlin): Should we change that?
   scoped_refptr<const Extension> extension =
-      ExtensionBuilder("extension")
-          .AddPermissions({"activeTab", "http://b.com/*"})
-          .Build();
+      ExtensionBuilder("extension").AddPermissions({"activeTab"}).Build();
   InitializeAndAddExtension(*extension);
 
   AddTab(GURL("https://a.com"));
diff --git a/chrome/browser/extensions/extension_function_test_utils.cc b/chrome/browser/extensions/extension_function_test_utils.cc
index 244d43f..5950362 100644
--- a/chrome/browser/extensions/extension_function_test_utils.cc
+++ b/chrome/browser/extensions/extension_function_test_utils.cc
@@ -113,7 +113,8 @@
   // is no specified result.
   const base::ListValue* results = function->GetResultList();
   CHECK(results);
-  EXPECT_TRUE(results->GetList().empty()) << "Did not expect a result";
+  EXPECT_TRUE(results->GetListDeprecated().empty())
+      << "Did not expect a result";
   CHECK(function->response_type());
   EXPECT_EQ(ExtensionFunction::FAILED, *function->response_type());
   return function->GetError();
@@ -138,9 +139,9 @@
   EXPECT_TRUE(function->GetError().empty()) << "Unexpected error: "
       << function->GetError();
   if (function->GetResultList() &&
-      !function->GetResultList()->GetList().empty()) {
+      !function->GetResultList()->GetListDeprecated().empty()) {
     return base::Value::ToUniquePtrValue(
-        function->GetResultList()->GetList()[0].Clone());
+        function->GetResultList()->GetListDeprecated()[0].Clone());
   }
   return nullptr;
 }
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
index e26e1b3..33f59439 100644
--- a/chrome/browser/extensions/extension_management.cc
+++ b/chrome/browser/extensions/extension_management.cc
@@ -242,7 +242,7 @@
   // No settings explicitly specified for |id|.
   if (setting == nullptr)
     return false;
-  // Checks if the extension is on the black list or removed list.
+  // Checks if the extension is listed as blocked or removed.
   InstallationMode mode = setting->installation_mode;
   return mode == INSTALLATION_BLOCKED || mode == INSTALLATION_REMOVED;
 }
@@ -452,9 +452,9 @@
   if ((denied_list_pref &&
        // TODO(crbug.com/1187106): Use base::Contains once |denied_list_pref| is
        // not a ListValue.
-       std::find(denied_list_pref->GetList().begin(),
-                 denied_list_pref->GetList().end(),
-                 wildcard) != denied_list_pref->GetList().end()) ||
+       std::find(denied_list_pref->GetListDeprecated().begin(),
+                 denied_list_pref->GetListDeprecated().end(),
+                 wildcard) != denied_list_pref->GetListDeprecated().end()) ||
       (extension_request_pref && extension_request_pref->GetBool())) {
     default_settings_->installation_mode = INSTALLATION_BLOCKED;
   }
@@ -478,14 +478,14 @@
 
   // Parse legacy preferences.
   if (allowed_list_pref) {
-    for (const auto& entry : allowed_list_pref->GetList()) {
+    for (const auto& entry : allowed_list_pref->GetListDeprecated()) {
       if (entry.is_string() && crx_file::id_util::IdIsValid(entry.GetString()))
         AccessById(entry.GetString())->installation_mode = INSTALLATION_ALLOWED;
     }
   }
 
   if (denied_list_pref) {
-    for (const auto& entry : denied_list_pref->GetList()) {
+    for (const auto& entry : denied_list_pref->GetListDeprecated()) {
       if (entry.is_string() && crx_file::id_util::IdIsValid(entry.GetString()))
         AccessById(entry.GetString())->installation_mode = INSTALLATION_BLOCKED;
     }
@@ -495,7 +495,7 @@
 
   if (install_sources_pref) {
     global_settings_->has_restricted_install_sources = true;
-    for (const auto& entry : install_sources_pref->GetList()) {
+    for (const auto& entry : install_sources_pref->GetListDeprecated()) {
       if (entry.is_string()) {
         std::string url_pattern = entry.GetString();
         URLPattern pattern(URLPattern::SCHEME_ALL);
@@ -512,7 +512,7 @@
 
   if (allowed_types_pref) {
     global_settings_->has_restricted_allowed_types = true;
-    for (const auto& entry : allowed_types_pref->GetList()) {
+    for (const auto& entry : allowed_types_pref->GetListDeprecated()) {
       if (entry.is_int() && entry.GetInt() >= 0 &&
           entry.GetInt() < Manifest::Type::NUM_LOAD_TYPES) {
         global_settings_->allowed_types.push_back(
diff --git a/chrome/browser/extensions/extension_management_internal.cc b/chrome/browser/extensions/extension_management_internal.cc
index 2afcaa0..bd7ab56 100644
--- a/chrome/browser/extensions/extension_management_internal.cc
+++ b/chrome/browser/extensions/extension_management_internal.cc
@@ -156,7 +156,8 @@
     // Get the list of URLPatterns.
     const base::Value* host_list_value = dict->FindListKey(key);
     if (host_list_value) {
-      base::Value::ConstListView host_list_view = host_list_value->GetList();
+      base::Value::ConstListView host_list_view =
+          host_list_value->GetListDeprecated();
       if (host_list_view.size() > schema_constants::kMaxItemsURLPatternSet) {
         LOG(WARNING) << "Exceeded maximum number of URL match patterns ("
                      << schema_constants::kMaxItemsURLPatternSet
diff --git a/chrome/browser/extensions/extension_management_test_util.cc b/chrome/browser/extensions/extension_management_test_util.cc
index 7746bcb1..e2c876a 100644
--- a/chrome/browser/extensions/extension_management_test_util.cc
+++ b/chrome/browser/extensions/extension_management_test_util.cc
@@ -324,7 +324,8 @@
     list_value_weak = list_value.get();
     pref_->Set(path, std::move(list_value));
   }
-  CHECK(!base::Contains(list_value_weak->GetList(), base::Value(str)));
+  CHECK(
+      !base::Contains(list_value_weak->GetListDeprecated(), base::Value(str)));
   list_value_weak->Append(str);
 }
 
diff --git a/chrome/browser/extensions/extension_override_apitest.cc b/chrome/browser/extensions/extension_override_apitest.cc
index a3d56dc6..abfbf00 100644
--- a/chrome/browser/extensions/extension_override_apitest.cc
+++ b/chrome/browser/extensions/extension_override_apitest.cc
@@ -56,7 +56,7 @@
       return false;
 
     std::set<std::string> seen_overrides;
-    for (const auto& val : values->GetList()) {
+    for (const auto& val : values->GetListDeprecated()) {
       const base::DictionaryValue* dict = nullptr;
       std::string entry;
       if (!val.GetAsDictionary(&dict) || !dict->GetString("entry", &entry) ||
diff --git a/chrome/browser/extensions/extension_prefs_unittest.cc b/chrome/browser/extensions/extension_prefs_unittest.cc
index 778fada..56e8f22 100644
--- a/chrome/browser/extensions/extension_prefs_unittest.cc
+++ b/chrome/browser/extensions/extension_prefs_unittest.cc
@@ -658,7 +658,7 @@
     EXPECT_FALSE(manifest->GetString(manifest_keys::kBackgroundPage, &value));
     const base::ListValue* scripts;
     ASSERT_TRUE(manifest->GetList(manifest_keys::kBackgroundScripts, &scripts));
-    EXPECT_EQ(1u, scripts->GetList().size());
+    EXPECT_EQ(1u, scripts->GetListDeprecated().size());
   }
 
  protected:
@@ -1470,8 +1470,8 @@
 
   const base::ListValue* list_val = nullptr;
   prefs.prefs()->ReadPrefAsList(extension_id, kTestListPref, &list_val);
-  EXPECT_TRUE(list_val->GetList()[0].is_string());
-  EXPECT_EQ(list_val->GetList()[0].GetString(), "list_val");
+  EXPECT_TRUE(list_val->GetListDeprecated()[0].is_string());
+  EXPECT_EQ(list_val->GetListDeprecated()[0].GetString(), "list_val");
 
   EXPECT_EQ(time, prefs.prefs()->ReadPrefAsTime(extension_id, kTestTimePref));
 }
diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc
index bf76f726..45fc821 100644
--- a/chrome/browser/extensions/extension_web_ui.cc
+++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -71,7 +71,7 @@
 void InitializeOverridesList(base::Value* list) {
   base::Value migrated(base::Value::Type::LIST);
   std::set<std::string> seen_entries;
-  for (auto& val : list->GetList()) {
+  for (auto& val : list->GetListDeprecated()) {
     base::Value new_dict(base::Value::Type::DICTIONARY);
     std::string entry_name;
     if (val.is_dict()) {
@@ -104,7 +104,7 @@
 // marks it as active.
 void AddOverridesToList(base::Value* list, const GURL& override_url) {
   const std::string& spec = override_url.spec();
-  for (auto& val : list->GetList()) {
+  for (auto& val : list->GetListDeprecated()) {
     std::string* entry = nullptr;
     if (val.is_dict()) {
       entry = val.FindStringKey(kEntry);
@@ -133,7 +133,7 @@
   dict.SetStringPath(kEntry, spec);
   dict.SetBoolPath(kActive, true);
   // Add the entry to the front of the list.
-  list->Insert(list->GetList().begin(), std::move(dict));
+  list->Insert(list->GetListDeprecated().begin(), std::move(dict));
 }
 
 // Validates that each entry in |list| contains a valid url and points to an
@@ -142,7 +142,7 @@
                            base::Value* list) {
   base::Value migrated(base::Value::Type::LIST);
   std::set<std::string> seen_hosts;
-  for (auto& val : list->GetList()) {
+  for (auto& val : list->GetListDeprecated()) {
     std::string* entry = nullptr;
     if (val.is_dict()) {
       entry = val.FindStringKey(kEntry);
@@ -201,15 +201,16 @@
 bool UpdateOverridesList(base::Value* overrides_list,
                          const std::string& override_url,
                          UpdateBehavior behavior) {
-  auto iter = std::find_if(
-      overrides_list->GetList().begin(), overrides_list->GetList().end(),
-      [&override_url](const base::Value& value) {
-        if (!value.is_dict())
-          return false;
-        const std::string* entry = value.FindStringKey(kEntry);
-        return entry && *entry == override_url;
-      });
-  if (iter != overrides_list->GetList().end()) {
+  auto iter = std::find_if(overrides_list->GetListDeprecated().begin(),
+                           overrides_list->GetListDeprecated().end(),
+                           [&override_url](const base::Value& value) {
+                             if (!value.is_dict())
+                               return false;
+                             const std::string* entry =
+                                 value.FindStringKey(kEntry);
+                             return entry && *entry == override_url;
+                           });
+  if (iter != overrides_list->GetListDeprecated().end()) {
     switch (behavior) {
       case UPDATE_DEACTIVATE: {
         // See comment about CHECK(success) in ForEachOverrideList.
@@ -373,7 +374,7 @@
   std::vector<GURL> component_overrides;
 
   // Iterate over the URL list looking for suitable overrides.
-  for (const auto& value : url_list->GetList()) {
+  for (const auto& value : url_list->GetListDeprecated()) {
     GURL override_url;
     const Extension* extension = nullptr;
     if (!ValidateOverrideURL(&value, url, extensions, &override_url,
diff --git a/chrome/browser/extensions/extension_web_ui_unittest.cc b/chrome/browser/extensions/extension_web_ui_unittest.cc
index 21d2498..e476df1 100644
--- a/chrome/browser/extensions/extension_web_ui_unittest.cc
+++ b/chrome/browser/extensions/extension_web_ui_unittest.cc
@@ -218,8 +218,8 @@
   const base::Value* newtab_overrides =
       overrides->FindKeyOfType("newtab", base::Value::Type::LIST);
   ASSERT_TRUE(newtab_overrides);
-  ASSERT_EQ(1u, newtab_overrides->GetList().size());
-  const base::Value& override_dict = newtab_overrides->GetList()[0];
+  ASSERT_EQ(1u, newtab_overrides->GetListDeprecated().size());
+  const base::Value& override_dict = newtab_overrides->GetListDeprecated()[0];
   EXPECT_EQ(newtab_url.spec(), override_dict.FindKey("entry")->GetString());
   EXPECT_TRUE(override_dict.FindKey("active")->GetBool());
 }
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
index 171beb8..5f4726c 100644
--- a/chrome/browser/extensions/external_provider_impl.cc
+++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -343,7 +343,7 @@
                                   &browser_locales);
 
       bool locale_supported = false;
-      for (const base::Value& locale : supported_locales->GetList()) {
+      for (const base::Value& locale : supported_locales->GetListDeprecated()) {
         const std::string* current_locale = locale.GetIfString();
         if (current_locale && l10n_util::IsValidLocaleSyntax(*current_locale)) {
           std::string normalized_locale =
diff --git a/chrome/browser/extensions/install_signer.cc b/chrome/browser/extensions/install_signer.cc
index 627f300..a5fefaa4 100644
--- a/chrome/browser/extensions/install_signer.cc
+++ b/chrome/browser/extensions/install_signer.cc
@@ -143,7 +143,7 @@
   const base::ListValue* id_list = nullptr;
   if (!dictionary.GetList(key, &id_list))
     return false;
-  for (const auto& entry : id_list->GetList()) {
+  for (const auto& entry : id_list->GetListDeprecated()) {
     if (!entry.is_string()) {
       return false;
     }
@@ -428,7 +428,8 @@
   ExtensionIdSet invalid_ids;
   const base::Value* invalid_ids_list = dictionary->FindListKey(kInvalidIdsKey);
   if (invalid_ids_list) {
-    for (const base::Value& invalid_id : invalid_ids_list->GetList()) {
+    for (const base::Value& invalid_id :
+         invalid_ids_list->GetListDeprecated()) {
       const std::string* id = invalid_id.GetIfString();
       if (!id) {
         ReportErrorViaCallback();
diff --git a/chrome/browser/extensions/menu_manager.cc b/chrome/browser/extensions/menu_manager.cc
index 35c8755..def4ab3 100644
--- a/chrome/browser/extensions/menu_manager.cc
+++ b/chrome/browser/extensions/menu_manager.cc
@@ -77,7 +77,7 @@
   if (!value || !value->is_list())
     return items;
 
-  for (const base::Value& elem : value->GetList()) {
+  for (const base::Value& elem : value->GetListDeprecated()) {
     std::unique_ptr<MenuItem> item =
         MenuItem::Populate(extension_id, elem, nullptr);
     if (!item)
@@ -105,7 +105,7 @@
 
   if (!value->is_list())
     return false;
-  base::Value::ConstListView list = value->GetList();
+  base::Value::ConstListView list = value->GetListDeprecated();
 
   for (const auto& pattern : list) {
     if (!pattern.is_string())
diff --git a/chrome/browser/extensions/menu_manager_unittest.cc b/chrome/browser/extensions/menu_manager_unittest.cc
index 86e5473..d6f4238 100644
--- a/chrome/browser/extensions/menu_manager_unittest.cc
+++ b/chrome/browser/extensions/menu_manager_unittest.cc
@@ -620,9 +620,9 @@
   manager_.ExecuteCommand(&profile, nullptr /* web_contents */,
                           nullptr /* render_frame_host */, params, id);
 
-  ASSERT_EQ(2u, list->GetList().size());
+  ASSERT_EQ(2u, list->GetListDeprecated().size());
 
-  const base::Value& info = list->GetList()[0];
+  const base::Value& info = list->GetListDeprecated()[0];
   ASSERT_TRUE(info.is_dict());
 
   ASSERT_EQ(id.uid, info.FindIntKey("menuItemId"));
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc
index e2b05c9..eda68c01 100644
--- a/chrome/browser/extensions/policy_handlers.cc
+++ b/chrome/browser/extensions/policy_handlers.cc
@@ -115,7 +115,7 @@
   }
 
   int index = -1;
-  for (const auto& entry : policy_value->GetList()) {
+  for (const auto& entry : policy_value->GetListDeprecated()) {
     ++index;
     if (!entry.is_string()) {
       if (errors) {
@@ -185,7 +185,7 @@
 
   // Check that the list contains valid URLPattern strings only.
   int index = 0;
-  for (const auto& entry : value->GetList()) {
+  for (const auto& entry : value->GetListDeprecated()) {
     if (!entry.is_string()) {
       errors->AddError(policy_name(), index, IDS_POLICY_TYPE_ERROR,
                        base::Value::GetTypeName(base::Value::Type::STRING));
@@ -291,7 +291,7 @@
     for (const char* key : host_keys) {
       const base::Value* unparsed_urls = sub_dict->FindListKey(key);
       if (unparsed_urls != nullptr) {
-        for (const auto& url_value : unparsed_urls->GetList()) {
+        for (const auto& url_value : unparsed_urls->GetListDeprecated()) {
           const std::string& unparsed_url = url_value.GetString();
           URLPattern pattern(extension_scheme_mask);
           URLPattern::ParseResult parse_result = pattern.Parse(unparsed_url);
@@ -332,7 +332,7 @@
     const base::Value* runtime_blocked_hosts =
         sub_dict->FindListKey(schema_constants::kPolicyBlockedHosts);
     if (runtime_blocked_hosts != nullptr &&
-        runtime_blocked_hosts->GetList().size() >
+        runtime_blocked_hosts->GetListDeprecated().size() >
             schema_constants::kMaxItemsURLPatternSet) {
       if (errors) {
         errors->AddError(
@@ -346,7 +346,7 @@
     const base::Value* runtime_allowed_hosts =
         sub_dict->FindListKey(schema_constants::kPolicyAllowedHosts);
     if (runtime_allowed_hosts != nullptr &&
-        runtime_allowed_hosts->GetList().size() >
+        runtime_allowed_hosts->GetListDeprecated().size() >
             schema_constants::kMaxItemsURLPatternSet) {
       if (errors) {
         errors->AddError(
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 6769ddb..0a949e6 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -2634,6 +2634,14 @@
       mojom::APIPermissionID::kStorage));
 }
 
+// Tests that loading a component MV3 extension succeeds.
+IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, Component) {
+  ASSERT_TRUE(
+      RunExtensionTest("service_worker/worker_based_background/component", {},
+                       {.load_as_component = true}))
+      << message_;
+}
+
 // Tests that an extension's service worker can't be used to relax the extension
 // CSP.
 IN_PROC_BROWSER_TEST_P(ServiceWorkerWithManifestVersionTest,
diff --git a/chrome/browser/extensions/site_permissions_helper.cc b/chrome/browser/extensions/site_permissions_helper.cc
index c17abd75..e0acc41e 100644
--- a/chrome/browser/extensions/site_permissions_helper.cc
+++ b/chrome/browser/extensions/site_permissions_helper.cc
@@ -88,6 +88,47 @@
   runner->HandlePageAccessModified(&extension, current_access, new_access);
 }
 
+bool SitePermissionsHelper::CanSelectSiteAccess(const Extension& extension,
+                                                const GURL& url,
+                                                SiteAccess site_access) const {
+  // Extensions cannot run on sites restricted to them (ever), so no type of
+  // site access is selectable.
+  if (extension.permissions_data()->IsRestrictedUrl(url, /*error=*/nullptr))
+    return false;
+
+  // The "on click" option is enabled if the extension has active tab,
+  // regardless of its granted host permissions.
+  if (site_access == SitePermissionsHelper::SiteAccess::kOnClick &&
+      HasActiveTabAndCanAccess(extension, url))
+    return true;
+
+  ScriptingPermissionsModifier modifier(profile_,
+                                        base::WrapRefCounted(&extension));
+  if (!modifier.CanAffectExtension())
+    return false;
+
+  ScriptingPermissionsModifier::SiteAccess current_access =
+      modifier.GetSiteAccess(url);
+  switch (site_access) {
+    case SitePermissionsHelper::SiteAccess::kOnClick:
+      // The "on click" option is only enabled if the extension has active tab,
+      // previously handled, or wants to always run on the site without user
+      // interaction.
+      return current_access.has_site_access ||
+             current_access.withheld_site_access;
+    case SitePermissionsHelper::SiteAccess::kOnSite:
+      // The "on site" option is only enabled if the extension wants to
+      // always run on the site without user interaction.
+      return current_access.has_site_access ||
+             current_access.withheld_site_access;
+    case SitePermissionsHelper::SiteAccess::kOnAllSites:
+      // The "on all sites" option is only enabled if the extension wants to be
+      // able to run everywhere.
+      return current_access.has_all_sites_access ||
+             current_access.withheld_all_sites_access;
+  }
+}
+
 bool SitePermissionsHelper::HasBeenBlocked(
     const Extension& extension,
     content::WebContents* web_contents) const {
diff --git a/chrome/browser/extensions/site_permissions_helper.h b/chrome/browser/extensions/site_permissions_helper.h
index fc2c22a..d209a8f 100644
--- a/chrome/browser/extensions/site_permissions_helper.h
+++ b/chrome/browser/extensions/site_permissions_helper.h
@@ -44,10 +44,15 @@
   const SitePermissionsHelper& operator=(const SitePermissionsHelper&) = delete;
   ~SitePermissionsHelper();
 
-  // Returns the current site access pointed by `web_contents` for `extension`.
+  // Returns the site access for `extension` in the current site pointed
+  // by `web_contents`. Moreover, this can only be called if the user can
+  // configure site access for the extension (which excludes things like policy
+  // extensions). Otherwie, it DCHECK's.
   SiteAccess GetCurrentSiteAccess(const Extension& extension,
                                   content::WebContents* web_contents) const;
-  // Returns the site interaction pointed by `web_contents` for `extension`.
+
+  // Returns the site interaction for `extension` in the current site pointed by
+  // `web_contents`.
   SiteInteraction GetSiteInteraction(const Extension& extension,
                                      content::WebContents* web_contents) const;
 
@@ -58,12 +63,17 @@
                         content::WebContents* web_contents,
                         SitePermissionsHelper::SiteAccess new_access);
 
+  // Returns whether `site_access` option can be selected for `extension` in
+  // `url`.
+  bool CanSelectSiteAccess(const Extension& extension,
+                           const GURL& gurl,
+                           SiteAccess site_access) const;
+
   // Returns whether the `extension` has been blocked on the given
   // `web_contents`.
   bool HasBeenBlocked(const Extension& extension,
                       content::WebContents* web_contents) const;
 
- private:
   // Returns true if this extension uses the activeTab permission and would
   // probably be able to to access the given `url`. The actual checks when an
   // activeTab extension tries to run are a little more complicated and can be
@@ -74,6 +84,7 @@
   bool HasActiveTabAndCanAccess(const Extension& extension,
                                 const GURL& url) const;
 
+ private:
   raw_ptr<Profile> profile_;
 };
 
diff --git a/chrome/browser/extensions/site_permissions_helper_unittest.cc b/chrome/browser/extensions/site_permissions_helper_unittest.cc
new file mode 100644
index 0000000..114ed8f
--- /dev/null
+++ b/chrome/browser/extensions/site_permissions_helper_unittest.cc
@@ -0,0 +1,161 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/site_permissions_helper.h"
+
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_service_test_with_install.h"
+#include "chrome/browser/extensions/permissions_updater.h"
+#include "components/crx_file/id_util.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/extension_builder.h"
+#include "extensions/common/permissions/permissions_data.h"
+
+namespace extensions {
+
+namespace {
+
+std::unique_ptr<base::ListValue> ToListValue(
+    const std::vector<std::string>& permissions) {
+  extensions::ListBuilder builder;
+  for (const std::string& permission : permissions)
+    builder.Append(permission);
+  return builder.Build();
+}
+
+}  // namespace
+
+using SiteAccess = SitePermissionsHelper::SiteAccess;
+
+class SitePermissionsHelperUnitTest : public ExtensionServiceTestWithInstall {
+ public:
+  void SetUp() override;
+
+  scoped_refptr<const extensions::Extension> InstallExtension(
+      const std::string& name);
+
+  scoped_refptr<const extensions::Extension> InstallExtensionWithPermissions(
+      const std::string& name,
+      const std::vector<std::string>& host_permissions,
+      const std::vector<std::string>& permissions = {});
+
+  SitePermissionsHelper* permissions_helper() {
+    return permissions_helper_.get();
+  }
+
+ private:
+  // Site permissions helper being tested.
+  std::unique_ptr<SitePermissionsHelper> permissions_helper_;
+};
+
+void SitePermissionsHelperUnitTest::SetUp() {
+  ExtensionServiceTestBase::SetUp();
+  InitializeEmptyExtensionService();
+
+  permissions_helper_ = std::make_unique<SitePermissionsHelper>(profile());
+}
+
+scoped_refptr<const extensions::Extension>
+SitePermissionsHelperUnitTest::InstallExtension(const std::string& name) {
+  return InstallExtensionWithPermissions(name, {}, {});
+}
+
+scoped_refptr<const extensions::Extension>
+SitePermissionsHelperUnitTest::InstallExtensionWithPermissions(
+    const std::string& name,
+    const std::vector<std::string>& host_permissions,
+    const std::vector<std::string>& permissions) {
+  auto extension =
+      extensions::ExtensionBuilder(name)
+          .SetManifestVersion(3)
+          .SetManifestKey("host_permissions", ToListValue(host_permissions))
+          .AddPermissions(permissions)
+          .SetID(crx_file::id_util::GenerateId(name))
+          .Build();
+  service()->AddExtension(extension.get());
+
+  return extension;
+}
+
+TEST_F(SitePermissionsHelperUnitTest, CanSelectSiteAccess_AllUrls) {
+  auto extension =
+      InstallExtensionWithPermissions("AllUrls Extension", {"<all_urls>"});
+
+  // Verify "on click", "on site" and "on all sites" site access can be selected
+  // for a non-restricted url.
+  const GURL url("http://www.example.com");
+  EXPECT_TRUE(permissions_helper()->CanSelectSiteAccess(*extension, url,
+                                                        SiteAccess::kOnClick));
+  EXPECT_TRUE(permissions_helper()->CanSelectSiteAccess(*extension, url,
+                                                        SiteAccess::kOnSite));
+  EXPECT_TRUE(permissions_helper()->CanSelectSiteAccess(
+      *extension, url, SiteAccess::kOnAllSites));
+
+  // Verify "on click", "on site" and "on all sites" cannot be selected for a
+  // restricted url.
+  const GURL chrome_url("chrome://settings");
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(*extension, chrome_url,
+                                                         SiteAccess::kOnClick));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(*extension, chrome_url,
+                                                         SiteAccess::kOnSite));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(
+      *extension, chrome_url, SiteAccess::kOnAllSites));
+}
+
+TEST_F(SitePermissionsHelperUnitTest, CanSelectSiteAccess_SpecificUrl) {
+  const GURL url_a("http://www.a.com");
+  auto extension =
+      InstallExtensionWithPermissions("A Extension", {url_a.spec()});
+
+  // Verify "on click" and "on site" can be selected for the specific url, but
+  // "on all sites" cannot be selected.
+  EXPECT_TRUE(permissions_helper()->CanSelectSiteAccess(*extension, url_a,
+                                                        SiteAccess::kOnClick));
+  EXPECT_TRUE(permissions_helper()->CanSelectSiteAccess(*extension, url_a,
+                                                        SiteAccess::kOnSite));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(
+      *extension, url_a, SiteAccess::kOnAllSites));
+
+  // Verify "on click", "on site" and "on all sites" cannot be selected for any
+  // other url.
+  const GURL url_b("http://www.b.com");
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(*extension, url_b,
+                                                         SiteAccess::kOnClick));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(*extension, url_b,
+                                                         SiteAccess::kOnSite));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(
+      *extension, url_b, SiteAccess::kOnAllSites));
+}
+
+TEST_F(SitePermissionsHelperUnitTest, CanSelectSiteAccess_NoHostPermissions) {
+  auto extension = InstallExtension("Extension");
+
+  // Verify "on click", "on site" and "on all sites" cannot be selected for any
+  // url.
+  const GURL url("http://www.example.com");
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(*extension, url,
+                                                         SiteAccess::kOnClick));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(*extension, url,
+                                                         SiteAccess::kOnSite));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(
+      *extension, url, SiteAccess::kOnAllSites));
+}
+
+TEST_F(SitePermissionsHelperUnitTest, CanSelectSiteAccess_ActiveTab) {
+  auto extension = InstallExtensionWithPermissions(
+      "ActiveTab Extension",
+      /*host_permissions=*/{}, /*permissions=*/{"activeTab"});
+
+  // Verify "on click" can be selected for the specific url, but "on site" and
+  // "on all sites" cannot be selected.
+  const GURL url("http://www.example.com");
+  EXPECT_TRUE(permissions_helper()->CanSelectSiteAccess(*extension, url,
+                                                        SiteAccess::kOnClick));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(*extension, url,
+                                                         SiteAccess::kOnSite));
+  EXPECT_FALSE(permissions_helper()->CanSelectSiteAccess(
+      *extension, url, SiteAccess::kOnAllSites));
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/updater/update_service_browsertest.cc b/chrome/browser/extensions/updater/update_service_browsertest.cc
index 4c74d884..4a8fd760 100644
--- a/chrome/browser/extensions/updater/update_service_browsertest.cc
+++ b/chrome/browser/extensions/updater/update_service_browsertest.cc
@@ -105,7 +105,8 @@
       std::get<0>(update_interceptor_->GetRequests()[0]);
     const auto root = base::JSONReader::Read(update_request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(kExtensionId, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.10", app.FindKey("version")->GetString());
     EXPECT_TRUE(app.FindKey("enabled")->GetBool());
@@ -148,7 +149,8 @@
       std::get<0>(update_interceptor_->GetRequests()[0]);
     const auto root = base::JSONReader::Read(update_request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(kExtensionId, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.10", app.FindKey("version")->GetString());
     EXPECT_TRUE(app.FindKey("enabled")->GetBool());
@@ -255,7 +257,8 @@
       std::get<0>(update_interceptor_->GetRequests()[0]);
     const auto root = base::JSONReader::Read(update_request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(kExtensionId, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.10", app.FindKey("version")->GetString());
     EXPECT_TRUE(app.FindKey("enabled")->GetBool());
@@ -341,13 +344,14 @@
       std::get<0>(update_interceptor_->GetRequests()[0]);
     const auto root = base::JSONReader::Read(update_request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(kExtensionId, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.0.0.0", app.FindKey("version")->GetString());
     EXPECT_EQ("reinstall", app.FindKey("installsource")->GetString());
     EXPECT_EQ("policy", app.FindKey("installedby")->GetString());
     EXPECT_FALSE(app.FindKey("enabled")->GetBool());
-    const auto& disabled = app.FindKey("disabled")->GetList()[0];
+    const auto& disabled = app.FindKey("disabled")->GetListDeprecated()[0];
     EXPECT_EQ(disable_reason::DISABLE_CORRUPTED,
               disabled.FindKey("reason")->GetInt());
 }
@@ -544,13 +548,14 @@
       std::get<0>(update_interceptor_->GetRequests()[0]);
     const auto root = base::JSONReader::Read(update_request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(id_, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.0.0.0", app.FindKey("version")->GetString());
     EXPECT_EQ("reinstall", app.FindKey("installsource")->GetString());
     EXPECT_EQ("policy", app.FindKey("installedby")->GetString());
     EXPECT_FALSE(app.FindKey("enabled")->GetBool());
-    const auto& disabled = app.FindKey("disabled")->GetList()[0];
+    const auto& disabled = app.FindKey("disabled")->GetListDeprecated()[0];
     EXPECT_EQ(disable_reason::DISABLE_CORRUPTED,
               disabled.FindKey("reason")->GetInt());
 }
@@ -663,13 +668,14 @@
       std::get<0>(update_interceptor_->GetRequests()[0]);
     const auto root = base::JSONReader::Read(update_request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(id_, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.0.0.0", app.FindKey("version")->GetString());
     EXPECT_EQ("reinstall", app.FindKey("installsource")->GetString());
     EXPECT_EQ("policy", app.FindKey("installedby")->GetString());
     EXPECT_FALSE(app.FindKey("enabled")->GetBool());
-    const auto& disabled = app.FindKey("disabled")->GetList()[0];
+    const auto& disabled = app.FindKey("disabled")->GetListDeprecated()[0];
     EXPECT_EQ(disable_reason::DISABLE_CORRUPTED,
               disabled.FindKey("reason")->GetInt());
 }
diff --git a/chrome/browser/extensions/warning_badge_service.h b/chrome/browser/extensions/warning_badge_service.h
index aea03653..888fb110 100644
--- a/chrome/browser/extensions/warning_badge_service.h
+++ b/chrome/browser/extensions/warning_badge_service.h
@@ -28,7 +28,7 @@
 
   static WarningBadgeService* Get(content::BrowserContext* context);
 
-  // Black lists all currently active extension warnings, so that they do not
+  // Suppresses all currently active extension warnings, so that they do not
   // trigger a warning badge again for the life-time of the browsing session.
   void SuppressCurrentWarnings();
 
diff --git a/chrome/browser/extensions/window_controller.cc b/chrome/browser/extensions/window_controller.cc
index 4eb8e3e8..c3e666a 100644
--- a/chrome/browser/extensions/window_controller.cc
+++ b/chrome/browser/extensions/window_controller.cc
@@ -46,7 +46,7 @@
   WindowController::TypeFilter filter = WindowController::kNoWindowFilter;
   if (!types)
     return filter;
-  for (const base::Value& type : types->GetList()) {
+  for (const base::Value& type : types->GetListDeprecated()) {
     const std::string* window_type = type.GetIfString();
     if (window_type)
       filter |= 1 << api::windows::ParseWindowType(*window_type);
diff --git a/chrome/browser/external_protocol/auto_launch_protocols_policy_handler.cc b/chrome/browser/external_protocol/auto_launch_protocols_policy_handler.cc
index a147875..b4f8ce8 100644
--- a/chrome/browser/external_protocol/auto_launch_protocols_policy_handler.cc
+++ b/chrome/browser/external_protocol/auto_launch_protocols_policy_handler.cc
@@ -72,7 +72,7 @@
   if (!CheckAndGetValue(policies, nullptr, &policy_value) || !policy_value)
     return false;
 
-  base::Value::ConstListView policy_list = policy_value->GetList();
+  base::Value::ConstListView policy_list = policy_value->GetListDeprecated();
   for (size_t i = 0; i < policy_list.size(); ++i) {
     const base::DictionaryValue& protocol_origins_map =
         base::Value::AsDictionaryValue(policy_list[i]);
@@ -88,7 +88,7 @@
 
     const base::Value* origins_list = protocol_origins_map.FindListKey(
         AutoLaunchProtocolsPolicyHandler::kOriginListKey);
-    for (const auto& entry : origins_list->GetList()) {
+    for (const auto& entry : origins_list->GetListDeprecated()) {
       const std::string pattern = entry.GetString();
       // If it's not a valid origin pattern mark it as an error.
       if (!IsValidOriginMatchingPattern(pattern)) {
@@ -97,7 +97,7 @@
       }
     }
     // If the origin list is empty mark it as an error.
-    if (origins_list->GetList().empty()) {
+    if (origins_list->GetListDeprecated().empty()) {
       errors->AddError(policy::key::kAutoLaunchProtocolsFromOrigins, i,
                        IDS_POLICY_VALUE_FORMAT_ERROR);
     }
@@ -115,7 +115,7 @@
   CheckAndGetValue(policies, nullptr, &policy_value);
 
   base::ListValue validated_pref_values;
-  for (auto& protocol_origins_map : policy_value->GetList()) {
+  for (auto& protocol_origins_map : policy_value->GetListDeprecated()) {
     // If the protocol is invalid skip the entry.
     const std::string* protocol = protocol_origins_map.FindStringKey(
         AutoLaunchProtocolsPolicyHandler::kProtocolNameKey);
@@ -130,7 +130,7 @@
       return !IsValidOriginMatchingPattern(pattern.GetString());
     });
     // If the origin list is empty skip the entry.
-    if (origin_patterns_list->GetList().size() == 0)
+    if (origin_patterns_list->GetListDeprecated().size() == 0)
       continue;
 
     validated_pref_values.Append(protocol_origins_map.Clone());
diff --git a/chrome/browser/external_protocol/external_protocol_handler.cc b/chrome/browser/external_protocol/external_protocol_handler.cc
index f10b89c7..c095682a 100644
--- a/chrome/browser/external_protocol/external_protocol_handler.cc
+++ b/chrome/browser/external_protocol/external_protocol_handler.cc
@@ -261,7 +261,7 @@
     return false;
 
   const base::Value* origin_patterns = nullptr;
-  for (const base::Value& entry : exempted_protocols->GetList()) {
+  for (const base::Value& entry : exempted_protocols->GetListDeprecated()) {
     const base::DictionaryValue& protocol_origins_map =
         base::Value::AsDictionaryValue(entry);
     const std::string* protocol = protocol_origins_map.FindStringKey(
diff --git a/chrome/browser/federated_learning/floc_remote_permission_service.cc b/chrome/browser/federated_learning/floc_remote_permission_service.cc
index f56e60a0..29a7817 100644
--- a/chrome/browser/federated_learning/floc_remote_permission_service.cc
+++ b/chrome/browser/federated_learning/floc_remote_permission_service.cc
@@ -205,7 +205,7 @@
 
   response_value = ReadResponseAsList(request);
   if (response_value) {
-    base::Value::ListView l = response_value->GetList();
+    base::Value::ListView l = response_value->GetListDeprecated();
     if (l.size() == 3) {
       if (l[0].is_bool())
         swaa = l[0].GetBool();
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java
index e5c4717..2dfec475 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java
@@ -161,7 +161,10 @@
     }
 
     private void setPlaceholders() {
-        setPadding();
+        // If showing this layout for Instant Start, add some padding to imitate the eventual width
+        // of the feed.
+        if (mInstantStart) setPadding();
+
         LinearLayout cardsParentView = findViewById(R.id.placeholders_layout);
         cardsParentView.removeAllViews();
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 316db2d..9c453ba 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -616,6 +616,11 @@
     "expiry_milestone": 103
   },
   {
+    "name": "bruschetta",
+    "owners": [ "davidmunro@google.com", "nverne", "sidereal" ],
+    "expiry_milestone": 110
+  },
+  {
     "name": "bypass-app-banner-engagement-checks",
     "owners": [ "dmurph" ],
     "expiry_milestone": 95
@@ -833,6 +838,11 @@
     "expiry_milestone": 99
   },
   {
+    "name": "content-suggestions-header-migration",
+    "owners": [ "thegreenfrog@google.com", "adamta@google.com" ],
+    "expiry_milestone": 105
+  },
+  {
     "name": "context-menu-actions-refresh",
     "owners": [ "ewannpv@google.com", "gambard@google.com" ],
     "expiry_milestone": 99
@@ -917,11 +927,6 @@
     "expiry_milestone": 82
   },
   {
-    "name": "contextual-search-second-tap",
-    "owners": [ "//chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/OWNERS" ],
-    "expiry_milestone": 82
-  },
-  {
     "name": "contextual-search-translations",
     "owners": [ "//chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/OWNERS", "contextual-search-eng@google.com" ],
     "expiry_milestone": 99
@@ -3210,7 +3215,7 @@
   {
     "name": "feed-loading-placeholder",
     "owners": [ "//chrome/android/feed/OWNERS", "dewittj@chromium.org" ],
-    "expiry_milestone": 99
+    "expiry_milestone": 101
   },
   {
     "name": "feed-share",
@@ -3278,6 +3283,11 @@
     "expiry_milestone": 105
   },
   {
+    "name": "files-web-drive-office",
+    "owners": [ "jboulic", "petermarshall", "simmonsjosh@google.com" ],
+    "expiry_milestone": 105
+  },
+  {
     "name": "fill-on-account-select",
     "owners": [ "kazinova@google.com", "vasilii" ],
     "expiry_milestone": 100
@@ -3411,6 +3421,11 @@
     "expiry_milestone": 105
   },
   {
+    "name": "full-user-agent",
+    "owners": [ "victortan", "abeyad"],
+    "expiry_milestone": 113
+  },
+  {
     "name": "fullscreen-viewport-adjustment-experiment",
     "owners": [ "thegreenfrog", "bling-flags@google.com" ],
     // Needed for manual testing of fallback flow on iOS.
@@ -4086,6 +4101,11 @@
     "expiry_milestone": 103
   },
   {
+    "name": "nearby-sharing-receive-wifi-credentials",
+    "owners": [ "crisrael@google.com", "chromeos-cross-device-eng@google.com" ],
+    "expiry_milestone": 103
+  },
+  {
     "name": "nearby-sharing-self-share",
     "owners": [ "hansenmichael@google.com", "cvandermerwe@google.com", "chromeos-cross-device-eng@google.com" ],
     "expiry_milestone": 105
@@ -4243,7 +4263,7 @@
   {
     "name": "omnibox-active-search-engines",
     "owners": [ "yoangela", "chrome-omnibox-team@google.com" ],
-    "expiry_milestone": 99
+    "expiry_milestone": 105
   },
   {
     "name": "omnibox-adaptive-suggestions-count",
@@ -5389,6 +5409,11 @@
     "expiry_milestone": 102
   },
   {
+    "name": "suppress-toolbar-captures",
+    "owners": [ "pnoland@google.com" ],
+    "expiry_milestone": 104
+  },
+  {
     "name": "swap-android-share-hub-rows",
     "owners": [ "ellyjones", "chrome-sharing-eng@google.com" ],
     "expiry_milestone": 100
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 40269e08..dad7fc9 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -506,7 +506,7 @@
     "Certificate Transparency 2022 Policy";
 const char kCertificateTransparency2022PolicyDescription[] =
     "Enables the 2022 policy for Certificate Transparency requirements for "
-    "certificates issued after February 1, 2022. This policy increases the "
+    "certificates issued after April 15, 2022. This policy increases the "
     "number of SCTs required for certificates with a lifetime over 180 days, "
     "and replaces the one Google log requirement with log operator diversity "
     "requirements.";
@@ -713,6 +713,13 @@
     "Slows down animations triggered by documentTransition JavaScript API for "
     "debugging.";
 
+const char kEnableAutoDisableAccessibilityName[] = "Auto-disable Accessibility";
+const char kEnableAutoDisableAccessibilityDescription[] =
+    "When accessibility APIs are no longer being requested, automatically "
+    "disables accessibility. This might happen if an assistive technology is "
+    "turned off or if an extension which uses accessibility APIs no longer "
+    "needs them.";
+
 const char kEnableAutofillAddressSavePromptName[] =
     "Autofill Address Save Prompts";
 const char kEnableAutofillAddressSavePromptDescription[] =
@@ -1384,6 +1391,11 @@
     "Explicitly force the UI to left-to-right (LTR) or right-to-left (RTL) "
     "mode, overriding the default direction of the UI language.";
 
+const char kFullUserAgentName[] = "Full User-Agent request header";
+const char kFullUserAgentDescription[] =
+    "If set, use the full (non-reduced) user agent string for the User-Agent "
+    "request header and the JS APIs.";
+
 const char kGlobalMediaControlsModernUIName[] =
     "Global Media Controls Modern UI";
 
@@ -2333,6 +2345,10 @@
     "Match Autofill suggestions based on substrings (token prefixes) rather "
     "than just prefixes.";
 
+const char kSuppressToolbarCapturesName[] = "Suppress Toolbar Captures";
+const char kSuppressToolbarCapturesDescription[] =
+    "Suppress Toolbar Captures except when certain properties change.";
+
 const char kSyncAutofillWalletOfferDataName[] =
     "Enable syncing autofill offer data";
 const char kSyncAutofillWalletOfferDataDescription[] =
@@ -3054,12 +3070,6 @@
 const char kContextualSearchRankerQueryDescription[] =
     "Enables prediction of tap gestures using Assist-Ranker machine learning.";
 
-const char kContextualSearchSecondTapName[] =
-    "Contextual Search second tap triggering";
-const char kContextualSearchSecondTapDescription[] =
-    "Enables triggering on a second tap gesture even when Ranker would "
-    "normally suppress that tap.";
-
 const char kContextualSearchThinWebViewImplementationName[] =
     "Use Contextual Search ThinWebView implementation";
 const char kContextualSearchThinWebViewImplementationDescription[] =
@@ -3650,13 +3660,6 @@
     "media playing in Chrome. Turn the feature on in "
     "chrome://settings/accessibility.";
 
-const char kEnableAutoDisableAccessibilityName[] = "Auto-disable Accessibility";
-const char kEnableAutoDisableAccessibilityDescription[] =
-    "When accessibility APIs are no longer being requested, automatically "
-    "disables accessibility. This might happen if an assistive technology is "
-    "turned off or if an extension which uses accessibility APIs no longer "
-    "needs them.";
-
 const char kCopyLinkToTextName[] = "Copy Link To Text";
 const char kCopyLinkToTextDescription[] =
     "Adds an item to the context menu to allow a user to copy a link to the "
@@ -4327,6 +4330,10 @@
 const char kCrostiniVirtualKeyboardSupportDescription[] =
     "Experimental support for the Virtual Keyboard on Crostini.";
 
+const char kBruschettaName[] = "Enable the third party VMs feature";
+const char kBruschettaDescription[] =
+    "Enables UI support for third party/generic VMs";
+
 const char kCryptAuthV2DedupDeviceLastActivityTimeName[] =
     "Dedup devices by last activity time";
 const char kCryptAuthV2DedupDeviceLastActivityTimeDescription[] =
@@ -4780,6 +4787,11 @@
 const char kFilesTrashDescription[] =
     "Enable trash for My files volume in Files App.";
 
+const char kFilesWebDriveOfficeName[] =
+    "Enable Files App Web Drive Office support.";
+const char kFilesWebDriveOfficeDescription[] =
+    "Enable opening Office files located in Files app Drive in Web Drive.";
+
 const char kForceSpectreVariant2MitigationName[] =
     "Force Spectre variant 2 mitigagtion";
 const char kForceSpectreVariant2MitigationDescription[] =
@@ -5032,6 +5044,11 @@
 const char kNearbySharingOnePageOnboardingDescription[] =
     "Enable new One-page onboarding workflow for Nearby Share.";
 
+const char kNearbySharingReceiveWifiCredentialsName[] =
+    "Nearby Sharing Receive WiFi Credentials.";
+const char kNearbySharingReceiveWifiCredentialsDescription[] =
+    "Enables receiving WiFi networks using Nearby Share.";
+
 const char kNearbySharingSelfShareName[] = "Nearby Sharing Self Share";
 const char kNearbySharingSelfShareDescription[] =
     "Enables seamless sharing between a user's own devices.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 5a346828..36b2a09 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -163,6 +163,9 @@
 extern const char kAssistantConsentV2Name[];
 extern const char kAssistantConsentV2Description[];
 
+extern const char kEnableAutoDisableAccessibilityName[];
+extern const char kEnableAutoDisableAccessibilityDescription[];
+
 extern const char kAutofillAlwaysReturnCloudTokenizedCardName[];
 extern const char kAutofillAlwaysReturnCloudTokenizedCardDescription[];
 
@@ -786,6 +789,9 @@
 extern const char kForceUiDirectionName[];
 extern const char kForceUiDirectionDescription[];
 
+extern const char kFullUserAgentName[];
+extern const char kFullUserAgentDescription[];
+
 extern const char kGlobalMediaControlsModernUIName[];
 extern const char kGlobalMediaControlsModernUIDescription[];
 
@@ -1335,6 +1341,9 @@
 extern const char kSubframeShutdownDelayName[];
 extern const char kSubframeShutdownDelayDescription[];
 
+extern const char kSuppressToolbarCapturesName[];
+extern const char kSuppressToolbarCapturesDescription[];
+
 extern const char kSystemKeyboardLockName[];
 extern const char kSystemKeyboardLockDescription[];
 
@@ -1734,9 +1743,6 @@
 extern const char kContextualSearchRankerQueryName[];
 extern const char kContextualSearchRankerQueryDescription[];
 
-extern const char kContextualSearchSecondTapName[];
-extern const char kContextualSearchSecondTapDescription[];
-
 extern const char kContextualSearchThinWebViewImplementationName[];
 extern const char kContextualSearchThinWebViewImplementationDescription[];
 
@@ -2087,9 +2093,6 @@
 extern const char kEnableAccessibilityLiveCaptionName[];
 extern const char kEnableAccessibilityLiveCaptionDescription[];
 
-extern const char kEnableAutoDisableAccessibilityName[];
-extern const char kEnableAutoDisableAccessibilityDescription[];
-
 extern const char kCopyLinkToTextName[];
 extern const char kCopyLinkToTextDescription[];
 
@@ -2481,6 +2484,9 @@
 extern const char kCrostiniVirtualKeyboardSupportName[];
 extern const char kCrostiniVirtualKeyboardSupportDescription[];
 
+extern const char kBruschettaName[];
+extern const char kBruschettaDescription[];
+
 extern const char kCryptAuthV2DedupDeviceLastActivityTimeName[];
 extern const char kCryptAuthV2DedupDeviceLastActivityTimeDescription[];
 
@@ -2738,6 +2744,9 @@
 extern const char kFilesTrashName[];
 extern const char kFilesTrashDescription[];
 
+extern const char kFilesWebDriveOfficeName[];
+extern const char kFilesWebDriveOfficeDescription[];
+
 extern const char kFiltersInRecentsName[];
 extern const char kFiltersInRecentsDescription[];
 
@@ -2885,6 +2894,9 @@
 extern const char kNearbySharingOnePageOnboardingName[];
 extern const char kNearbySharingOnePageOnboardingDescription[];
 
+extern const char kNearbySharingReceiveWifiCredentialsName[];
+extern const char kNearbySharingReceiveWifiCredentialsDescription[];
+
 extern const char kNearbySharingSelfShareName[];
 extern const char kNearbySharingSelfShareDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index acc3c625..a07d063 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -89,6 +89,7 @@
     &autofill::features::kAutofillEnableSupportForHonorificPrefixes,
     &autofill::features::kAutofillEnableSupportForMoreStructureInAddresses,
     &autofill::features::kAutofillEnableSupportForMoreStructureInNames,
+    &autofill::features::kAutofillEnableUpdateVirtualCardEnrollment,
     &blink::features::kPrerender2,
     &blink::features::kForceWebContentsDarkMode,
     &commerce::kCommerceMerchantViewer,
@@ -213,7 +214,6 @@
     &kContextualSearchLongpressResolve,
     &kContextualSearchMlTapSuppression,
     &KContextualSearchNewSettings,
-    &kContextualSearchSecondTap,
     &kContextualSearchTapDisableOverride,
     &kContextualSearchThinWebViewImplementation,
     &kContextualSearchTranslations,
@@ -270,6 +270,7 @@
     &kSpannableInlineAutocomplete,
     &kSpecialLocaleWrapper,
     &kSpecialUserDecision,
+    &kSuppressToolbarCaptures,
     &kStoreHoursAndroid,
     &kSwapPixelFormatToFixConvertFromTranslucent,
     &kTabEngagementReportingAndroid,
@@ -573,9 +574,6 @@
 const base::Feature KContextualSearchNewSettings{
     "ContextualSearchNewSettings", base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kContextualSearchSecondTap{
-    "ContextualSearchSecondTap", base::FEATURE_DISABLED_BY_DEFAULT};
-
 const base::Feature kContextualSearchTapDisableOverride{
     "ContextualSearchTapDisableOverride", base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -749,6 +747,9 @@
 const base::Feature kStoreHoursAndroid{"StoreHoursAndroid",
                                        base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kSuppressToolbarCaptures{"SuppressToolbarCaptures",
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kSwapPixelFormatToFixConvertFromTranslucent{
     "SwapPixelFormatToFixConvertFromTranslucent",
     base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index a0051cc..8505563 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -73,7 +73,6 @@
 extern const base::Feature kContextualSearchLongpressResolve;
 extern const base::Feature kContextualSearchMlTapSuppression;
 extern const base::Feature KContextualSearchNewSettings;
-extern const base::Feature kContextualSearchSecondTap;
 extern const base::Feature kContextualSearchTapDisableOverride;
 extern const base::Feature kContextualSearchThinWebViewImplementation;
 extern const base::Feature kContextualSearchTranslations;
@@ -138,6 +137,7 @@
 extern const base::Feature kSpecialLocaleWrapper;
 extern const base::Feature kSpecialUserDecision;
 extern const base::Feature kStoreHoursAndroid;
+extern const base::Feature kSuppressToolbarCaptures;
 extern const base::Feature kSwapPixelFormatToFixConvertFromTranslucent;
 extern const base::Feature kTabEngagementReportingAndroid;
 extern const base::Feature kTabGroupsAndroid;
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 a6f51cf..8918b403 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
@@ -213,6 +213,8 @@
             "AutofillEnableSupportForMoreStructureInAddresses";
     public static final String AUTOFILL_ENABLE_SUPPORT_FOR_MORE_STRUCTURE_IN_NAMES =
             "AutofillEnableSupportForMoreStructureInNames";
+    public static final String AUTOFILL_ENABLE_UPDATE_VIRTUAL_CARD_ENROLLMENT =
+            "AutofillEnableUpdateVirtualCardEnrollment";
     public static final String ANDROID_LAYOUT_CHANGE_TAB_REPARENT =
             "AndroidLayoutChangeTabReparenting";
     public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION =
@@ -292,7 +294,6 @@
     public static final String CONTEXTUAL_SEARCH_NEW_SETTINGS = "ContextualSearchNewSettings";
     public static final String CONTEXTUAL_SEARCH_LONGPRESS_RESOLVE =
             "ContextualSearchLongpressResolve";
-    public static final String CONTEXTUAL_SEARCH_SECOND_TAP = "ContextualSearchSecondTap";
     public static final String CONTEXTUAL_SEARCH_TAP_DISABLE_OVERRIDE =
             "ContextualSearchTapDisableOverride";
     public static final String CONTEXTUAL_SEARCH_THIN_WEB_VIEW_IMPLEMENTATION =
@@ -489,6 +490,7 @@
             "SplitCacheByNetworkIsolationKey";
     public static final String START_SURFACE_ANDROID = "StartSurfaceAndroid";
     public static final String STORE_HOURS = "StoreHoursAndroid";
+    public static final String SUPPRESS_TOOLBAR_CAPTURES = "SuppressToolbarCaptures";
     public static final String SWAP_ANDROID_SHARE_HUB_ROWS = "SwapAndroidShareHubRows";
     public static final String SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT =
             "SwapPixelFormatToFixConvertFromTranslucent";
diff --git a/chrome/browser/font_prewarmer_tab_helper.cc b/chrome/browser/font_prewarmer_tab_helper.cc
index e38e0077..5209b29 100644
--- a/chrome/browser/font_prewarmer_tab_helper.cc
+++ b/chrome/browser/font_prewarmer_tab_helper.cc
@@ -49,7 +49,7 @@
                                                      const char* pref_name) {
   const base::Value* font_name_list = profile->GetPrefs()->GetList(pref_name);
   DCHECK(font_name_list && font_name_list->is_list());
-  const auto font_name_list_view = font_name_list->GetList();
+  const auto font_name_list_view = font_name_list->GetListDeprecated();
   if (font_name_list_view.empty())
     return {};
 
diff --git a/chrome/browser/google/google_update_policy_fetcher_win.cc b/chrome/browser/google/google_update_policy_fetcher_win.cc
index 458369f..af9dddc 100644
--- a/chrome/browser/google/google_update_policy_fetcher_win.cc
+++ b/chrome/browser/google/google_update_policy_fetcher_win.cc
@@ -17,13 +17,13 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/com_init_util.h"
 #include "base/win/scoped_bstr.h"
+#include "chrome/browser/component_updater/updater_state.h"
 #include "chrome/browser/google/google_update_policy_fetcher_win_util.h"
 #include "chrome/install_static/install_util.h"
 #include "components/policy/core/common/policy_map.h"
 #include "components/policy/core/common/policy_types.h"
 #include "components/policy/core/common/schema.h"
 #include "components/strings/grit/components_strings.h"
-#include "components/update_client/updater_state.h"
 #include "google_update/google_update_idl.h"
 
 namespace {
@@ -268,13 +268,13 @@
 
 // Returns the state for versions prior to release 1.3.36.21.
 std::unique_ptr<GoogleUpdateState> GetLegacyGoogleUpdateState() {
-  auto state =
-      update_client::UpdaterState::GetState(install_static::IsSystemInstall());
+  component_updater::UpdaterState::Attributes state =
+      component_updater::UpdaterState::GetState(
+          install_static::IsSystemInstall());
   auto result = std::make_unique<GoogleUpdateState>();
-  const auto version = state->find("version");
-  if (version != state->end())
+  const auto version = state.find("version");
+  if (version != state.end())
     result->version = base::ASCIIToWide(version->second);
-
   return result;
 }
 
diff --git a/chrome/browser/image_editor/screenshot_flow.cc b/chrome/browser/image_editor/screenshot_flow.cc
index cdca79d5..2e90a86 100644
--- a/chrome/browser/image_editor/screenshot_flow.cc
+++ b/chrome/browser/image_editor/screenshot_flow.cc
@@ -272,6 +272,28 @@
   std::move(flow_callback_).Run(result);
 }
 
+bool ScreenshotFlow::IsUIOverlayShown() {
+  return screen_capture_layer_ != nullptr && screen_capture_layer_->visible();
+}
+
+void ScreenshotFlow::ResetUIOverlayBounds() {
+#if BUILDFLAG(IS_MAC)
+  gfx::Rect bounds = web_contents_->GetViewBounds();
+  const gfx::NativeView web_contents_view =
+      web_contents_->GetContentNativeView();
+  views::Widget* widget =
+      views::Widget::GetWidgetForNativeView(web_contents_view);
+  if (widget != nullptr) {
+    const gfx::Rect offset_bounds = widget->GetWindowBoundsInScreen();
+    bounds.Offset(-offset_bounds.x(), -offset_bounds.y());
+  }
+#else
+  const gfx::NativeWindow& native_window = web_contents_->GetNativeView();
+  const gfx::Rect bounds = native_window->bounds();
+#endif
+  screen_capture_layer_->SetBounds(bounds);
+}
+
 void ScreenshotFlow::OnPaintLayer(const ui::PaintContext& context) {
   if (!screen_capture_layer_)
     return;
@@ -381,6 +403,15 @@
           ScreenshotCaptureResultCode::USER_NAVIGATED_EXIT, gfx::Rect());
   }
 
+  // content::WebContentsObserver
+  void FrameSizeChanged(content::RenderFrameHost* render_frame_host,
+                        const gfx::Size& frame_size) override {
+    // We only care to resize the UI overlay when it's visible to the user.
+    if (screenshot_flow_->IsUIOverlayShown()) {
+      screenshot_flow_->ResetUIOverlayBounds();
+    }
+  }
+
  private:
   raw_ptr<ScreenshotFlow> screenshot_flow_;
 };
diff --git a/chrome/browser/image_editor/screenshot_flow.h b/chrome/browser/image_editor/screenshot_flow.h
index d0ca20ba..5fd7ed4 100644
--- a/chrome/browser/image_editor/screenshot_flow.h
+++ b/chrome/browser/image_editor/screenshot_flow.h
@@ -130,6 +130,13 @@
   // Adds mouse listeners.
   void CreateAndAddUIOverlay();
 
+  // Checks whether the UI overlay is visible.
+  bool IsUIOverlayShown();
+
+  // Resizes the UI overlay. It's used to make the UI overlay responsive to
+  // the frame size changes.
+  void ResetUIOverlayBounds();
+
   // Removes the UI overlay and any listeners.
   void RemoveUIOverlay();
 
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoStartup.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoStartup.java
index 22eda94e..f3c6828 100644
--- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoStartup.java
+++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/IncognitoStartup.java
@@ -6,7 +6,9 @@
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
+import android.app.ActivityManager.AppTask;
 import android.app.ActivityManager.RecentTaskInfo;
+import android.util.Pair;
 
 import org.chromium.base.ApplicationStatus;
 import org.chromium.base.ContextUtils;
@@ -51,12 +53,13 @@
             return false;
         }
 
-        Set<RecentTaskInfo> matchingTaskInfos =
-                AndroidTaskUtils.getRecentTaskInfosMatchingComponentNames(
+        Set<Pair<AppTask, RecentTaskInfo>> tabbedModeTasks =
+                AndroidTaskUtils.getRecentAppTasksMatchingComponentNames(
                         ContextUtils.getApplicationContext(), componentNames);
+
         Set<Integer> tabbedModeTaskIds = new HashSet<>();
-        for (RecentTaskInfo info : matchingTaskInfos) {
-            tabbedModeTaskIds.add(info.id);
+        for (Pair<AppTask, RecentTaskInfo> pair : tabbedModeTasks) {
+            tabbedModeTaskIds.add(pair.second.id);
         }
 
         if (tabbedModeTaskIds.size() == 0) {
diff --git a/chrome/browser/lacros/account_manager/account_cache.cc b/chrome/browser/lacros/account_manager/account_cache.cc
index e069b982..7119332 100644
--- a/chrome/browser/lacros/account_manager/account_cache.cc
+++ b/chrome/browser/lacros/account_manager/account_cache.cc
@@ -22,7 +22,7 @@
   if (!list->is_list())
     return {};
   AccountCache::AccountIdSet account_ids;
-  for (const base::Value& value : list->GetList()) {
+  for (const base::Value& value : list->GetListDeprecated()) {
     const std::string* gaia_id = value.GetIfString();
     if (gaia_id)
       account_ids.insert(*gaia_id);
diff --git a/chrome/browser/lacros/account_manager/account_profile_mapper_unittest.cc b/chrome/browser/lacros/account_manager/account_profile_mapper_unittest.cc
index 151afae5..d2cd955d 100644
--- a/chrome/browser/lacros/account_manager/account_profile_mapper_unittest.cc
+++ b/chrome/browser/lacros/account_manager/account_profile_mapper_unittest.cc
@@ -425,7 +425,7 @@
     const base::Value* list = local_state()->Get(kLacrosAccountIdsPref);
     EXPECT_TRUE(list->is_list());
     return base::MakeFlatSet<std::string>(
-        list->GetList(), {},
+        list->GetListDeprecated(), {},
         [](const base::Value& value) { return value.GetString(); });
   }
 
diff --git a/chrome/browser/lacros/external_protocol_dialog.cc b/chrome/browser/lacros/external_protocol_dialog.cc
new file mode 100644
index 0000000..45b7711
--- /dev/null
+++ b/chrome/browser/lacros/external_protocol_dialog.cc
@@ -0,0 +1,59 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/external_protocol/external_protocol_handler.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/arc/arc_external_protocol_dialog.h"
+#include "chrome/browser/lacros/arc/arc_intent_helper_mojo_lacros.h"
+#include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/browser/ui/views/external_protocol_dialog.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/weak_document_ptr.h"
+#include "content/public/browser/web_contents.h"
+#include "ui/aura/window.h"
+#include "url/gurl.h"
+
+using content::WebContents;
+
+namespace {
+
+void OnArcHandled(bool handled) {
+  if (handled)
+    return;
+
+  // TODO(crbug.com/1293604): Handle dialog more precisely when it is not
+  // successfully handled by ARC.
+  LOG(WARNING) << "Url is not successfully handled by ARC.";
+  return;
+}
+
+}  // namespace
+
+///////////////////////////////////////////////////////////////////////////////
+// ExternalProtocolHandler
+
+// static
+void ExternalProtocolHandler::RunExternalProtocolDialog(
+    const GURL& url,
+    WebContents* web_contents,
+    ui::PageTransition page_transition,
+    bool has_user_gesture,
+    const absl::optional<url::Origin>& initiating_origin,
+    content::WeakDocumentPtr initiator_document) {
+  // First, check if ARC version of the dialog is available and run ARC version
+  // when possible.
+  // TODO(ellyjones): Refactor arc::RunArcExternalProtocolDialog() to take a
+  // web_contents directly, which will mean sorting out how lifetimes work in
+  // that code. Same for OnArcHandled() (crbug.com/1136237).
+  int render_process_host_id =
+      web_contents->GetRenderViewHost()->GetProcess()->GetID();
+  int routing_id = web_contents->GetRenderViewHost()->GetRoutingID();
+  arc::RunArcExternalProtocolDialog(
+      url, initiating_origin, render_process_host_id, routing_id,
+      page_transition, has_user_gesture,
+      std::make_unique<arc::ArcIntentHelperMojoLacros>(),
+      base::BindOnce(&OnArcHandled));
+}
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
index 2714537..df8b7f5 100644
--- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
+++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
@@ -28,7 +28,6 @@
 import org.chromium.chrome.browser.language.settings.LanguageItem;
 import org.chromium.chrome.browser.language.settings.LanguagesManager;
 import org.chromium.chrome.browser.translate.TranslateBridge;
-import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
 import org.chromium.components.language.AndroidLanguageMetricsBridge;
 import org.chromium.components.language.GeoLanguageProviderBridge;
 import org.chromium.net.NetworkChangeNotifier;
@@ -519,9 +518,6 @@
             if (TranslateBridge.getAppLanguagePromptShown()) return false;
         }
 
-        boolean isAccessibilityEnabled = ChromeAccessibilityUtil.get().isAccessibilityEnabled();
-        recordIsAccessibilityEnabled(isAccessibilityEnabled);
-
         boolean isOnline = NetworkChangeNotifier.isOnline();
         recordOnlineStatus(isOnline);
 
@@ -560,12 +556,6 @@
                 "LanguageSettings.AppLanguagePrompt.IsOnline", isOnline);
     }
 
-    private static void recordIsAccessibilityEnabled(boolean isAccessibilityEnabled) {
-        RecordHistogram.recordBooleanHistogram(
-                "LanguageSettings.AppLanguagePrompt.IsAccessibilityEnabled",
-                isAccessibilityEnabled);
-    }
-
     private static void recordOpenDuration(String type, long displayTime) {
         RecordHistogram.recordLongTimesHistogram100(
                 "LanguageSettings.AppLanguagePrompt.OpenDuration." + type, displayTime);
diff --git a/chrome/browser/lifetime/application_lifetime.cc b/chrome/browser/lifetime/application_lifetime.cc
index 93da235..181a8f7b 100644
--- a/chrome/browser/lifetime/application_lifetime.cc
+++ b/chrome/browser/lifetime/application_lifetime.cc
@@ -118,10 +118,10 @@
   const base::ListValue* login_screen_locales = nullptr;
   if (cros_settings->GetList(ash::kDeviceLoginScreenLocales,
                              &login_screen_locales) &&
-      !login_screen_locales->GetList().empty() &&
-      login_screen_locales->GetList()[0].is_string()) {
+      !login_screen_locales->GetListDeprecated().empty() &&
+      login_screen_locales->GetListDeprecated()[0].is_string()) {
     std::string login_screen_locale =
-        login_screen_locales->GetList()[0].GetString();
+        login_screen_locales->GetListDeprecated()[0].GetString();
     local_state->SetString(language::prefs::kApplicationLocale,
                            login_screen_locale);
     return true;
diff --git a/chrome/browser/media/android/cdm/media_drm_origin_id_manager.cc b/chrome/browser/media/android/cdm/media_drm_origin_id_manager.cc
index 38d78e8f..69074e2 100644
--- a/chrome/browser/media/android/cdm/media_drm_origin_id_manager.cc
+++ b/chrome/browser/media/android/cdm/media_drm_origin_id_manager.cc
@@ -145,8 +145,8 @@
   if (!origin_ids)
     return 0;
 
-  DVLOG(3) << "count: " << origin_ids->GetList().size();
-  return origin_ids->GetList().size();
+  DVLOG(3) << "count: " << origin_ids->GetListDeprecated().size();
+  return origin_ids->GetListDeprecated().size();
 }
 
 base::UnguessableToken TakeFirstOriginId(PrefService* const pref_service) {
@@ -160,10 +160,10 @@
   if (!origin_ids)
     return base::UnguessableToken::Null();
 
-  if (origin_ids->GetList().empty())
+  if (origin_ids->GetListDeprecated().empty())
     return base::UnguessableToken::Null();
 
-  auto first_entry = origin_ids->GetList().begin();
+  auto first_entry = origin_ids->GetListDeprecated().begin();
   absl::optional<base::UnguessableToken> result =
       base::ValueToUnguessableToken(*first_entry);
   if (!result)
diff --git a/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc b/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc
index 9c656b8..2b46173 100644
--- a/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc
+++ b/chrome/browser/media/android/cdm/media_drm_origin_id_manager_unittest.cc
@@ -128,7 +128,7 @@
       // |kExpectedPreferenceListSize| origin IDs.
       DVLOG(1) << "Per-application provisioning is supported.";
       EXPECT_TRUE(list->is_list());
-      EXPECT_EQ(list->GetList().size(), kExpectedPreferenceListSize);
+      EXPECT_EQ(list->GetListDeprecated().size(), kExpectedPreferenceListSize);
     } else {
       // No pre-provisioned origin IDs should exist. In fact, the dictionary
       // should not have any entries.
@@ -278,7 +278,7 @@
 
   auto* list = dict->FindKey(kAvailableOriginIds);
   EXPECT_TRUE(list->is_list());
-  EXPECT_EQ(list->GetList().size(), kExpectedPreferenceListSize);
+  EXPECT_EQ(list->GetListDeprecated().size(), kExpectedPreferenceListSize);
 }
 
 TEST_F(MediaDrmOriginIdManagerTest, OriginIdNotInList) {
@@ -295,8 +295,9 @@
   DVLOG(1) << "Checking preference " << kMediaDrmOriginIds;
   auto* dict = GetDictionary(kMediaDrmOriginIds);
   auto* list = dict->FindKey(kAvailableOriginIds);
-  EXPECT_FALSE(base::Contains(
-      list->GetList(), base::UnguessableTokenToValue(origin_id.value())));
+  EXPECT_FALSE(
+      base::Contains(list->GetListDeprecated(),
+                     base::UnguessableTokenToValue(origin_id.value())));
 }
 
 TEST_F(MediaDrmOriginIdManagerTest, ProvisioningFail) {
@@ -345,7 +346,7 @@
   // As well, the list of available pre-provisioned origin IDs should be full.
   auto* list = dict->FindKey(kAvailableOriginIds);
   EXPECT_TRUE(list->is_list());
-  EXPECT_EQ(list->GetList().size(), kExpectedPreferenceListSize);
+  EXPECT_EQ(list->GetListDeprecated().size(), kExpectedPreferenceListSize);
 }
 
 TEST_F(MediaDrmOriginIdManagerTest, ProvisioningAfterExpiration) {
@@ -389,7 +390,7 @@
     // If per-application provisioning is supported, it's OK to attempt
     // to pre-provision origin IDs any time.
     DVLOG(1) << "Per-application provisioning is supported.";
-    EXPECT_EQ(list->GetList().size(), kExpectedPreferenceListSize);
+    EXPECT_EQ(list->GetListDeprecated().size(), kExpectedPreferenceListSize);
     EXPECT_FALSE(dict->FindKey(kExpirableToken));
   } else {
     // Per-application provisioning is not supported, so attempting to
@@ -453,7 +454,7 @@
   dict = GetDictionary(kMediaDrmOriginIds);
   DVLOG(1) << DisplayPref(dict);
   auto* list = dict->FindKey(kAvailableOriginIds);
-  EXPECT_EQ(list->GetList().size(), kExpectedPreferenceListSize);
+  EXPECT_EQ(list->GetListDeprecated().size(), kExpectedPreferenceListSize);
 }
 
 TEST_F(MediaDrmOriginIdManagerTest, NetworkChangeFails) {
diff --git a/chrome/browser/media/chromeos_login_media_access_handler.cc b/chrome/browser/media/chromeos_login_media_access_handler.cc
index 9d0ce74..2843e4c 100644
--- a/chrome/browser/media/chromeos_login_media_access_handler.cc
+++ b/chrome/browser/media/chromeos_login_media_access_handler.cc
@@ -55,7 +55,7 @@
     return false;
 
   DCHECK(list_value->is_list());
-  for (const auto& base_value : list_value->GetList()) {
+  for (const auto& base_value : list_value->GetListDeprecated()) {
     const std::string* value = base_value.GetIfString();
     if (value) {
       const ContentSettingsPattern pattern =
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc
index 16f1f90c..fbc3c4e3 100644
--- a/chrome/browser/media/encrypted_media_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -282,6 +282,19 @@
     title_watcher->AlsoWaitForTitle(kEmeRenewalMissingHeader);
   }
 
+#if BUILDFLAG(IS_CHROMEOS)
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    MediaBrowserTest::SetUpCommandLine(command_line);
+
+    // Persistent license is supported on ChromeOS when protected media
+    // identifier is allowed which involves a user action. Use this switch to
+    // always allow the identifier for testing purpose. Note that the test page
+    // is hosted on "127.0.0.1". See net::EmbeddedTestServer for details.
+    command_line->AppendSwitchASCII(
+        switches::kUnsafelyAllowProtectedMediaIdentifierForDomain, "127.0.0.1");
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS)
+
 #if BUILDFLAG(ENABLE_LIBRARY_CDMS)
   void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
     base::CommandLine default_command_line(base::CommandLine::NO_PROGRAM);
diff --git a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
index afed319..dbe085f 100644
--- a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
@@ -795,7 +795,7 @@
                                     audio_mp4_flac_codecs()));
   EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
       kExternalClearKey, kVideoMP4MimeType, video_mp4_codecs()));
-#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
+#if BUILDFLAG(ENABLE_PLATFORM_ENCRYPTED_HEVC)
   EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
       kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs()));
 #else
@@ -911,7 +911,7 @@
   // Valid video types.
   EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
       kExternalClearKey, kVideoMP4MimeType, video_mp4_codecs()));
-#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
+#if BUILDFLAG(ENABLE_PLATFORM_ENCRYPTED_HEVC)
   EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
       kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs()));
 #else
diff --git a/chrome/browser/media/media_engagement_browsertest.cc b/chrome/browser/media/media_engagement_browsertest.cc
index 9da99524..8dd682cc 100644
--- a/chrome/browser/media/media_engagement_browsertest.cc
+++ b/chrome/browser/media/media_engagement_browsertest.cc
@@ -648,7 +648,7 @@
   ExpectScores(2, 2);
 }
 
-#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
+#if BUILDFLAG(IS_MAC)
 // https://crbug.com/1222896
 #define MAYBE_SessionNewTabSameURL DISABLED_SessionNewTabSameURL
 #else
diff --git a/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc b/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc
index abb40f43..cb4dfe2 100644
--- a/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.cc
@@ -8,6 +8,7 @@
 #include "base/containers/cxx20_erase.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
+#include "base/strings/stringprintf.h"
 #include "base/time/default_clock.h"
 #include "chrome/browser/media/router/data_decoder_util.h"
 #include "net/http/http_status_code.h"
@@ -17,6 +18,8 @@
 
 namespace {
 
+const char kLoggerComponent[] = "DialAppDiscoveryService";
+
 GURL GetAppUrl(const media_router::MediaSinkInternal& sink,
                const std::string& app_name) {
   // The DIAL spec (Section 5.4) implies that the app URL must not have a
@@ -66,6 +69,15 @@
   pending_requests_.back()->Start();
 }
 
+void DialAppDiscoveryService::BindLogger(
+    mojo::PendingRemote<mojom::Logger> pending_remote) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (logger_.is_bound())
+    return;
+  logger_.Bind(std::move(pending_remote));
+  logger_.reset_on_disconnect();
+}
+
 void DialAppDiscoveryService::SetParserForTest(
     std::unique_ptr<SafeDialAppInfoParser> parser) {
   parser_ = std::move(parser);
@@ -146,6 +158,14 @@
         .Run(sink_id_, app_name_,
              DialAppInfoResult(nullptr, DialAppInfoResultCode::kParsingError));
   } else {
+    if (service_->logger_.is_bound()) {
+      service_->logger_->LogInfo(
+          mojom::LogCategory::kDiscovery, kLoggerComponent,
+          base::StringPrintf("DIAL sink supports disconnect: %s",
+                             parsed_app_info->allow_stop ? "true" : "false"),
+          sink_id_, "", "");
+    }
+
     RecordDialFetchAppInfo(DialAppInfoResultCode::kOk);
     std::move(app_info_cb_)
         .Run(sink_id_, app_name_,
diff --git a/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.h b/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.h
index cde3426..8bdb1608 100644
--- a/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.h
+++ b/chrome/browser/media/router/discovery/dial/dial_app_discovery_service.h
@@ -18,6 +18,7 @@
 #include "chrome/browser/media/router/discovery/dial/parsed_dial_app_info.h"
 #include "chrome/browser/media/router/discovery/dial/safe_dial_app_info_parser.h"
 #include "components/media_router/common/discovery/media_sink_internal.h"
+#include "components/media_router/common/mojom/logger.mojom.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
@@ -86,6 +87,8 @@
                                 const std::string& app_name,
                                 DialAppInfoCallback app_info_cb);
 
+  void BindLogger(mojo::PendingRemote<mojom::Logger> pending_remote);
+
  private:
   friend class DialAppDiscoveryServiceTest;
 
@@ -150,6 +153,8 @@
   // Safe DIAL parser. Does the parsing in a utility process.
   std::unique_ptr<SafeDialAppInfoParser> parser_;
 
+  mojo::Remote<mojom::Logger> logger_;
+
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc
index b7b16668..483bd3e 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service.cc
@@ -66,6 +66,8 @@
 
 void DialMediaSinkService::BindLogger(
     mojo::PendingRemote<mojom::Logger> pending_remote) {
+  // TODO(crbug.com/1293535): Simplify how logger instances are made available
+  // to their clients.
   impl_->task_runner()->PostTask(
       FROM_HERE,
       base::BindOnce(&DialMediaSinkServiceImpl::BindLogger,
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc
index 2ad2b06e..d2ddbaa 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.cc
@@ -359,6 +359,11 @@
 
   logger_->LogInfo(mojom::LogCategory::kDiscovery, kLoggerComponent,
                    "DialMediaSinkService has started.", "", "", "");
+
+  mojo::PendingRemote<mojom::Logger> discovery_service_remote;
+  logger_->BindReceiver(
+      discovery_service_remote.InitWithNewPipeAndPassReceiver());
+  app_discovery_service_->BindLogger(std::move(discovery_service_remote));
 }
 
 }  // namespace media_router
diff --git a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
index 6d9e226..37e92ce 100644
--- a/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl_unittest.cc
@@ -372,21 +372,21 @@
 TEST_F(DialMediaSinkServiceImplTest, BindLogger) {
   std::unique_ptr<LoggerImpl> logger_1 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_1;
-  logger_1->Bind(pending_remote_1.InitWithNewPipeAndPassReceiver());
+  logger_1->BindReceiver(pending_remote_1.InitWithNewPipeAndPassReceiver());
   media_sink_service_->BindLogger(std::move(pending_remote_1));
 
   // Trying to bind another pending remote no-ops instead of causing
   // a DCHECK failure from binding to a remote that's already bound.
   std::unique_ptr<LoggerImpl> logger_2 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_2;
-  logger_2->Bind(pending_remote_2.InitWithNewPipeAndPassReceiver());
+  logger_2->BindReceiver(pending_remote_2.InitWithNewPipeAndPassReceiver());
   media_sink_service_->BindLogger(std::move(pending_remote_2));
 
   // Trying to bind a disconnected receiver should work.
   logger_1.reset();
   std::unique_ptr<LoggerImpl> logger_3 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_3;
-  logger_3->Bind(pending_remote_3.InitWithNewPipeAndPassReceiver());
+  logger_3->BindReceiver(pending_remote_3.InitWithNewPipeAndPassReceiver());
   media_sink_service_->BindLogger(std::move(pending_remote_3));
 }
 
diff --git a/chrome/browser/media/router/discovery/dial/safe_dial_app_info_parser.cc b/chrome/browser/media/router/discovery/dial/safe_dial_app_info_parser.cc
index 1d941cd4..497ae0b 100644
--- a/chrome/browser/media/router/discovery/dial/safe_dial_app_info_parser.cc
+++ b/chrome/browser/media/router/discovery/dial/safe_dial_app_info_parser.cc
@@ -31,7 +31,7 @@
       data_decoder::GetXmlElementChildren(additional_data_element);
   if (!child_elements || !child_elements->is_list())
     return;
-  for (const auto& child_element : child_elements->GetList()) {
+  for (const auto& child_element : child_elements->GetListDeprecated()) {
     std::string tag_name;
     if (!data_decoder::GetXmlElementTagName(child_element, &tag_name))
       continue;
@@ -133,7 +133,7 @@
   }
 
   ParsingResult parsing_result = ParsingResult::kSuccess;
-  for (const auto& child_element : child_elements->GetList()) {
+  for (const auto& child_element : child_elements->GetListDeprecated()) {
     parsing_result = ProcessChildElement(child_element, app_info.get());
     if (parsing_result != ParsingResult::kSuccess) {
       std::move(callback).Run(nullptr, parsing_result);
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
index 3983687..8013bb51 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.cc
@@ -157,6 +157,9 @@
 }
 
 void CastMediaSinkService::BindLogger(LoggerImpl* logger_impl) {
+  // TODO(crbug.com/1293535): Simplify how logger instances are made available
+  // to their clients.
+
   DCHECK(logger_impl);
   logger_impl_ = logger_impl;
   if (dns_sd_registry_) {
@@ -165,7 +168,7 @@
   }
 
   mojo::PendingRemote<mojom::Logger> pending_remote;
-  logger_impl_->Bind(pending_remote.InitWithNewPipeAndPassReceiver());
+  logger_impl_->BindReceiver(pending_remote.InitWithNewPipeAndPassReceiver());
   impl_->task_runner()->PostTask(
       FROM_HERE,
       base::BindOnce(&CastMediaSinkServiceImpl::BindLogger,
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
index 839e870..4d1aad79 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl.cc
@@ -716,6 +716,9 @@
 
 void CastMediaSinkServiceImpl::BindLogger(
     mojo::PendingRemote<mojom::Logger> pending_remote) {
+  // TODO(crbug.com/1293535): Simplify how logger instances are made available
+  // to their clients.
+
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Reset |logger_| if it is bound to a disconnected remote.
   if (logger_.is_bound())
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
index c840cdb..4c102ba 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
@@ -1337,21 +1337,21 @@
 TEST_P(CastMediaSinkServiceImplTest, BindLogger) {
   std::unique_ptr<LoggerImpl> logger_1 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_1;
-  logger_1->Bind(pending_remote_1.InitWithNewPipeAndPassReceiver());
+  logger_1->BindReceiver(pending_remote_1.InitWithNewPipeAndPassReceiver());
   media_sink_service_impl_.BindLogger(std::move(pending_remote_1));
 
   // Trying to bind another pending remote no-ops instead of causing
   // a DCHECK failure from binding to a remote that's already bound.
   mojo::PendingRemote<mojom::Logger> pending_remote_2;
   std::unique_ptr<LoggerImpl> logger_2 = std::make_unique<LoggerImpl>();
-  logger_2->Bind(pending_remote_2.InitWithNewPipeAndPassReceiver());
+  logger_2->BindReceiver(pending_remote_2.InitWithNewPipeAndPassReceiver());
   media_sink_service_impl_.BindLogger(std::move(pending_remote_2));
 
   // Trying to bind a disconnected receiver should work.
   logger_1.reset();
   std::unique_ptr<LoggerImpl> logger_3 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_3;
-  logger_3->Bind(pending_remote_3.InitWithNewPipeAndPassReceiver());
+  logger_3->BindReceiver(pending_remote_3.InitWithNewPipeAndPassReceiver());
   media_sink_service_impl_.BindLogger(std::move(pending_remote_3));
 }
 
diff --git a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
index f9cacaf2..61410c2 100644
--- a/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
+++ b/chrome/browser/media/router/mojo/media_router_mojo_impl.cc
@@ -725,7 +725,7 @@
 
 void MediaRouterMojoImpl::GetLogger(
     mojo::PendingReceiver<mojom::Logger> receiver) {
-  logger_.Bind(std::move(receiver));
+  logger_.BindReceiver(std::move(receiver));
 }
 
 LoggerImpl* MediaRouterMojoImpl::GetLogger() {
diff --git a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
index 67f4749..5f0ad959 100644
--- a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
+++ b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
@@ -68,7 +68,7 @@
                                  const std::string& origin) {
   ListPrefUpdate update(prefs,
                         media_router::prefs::kMediaRouterTabMirroringSources);
-  if (!base::Contains(update->GetList(), base::Value(origin)))
+  if (!base::Contains(update->GetListDeprecated(), base::Value(origin)))
     update->Append(origin);
 }
 #endif
@@ -836,7 +836,7 @@
   // profile.
   const base::Value* non_off_the_record_origins =
       profile()->GetPrefs()->GetList(prefs::kMediaRouterTabMirroringSources);
-  EXPECT_FALSE(base::Contains(non_off_the_record_origins->GetList(),
+  EXPECT_FALSE(base::Contains(non_off_the_record_origins->GetListDeprecated(),
                               base::Value(origin)));
 
   // Auto-join requests should be rejected.
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc
index c570007..7362ca9 100644
--- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc
+++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service.cc
@@ -129,6 +129,9 @@
 
 void CastAppDiscoveryServiceImpl::BindLogger(
     mojo::PendingRemote<mojom::Logger> pending_remote) {
+  // TODO(crbug.com/1293535): Simplify how logger instances are made available
+  // to their clients.
+
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Reset |logger_| if it is bound to a disconnected remote.
   if (logger_.is_bound())
diff --git a/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc b/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc
index 1cbf562e..ca506dd 100644
--- a/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_app_discovery_service_unittest.cc
@@ -331,21 +331,21 @@
 TEST_F(CastAppDiscoveryServiceTest, BindLogger) {
   std::unique_ptr<LoggerImpl> logger_1 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_1;
-  logger_1->Bind(pending_remote_1.InitWithNewPipeAndPassReceiver());
+  logger_1->BindReceiver(pending_remote_1.InitWithNewPipeAndPassReceiver());
   app_discovery_service_->BindLogger(std::move(pending_remote_1));
 
   // Trying to bind another pending remote no-ops instead of causing
   // a DCHECK failure from binding to a remote that's already bound.
   std::unique_ptr<LoggerImpl> logger_2 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_2;
-  logger_2->Bind(pending_remote_2.InitWithNewPipeAndPassReceiver());
+  logger_2->BindReceiver(pending_remote_2.InitWithNewPipeAndPassReceiver());
   app_discovery_service_->BindLogger(std::move(pending_remote_2));
 
   // Trying to bind a disconnected receiver should work.
   logger_1.reset();
   std::unique_ptr<LoggerImpl> logger_3 = std::make_unique<LoggerImpl>();
   mojo::PendingRemote<mojom::Logger> pending_remote_3;
-  logger_3->Bind(pending_remote_3.InitWithNewPipeAndPassReceiver());
+  logger_3->BindReceiver(pending_remote_3.InitWithNewPipeAndPassReceiver());
   app_discovery_service_->BindLogger(std::move(pending_remote_3));
 }
 }  // namespace media_router
diff --git a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
index 9af8e5d..a2787683 100644
--- a/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
+++ b/chrome/browser/media/router/providers/cast/cast_internal_message_util.cc
@@ -350,7 +350,7 @@
   // There should be only 1 app on |receiver_status|.
   const base::Value* app_list_value =
       receiver_status.FindKeyOfType("applications", base::Value::Type::LIST);
-  if (!app_list_value || app_list_value->GetList().size() != 1) {
+  if (!app_list_value || app_list_value->GetListDeprecated().size() != 1) {
     DVLOG(2) << "receiver_status does not contain exactly one app: "
              << receiver_status;
     return nullptr;
@@ -359,7 +359,7 @@
   auto session = std::make_unique<CastSession>();
 
   // Fill in mandatory Session fields.
-  const base::Value& app_value = app_list_value->GetList()[0];
+  const base::Value& app_value = app_list_value->GetListDeprecated()[0];
   if (!GetString(app_value, "sessionId", &session->session_id_) ||
       !GetString(app_value, "appId", &session->app_id_) ||
       !GetString(app_value, "transportId", &session->transport_id_) ||
@@ -403,14 +403,14 @@
 
   const base::Value* namespaces_value =
       app_value.FindKeyOfType("namespaces", base::Value::Type::LIST);
-  if (!namespaces_value || namespaces_value->GetList().empty()) {
+  if (!namespaces_value || namespaces_value->GetListDeprecated().empty()) {
     // A session without namespaces is invalid, except for a multizone leader.
     if (session->app_id() != kMultizoneLeaderAppId) {
       DVLOG(2) << "Message is missing namespaces.";
       return nullptr;
     }
   } else {
-    for (const auto& namespace_value : namespaces_value->GetList()) {
+    for (const auto& namespace_value : namespaces_value->GetListDeprecated()) {
       std::string message_namespace;
       if (!namespace_value.is_dict() ||
           !GetString(namespace_value, "name", &message_namespace)) {
diff --git a/chrome/browser/media/router/providers/cast/cast_media_controller.cc b/chrome/browser/media/router/providers/cast/cast_media_controller.cc
index a681787d..8c72e78 100644
--- a/chrome/browser/media/router/providers/cast/cast_media_controller.cc
+++ b/chrome/browser/media/router/providers/cast/cast_media_controller.cc
@@ -200,7 +200,8 @@
   const base::Value* status_list_value = message_value.FindKey("status");
   if (!status_list_value || !status_list_value->is_list())
     return;
-  base::Value::ConstListView status_list = status_list_value->GetList();
+  base::Value::ConstListView status_list =
+      status_list_value->GetListDeprecated();
   if (status_list.empty())
     return;
   const base::Value& status_value = status_list[0];
@@ -219,7 +220,7 @@
   const base::Value* images = status_value.FindPath("media.metadata.images");
   if (images && images->is_list()) {
     media_status_.images.clear();
-    for (const base::Value& image_value : images->GetList()) {
+    for (const base::Value& image_value : images->GetListDeprecated()) {
       if (!image_value.is_dict())
         continue;
       const std::string* url_string = image_value.FindStringKey("url");
diff --git a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
index 821ed54c..c7d6d97 100644
--- a/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
+++ b/chrome/browser/media/router/providers/cast/cast_session_tracker.cc
@@ -135,7 +135,7 @@
   updated_status->EraseListValueIf(
       [](auto const& media) { return !media.is_dict(); });
 
-  base::Value::ListView media_list = updated_status->GetList();
+  base::Value::ListView media_list = updated_status->GetListDeprecated();
 
   // Backfill messages from receivers to make them compatible with Cast SDK.
   for (auto& media : media_list) {
@@ -173,7 +173,8 @@
       session->value().FindKeyOfType("media", base::Value::Type::LIST);
   if (!session_media_value)
     return;
-  const auto& session_media_value_list = session_media_value->GetList();
+  const auto& session_media_value_list =
+      session_media_value->GetListDeprecated();
   for (auto& media : media_list) {
     const base::Value* media_session_id_value =
         media.FindKeyOfType("mediaSessionId", base::Value::Type::INTEGER);
diff --git a/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc b/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc
index b2d8fae..dee7862 100644
--- a/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc
+++ b/chrome/browser/media/router/providers/cast/dual_media_sink_service.cc
@@ -116,6 +116,9 @@
 }
 
 void DualMediaSinkService::BindLogger(LoggerImpl* logger_impl) {
+  // TODO(crbug.com/1293535): Simplify how logger instances are made available
+  // to their clients.
+
   if (logger_is_bound_)
     return;
   logger_is_bound_ = true;
@@ -123,12 +126,13 @@
 
   if (dial_media_sink_service_) {
     mojo::PendingRemote<mojom::Logger> dial_pending_remote;
-    logger_impl->Bind(dial_pending_remote.InitWithNewPipeAndPassReceiver());
+    logger_impl->BindReceiver(
+        dial_pending_remote.InitWithNewPipeAndPassReceiver());
     dial_media_sink_service_->BindLogger(std::move(dial_pending_remote));
   }
 
   mojo::PendingRemote<mojom::Logger> cast_discovery_pending_remote;
-  logger_impl->Bind(
+  logger_impl->BindReceiver(
       cast_discovery_pending_remote.InitWithNewPipeAndPassReceiver());
   cast_app_discovery_service_->task_runner()->PostTask(
       FROM_HERE,
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity.cc b/chrome/browser/media/router/providers/cast/mirroring_activity.cc
index 561f8cf9..c10615a 100644
--- a/chrome/browser/media/router/providers/cast/mirroring_activity.cc
+++ b/chrome/browser/media/router/providers/cast/mirroring_activity.cc
@@ -437,7 +437,7 @@
     return message_str;
   }
 
-  for (base::Value& item : streams->GetList()) {
+  for (base::Value& item : streams->GetListDeprecated()) {
     if (item.FindStringKey("aesKey")) {
       item.SetStringKey("aesKey", "AES_KEY");
     }
diff --git a/chrome/browser/media/webrtc/capture_policy_utils.cc b/chrome/browser/media/webrtc/capture_policy_utils.cc
index bbba5b3b..e6115cf 100644
--- a/chrome/browser/media/webrtc/capture_policy_utils.cc
+++ b/chrome/browser/media/webrtc/capture_policy_utils.cc
@@ -40,7 +40,7 @@
   // Though we are not technically a Content Setting, ContentSettingsPattern
   // aligns better than URLMatcher with the rules from:
   // https://chromeenterprise.google/policies/url-patterns/.
-  for (const auto& value : allowed_origins->GetList()) {
+  for (const auto& value : allowed_origins->GetListDeprecated()) {
     if (!value.is_string())
       continue;
     ContentSettingsPattern pattern =
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc b/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
index d13a8da..5d036b5d 100644
--- a/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
+++ b/chrome/browser/media/webrtc/desktop_media_picker_factory_impl.cc
@@ -101,8 +101,14 @@
             content::desktop_capture::CreateWindowCapturer();
         if (!capturer)
           continue;
+        // If the capturer is not going to enumerate current process windows
+        // (to avoid a deadlock on Windows), then we have to find and add those
+        // windows ourselves.
+        bool add_current_process_windows =
+            !content::desktop_capture::ShouldEnumerateCurrentProcessWindows();
         window_list = std::make_unique<NativeDesktopMediaList>(
-            DesktopMediaList::Type::kWindow, std::move(capturer));
+            DesktopMediaList::Type::kWindow, std::move(capturer),
+            add_current_process_windows);
 #endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
         have_window_list = true;
         source_lists.push_back(std::move(window_list));
diff --git a/chrome/browser/media/webrtc/media_stream_device_permissions.cc b/chrome/browser/media/webrtc/media_stream_device_permissions.cc
index 64b7390..9036a30 100644
--- a/chrome/browser/media/webrtc/media_stream_device_permissions.cc
+++ b/chrome/browser/media/webrtc/media_stream_device_permissions.cc
@@ -29,7 +29,7 @@
   const PrefService* prefs = profile->GetPrefs();
 
   const base::Value* list = prefs->GetList(allowed_urls_pref_name);
-  for (const base::Value& i : list->GetList()) {
+  for (const base::Value& i : list->GetListDeprecated()) {
     const std::string* value = i.GetIfString();
     if (value) {
       ContentSettingsPattern pattern =
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.cc b/chrome/browser/media/webrtc/native_desktop_media_list.cc
index 91da584..6d8c9d9 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list.cc
+++ b/chrome/browser/media/webrtc/native_desktop_media_list.cc
@@ -10,6 +10,7 @@
 #include "base/bind.h"
 #include "base/hash/hash.h"
 #include "base/message_loop/message_pump_type.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_restrictions.h"
@@ -40,6 +41,11 @@
 #include "components/remote_cocoa/browser/scoped_cg_window_id.h"
 #endif
 
+#if BUILDFLAG(IS_WIN)
+#include <windows.h>
+#include "ui/views/widget/desktop_aura/desktop_window_tree_host_win.h"
+#endif
+
 using content::DesktopMediaID;
 
 namespace {
@@ -94,6 +100,32 @@
   return gfx::ImageSkia::CreateFrom1xBitmap(result);
 }
 
+#if BUILDFLAG(IS_WIN)
+BOOL CALLBACK TopLevelCurrentProcessHwndCollector(HWND hwnd, LPARAM param) {
+  DWORD process_id;
+  ::GetWindowThreadProcessId(hwnd, &process_id);
+  if (process_id != ::GetCurrentProcessId())
+    return TRUE;
+
+  // Skip windows which are not presented in the taskbar, e.g. the "Restore
+  // pages?" window.
+  HWND owner = ::GetWindow(hwnd, GW_OWNER);
+  LONG exstyle = GetWindowLong(hwnd, GWL_EXSTYLE);
+  if (owner && !(exstyle & WS_EX_APPWINDOW))
+    return TRUE;
+
+  auto* current_process_windows = reinterpret_cast<std::vector<HWND>*>(param);
+  current_process_windows->push_back(hwnd);
+  return TRUE;
+}
+
+BOOL CALLBACK AllHwndCollector(HWND hwnd, LPARAM param) {
+  auto* hwnds = reinterpret_cast<std::vector<HWND>*>(param);
+  hwnds->push_back(hwnd);
+  return TRUE;
+}
+#endif  // BUILDFLAG(IS_WIN)
+
 #if BUILDFLAG(IS_MAC)
 const base::Feature kWindowCaptureMacV2{"WindowCaptureMacV2",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
@@ -107,7 +139,8 @@
   Worker(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
          base::WeakPtr<NativeDesktopMediaList> media_list,
          DesktopMediaList::Type type,
-         std::unique_ptr<webrtc::DesktopCapturer> capturer);
+         std::unique_ptr<webrtc::DesktopCapturer> capturer,
+         bool add_current_process_windows);
 
   Worker(const Worker&) = delete;
   Worker& operator=(const Worker&) = delete;
@@ -131,6 +164,21 @@
     size_t next_source_index = 0;
   };
 
+  // These must be members because |SourceDescription| is a protected type from
+  // |DesktopMediaListBase|.
+  static std::vector<SourceDescription> FormatSources(
+      const webrtc::DesktopCapturer::SourceList& sources,
+      const DesktopMediaID::Id& view_dialog_id,
+      const DesktopMediaList::Type& list_type);
+
+#if BUILDFLAG(IS_WIN)
+  static std::vector<SourceDescription> GetCurrentProcessWindows();
+
+  static std::vector<SourceDescription> MergeAndSortWindowSources(
+      std::vector<SourceDescription> sources_a,
+      std::vector<SourceDescription> sources_b);
+#endif  // BUILDFLAG(IS_WIN)
+
   void RefreshNextThumbnail();
 
   // webrtc::DesktopCapturer::Callback interface.
@@ -144,6 +192,7 @@
 
   DesktopMediaList::Type type_;
   std::unique_ptr<webrtc::DesktopCapturer> capturer_;
+  const bool add_current_process_windows_;
 
   // Stores hashes of snapshots previously captured.
   ImageHashesMap image_hashes_;
@@ -158,12 +207,17 @@
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     base::WeakPtr<NativeDesktopMediaList> media_list,
     DesktopMediaList::Type type,
-    std::unique_ptr<webrtc::DesktopCapturer> capturer)
+    std::unique_ptr<webrtc::DesktopCapturer> capturer,
+    bool add_current_process_windows)
     : task_runner_(task_runner),
       media_list_(media_list),
       type_(type),
-      capturer_(std::move(capturer)) {
+      capturer_(std::move(capturer)),
+      add_current_process_windows_(add_current_process_windows) {
   DCHECK(capturer_);
+
+  DCHECK(type_ == DesktopMediaList::Type::kWindow ||
+         !add_current_process_windows_);
 }
 
 NativeDesktopMediaList::Worker::~Worker() {
@@ -179,49 +233,33 @@
     const DesktopMediaID::Id& view_dialog_id,
     bool update_thumnails) {
   DCHECK(task_runner_->BelongsToCurrentThread());
-  std::vector<SourceDescription> result;
-
   webrtc::DesktopCapturer::SourceList sources;
   if (!capturer_->GetSourceList(&sources)) {
     // Will pass empty results list to RefreshForVizFrameSinkWindows().
     sources.clear();
   }
 
-  bool mutiple_sources = sources.size() > 1;
-  std::u16string title;
-  for (size_t i = 0; i < sources.size(); ++i) {
-    DesktopMediaID::Type type = DesktopMediaID::Type::TYPE_NONE;
-    switch (type_) {
-      case DesktopMediaList::Type::kScreen:
-        type = DesktopMediaID::Type::TYPE_SCREEN;
-        // Just in case 'Screen' is inflected depending on the screen number,
-        // use plural formatter.
-        title = mutiple_sources
-                    ? l10n_util::GetPluralStringFUTF16(
-                          IDS_DESKTOP_MEDIA_PICKER_MULTIPLE_SCREEN_NAME,
-                          static_cast<int>(i + 1))
-                    : l10n_util::GetStringUTF16(
-                          IDS_DESKTOP_MEDIA_PICKER_SINGLE_SCREEN_NAME);
-        break;
+  std::vector<SourceDescription> source_descriptions =
+      FormatSources(sources, view_dialog_id, type_);
 
-      case DesktopMediaList::Type::kWindow:
-        type = DesktopMediaID::Type::TYPE_WINDOW;
-        // Skip the picker dialog window.
-        if (sources[i].id == view_dialog_id)
-          continue;
-        title = base::UTF8ToUTF16(sources[i].title);
-        break;
-
-      default:
-        NOTREACHED();
-    }
-    result.emplace_back(DesktopMediaID(type, sources[i].id), title);
+#if BUILDFLAG(IS_WIN)
+  // If |add_current_process_windows_| is set to false, |capturer_| will
+  // find the windows owned by the current process for us. Otherwise, we must do
+  // this.
+  if (add_current_process_windows_) {
+    DCHECK_EQ(type_, DesktopMediaList::Type::kWindow);
+    // WebRTC returns the windows in order of highest z-order to lowest, but
+    // these additional windows will be out of order if we just append them. So
+    // we sort the list according to the z-order of the windows.
+    source_descriptions = MergeAndSortWindowSources(
+        std::move(source_descriptions), GetCurrentProcessWindows());
   }
+#endif  // BUILDFLAG(IS_WIN)
 
   content::GetUIThreadTaskRunner({})->PostTask(
       FROM_HERE,
       base::BindOnce(&NativeDesktopMediaList::RefreshForVizFrameSinkWindows,
-                     media_list_, result, update_thumnails));
+                     media_list_, source_descriptions, update_thumnails));
 }
 
 void NativeDesktopMediaList::Worker::RefreshThumbnails(
@@ -253,6 +291,109 @@
   RefreshNextThumbnail();
 }
 
+// static
+std::vector<DesktopMediaListBase::SourceDescription>
+NativeDesktopMediaList::Worker::FormatSources(
+    const webrtc::DesktopCapturer::SourceList& sources,
+    const DesktopMediaID::Id& view_dialog_id,
+    const DesktopMediaList::Type& list_type) {
+  std::vector<SourceDescription> source_descriptions;
+  std::u16string title;
+  for (size_t i = 0; i < sources.size(); ++i) {
+    DesktopMediaID::Type source_type = DesktopMediaID::Type::TYPE_NONE;
+    switch (list_type) {
+      case DesktopMediaList::Type::kScreen:
+        source_type = DesktopMediaID::Type::TYPE_SCREEN;
+        // Just in case 'Screen' is inflected depending on the screen number,
+        // use plural formatter.
+        title = sources.size() > 1
+                    ? l10n_util::GetPluralStringFUTF16(
+                          IDS_DESKTOP_MEDIA_PICKER_MULTIPLE_SCREEN_NAME,
+                          static_cast<int>(i + 1))
+                    : l10n_util::GetStringUTF16(
+                          IDS_DESKTOP_MEDIA_PICKER_SINGLE_SCREEN_NAME);
+        break;
+
+      case DesktopMediaList::Type::kWindow:
+        source_type = DesktopMediaID::Type::TYPE_WINDOW;
+        // Skip the picker dialog window.
+        if (sources[i].id == view_dialog_id)
+          continue;
+        title = base::UTF8ToUTF16(sources[i].title);
+        break;
+
+      default:
+        NOTREACHED();
+    }
+    source_descriptions.emplace_back(DesktopMediaID(source_type, sources[i].id),
+                                     title);
+  }
+
+  return source_descriptions;
+}
+
+#if BUILDFLAG(IS_WIN)
+// static
+std::vector<DesktopMediaListBase::SourceDescription>
+NativeDesktopMediaList::Worker::GetCurrentProcessWindows() {
+  std::vector<HWND> current_process_windows;
+  if (!::EnumWindows(TopLevelCurrentProcessHwndCollector,
+                     reinterpret_cast<LPARAM>(&current_process_windows))) {
+    return std::vector<SourceDescription>();
+  }
+
+  std::vector<SourceDescription> current_process_sources;
+  for (HWND hwnd : current_process_windows) {
+    // Leave these sources untitled, we must get their title from the UI thread.
+    current_process_sources.emplace_back(
+        DesktopMediaID(
+            DesktopMediaID::Type::TYPE_WINDOW,
+            reinterpret_cast<webrtc::DesktopCapturer::SourceId>(hwnd)),
+        u"");
+  }
+
+  return current_process_sources;
+}
+
+// static
+std::vector<DesktopMediaListBase::SourceDescription>
+NativeDesktopMediaList::Worker::MergeAndSortWindowSources(
+    std::vector<SourceDescription> sources_a,
+    std::vector<SourceDescription> sources_b) {
+  // |EnumWindows| enumerates top level windows in z-order, we use this as a
+  // reference for sorting.
+  std::vector<HWND> z_ordered_windows;
+  if (!::EnumWindows(AllHwndCollector,
+                     reinterpret_cast<LPARAM>(&z_ordered_windows))) {
+    // Since we can't get the z-order for the windows, we can't sort them. So,
+    // let's just concatenate.
+    sources_a.insert(sources_a.end(),
+                     std::make_move_iterator(sources_b.begin()),
+                     std::make_move_iterator(sources_b.end()));
+    return sources_a;
+  }
+
+  std::vector<const std::vector<SourceDescription>*> source_containers = {
+      &sources_a, &sources_b};
+  std::vector<SourceDescription> sorted_sources;
+  auto id_hwnd_projection = [](const SourceDescription& source) {
+    return reinterpret_cast<const HWND>(source.id.id);
+  };
+  for (HWND window : z_ordered_windows) {
+    for (const auto* source_container : source_containers) {
+      auto source_it =
+          base::ranges::find(*source_container, window, id_hwnd_projection);
+      if (source_it != source_container->end()) {
+        sorted_sources.push_back(*source_it);
+        break;
+      }
+    }
+  }
+
+  return sorted_sources;
+}
+#endif  // BUILDFLAG(IS_WIN)
+
 void NativeDesktopMediaList::Worker::RefreshNextThumbnail() {
   DCHECK(refresh_thumbnails_state_);
 
@@ -311,11 +452,23 @@
 NativeDesktopMediaList::NativeDesktopMediaList(
     DesktopMediaList::Type type,
     std::unique_ptr<webrtc::DesktopCapturer> capturer)
+    : NativeDesktopMediaList(type,
+                             std::move(capturer),
+                             /*add_current_process_windows=*/false) {}
+
+NativeDesktopMediaList::NativeDesktopMediaList(
+    DesktopMediaList::Type type,
+    std::unique_ptr<webrtc::DesktopCapturer> capturer,
+    bool add_current_process_windows)
     : DesktopMediaListBase(
           base::Milliseconds(kDefaultNativeDesktopMediaListUpdatePeriod)),
-      thread_("DesktopMediaListCaptureThread") {
+      thread_("DesktopMediaListCaptureThread"),
+      add_current_process_windows_(add_current_process_windows) {
   type_ = type;
 
+  DCHECK(type_ == DesktopMediaList::Type::kWindow ||
+         !add_current_process_windows_);
+
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
   // On Windows/OSX the thread must be a UI thread.
   base::MessagePumpType thread_type = base::MessagePumpType::UI;
@@ -324,9 +477,9 @@
 #endif
   thread_.StartWithOptions(base::Thread::Options(thread_type, 0));
 
-  worker_ = std::make_unique<Worker>(thread_.task_runner(),
-                                     weak_factory_.GetWeakPtr(), type,
-                                     std::move(capturer));
+  worker_ = std::make_unique<Worker>(
+      thread_.task_runner(), weak_factory_.GetWeakPtr(), type,
+      std::move(capturer), add_current_process_windows_);
 
   thread_.task_runner()->PostTask(
       FROM_HERE,
@@ -358,37 +511,77 @@
 void NativeDesktopMediaList::RefreshForVizFrameSinkWindows(
     std::vector<SourceDescription> sources,
     bool update_thumnails) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(can_refresh());
 
-  // Assign |source.id.window_id| if |source.id.id| corresponds to a
-  // viz::FrameSinkId.
-  for (auto& source : sources) {
-    if (source.id.type != DesktopMediaID::TYPE_WINDOW)
+  auto source_it = sources.begin();
+  while (source_it != sources.end()) {
+    if (source_it->id.type != DesktopMediaID::TYPE_WINDOW) {
+      ++source_it;
       continue;
+    }
 
-// TODO(https://crbug.com/1270801): The capturer id to aura::Window mapping on
-// lacros is currently broken because they both separately use monotonically
-// increasing ints as ids. This causes collisions where we mistakenly try to
-// capture non-aura windows as aura windows. While the preview matches what is
-// ultimately captured, it does not match the title of the window in the preview
-// and is both unexpected for the user and means that the collided non-aura
-// window cannot be captured.
+#if BUILDFLAG(IS_WIN)
+    // The worker thread can't safely get titles for windows owned by the
+    // current process, so we do it here, on the UI thread, where we can call
+    // |GetWindowText| without risking a deadlock.
+    const HWND hwnd = reinterpret_cast<HWND>(source_it->id.id);
+    DWORD hwnd_process;
+    ::GetWindowThreadProcessId(hwnd, &hwnd_process);
+    if (hwnd_process == ::GetCurrentProcessId()) {
+      int title_length = ::GetWindowTextLength(hwnd);
+
+      // Remove untitled windows.
+      if (title_length <= 0) {
+        source_it = sources.erase(source_it);
+        continue;
+      }
+
+      source_it->name.resize(title_length + 1);
+      // The title may have changed since the call to |GetWindowTextLength|, so
+      // we update |title_length| to be the number of characters written into
+      // our string.
+      title_length = ::GetWindowText(
+          hwnd, base::as_writable_wcstr(source_it->name), title_length + 1);
+      if (title_length <= 0) {
+        source_it = sources.erase(source_it);
+        continue;
+      }
+
+      // Resize the string (in the case the title has shortened), and remove the
+      // trailing null character.
+      source_it->name.resize(title_length);
+    }
+#endif  // BUILDFLAG(IS_WIN)
+
+    // Assign |source_it->id.window_id| if |source_it->id.id| corresponds to a
+    // viz::FrameSinkId.
+    //
+    // TODO(https://crbug.com/1270801): The capturer id to aura::Window mapping
+    // on lacros is currently broken because they both separately use
+    // monotonically increasing ints as ids. This causes collisions where we
+    // mistakenly try to capture non-aura windows as aura windows. While the
+    // preview matches what is ultimately captured, it does not match the title
+    // of the window in the preview and is both unexpected for the user and
+    // means that the collided non-aura window cannot be captured.
 #if defined(USE_AURA) && !BUILDFLAG(IS_CHROMEOS_LACROS)
     aura::WindowTreeHost* const host =
         aura::WindowTreeHost::GetForAcceleratedWidget(
-            *reinterpret_cast<gfx::AcceleratedWidget*>(&source.id.id));
+            *reinterpret_cast<gfx::AcceleratedWidget*>(&source_it->id.id));
     aura::Window* const aura_window = host ? host->window() : nullptr;
     if (aura_window) {
       DesktopMediaID aura_id = DesktopMediaID::RegisterNativeWindow(
           DesktopMediaID::TYPE_WINDOW, aura_window);
-      source.id.window_id = aura_id.window_id;
+      source_it->id.window_id = aura_id.window_id;
     }
 #elif BUILDFLAG(IS_MAC)
     if (base::FeatureList::IsEnabled(kWindowCaptureMacV2)) {
-      if (remote_cocoa::ScopedCGWindowID::Get(source.id.id))
-        source.id.window_id = source.id.id;
+      if (remote_cocoa::ScopedCGWindowID::Get(source_it->id.id))
+        source_it->id.window_id = source_it->id.id;
     }
 #endif
+
+    ++source_it;
   }
 
   UpdateSourcesList(sources);
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.h b/chrome/browser/media/webrtc/native_desktop_media_list.h
index 2e63f5e..9078b12 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list.h
+++ b/chrome/browser/media/webrtc/native_desktop_media_list.h
@@ -26,6 +26,10 @@
   NativeDesktopMediaList(DesktopMediaList::Type type,
                          std::unique_ptr<webrtc::DesktopCapturer> capturer);
 
+  NativeDesktopMediaList(DesktopMediaList::Type type,
+                         std::unique_ptr<webrtc::DesktopCapturer> capturer,
+                         bool add_current_process_windows);
+
   NativeDesktopMediaList(const NativeDesktopMediaList&) = delete;
   NativeDesktopMediaList& operator=(const NativeDesktopMediaList&) = delete;
 
@@ -54,6 +58,10 @@
   base::Thread thread_;
   std::unique_ptr<Worker> worker_;
 
+  // Whether we need to find and add the windows owned by the current process.
+  // If false, the capturer will do this for us.
+  bool add_current_process_windows_;
+
 #if defined(USE_AURA)
   // previous_aura_thumbnail_hashes_ holds thumbanil hash values of aura windows
   // in the previous refresh. While new_aura_thumbnail_hashes_ has hash values
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc b/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
index 3ff0de7..6eeb581 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
+++ b/chrome/browser/media/webrtc/native_desktop_media_list_unittest.cc
@@ -18,12 +18,17 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/media/webrtc/desktop_media_list.h"
 #include "chrome/test/views/chrome_views_test_base.h"
+#include "content/public/browser/desktop_capture.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_capture_options.h"
 #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
 #include "ui/views/widget/widget.h"
@@ -34,6 +39,10 @@
 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
 #endif
 
+#if BUILDFLAG(IS_WIN)
+#include <windows.h>
+#endif
+
 using content::DesktopMediaID;
 using testing::_;
 using testing::DoAll;
@@ -51,6 +60,48 @@
 static const int kDefaultAuraCount = 0;
 #endif
 
+#if BUILDFLAG(IS_WIN)
+constexpr char kWindowTitle[] = "NativeDesktopMediaList Test Window";
+constexpr wchar_t kWideWindowTitle[] = L"NativeDesktopMediaList Test Window";
+constexpr wchar_t kWindowClass[] = L"NativeDesktopMediaListTestWindowClass";
+
+struct WindowInfo {
+  HWND hwnd;
+  HINSTANCE window_instance;
+  ATOM window_class;
+};
+
+WindowInfo CreateTestWindow() {
+  WindowInfo info;
+  ::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
+                          GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
+                      reinterpret_cast<LPCWSTR>(&DefWindowProc),
+                      &info.window_instance);
+
+  WNDCLASS window_class = {};
+  window_class.hInstance = info.window_instance;
+  window_class.lpfnWndProc = &DefWindowProc;
+  window_class.lpszClassName = kWindowClass;
+  info.window_class = ::RegisterClass(&window_class);
+
+  info.hwnd =
+      ::CreateWindow(kWindowClass, kWideWindowTitle, WS_OVERLAPPEDWINDOW,
+                     CW_USEDEFAULT, CW_USEDEFAULT, /*width=*/100,
+                     /*height=*/100, /*parent_window=*/nullptr,
+                     /*menu_bar=*/nullptr, info.window_instance,
+                     /*additional_params=*/nullptr);
+
+  ::ShowWindow(info.hwnd, SW_SHOWNORMAL);
+  ::UpdateWindow(info.hwnd);
+  return info;
+}
+
+void DestroyTestWindow(WindowInfo info) {
+  ::DestroyWindow(info.hwnd);
+  ::UnregisterClass(MAKEINTATOM(info.window_class), info.window_instance);
+}
+#endif  // BUILDFLAG(IS_WIN)
+
 // Returns the given index, offset by a fixed value such that it does not
 // collide with Aura window IDs. Intended for usage with indices that are passed
 // to AddNativeWindow().
@@ -111,7 +162,9 @@
 
 class FakeWindowCapturer : public webrtc::DesktopCapturer {
  public:
-  FakeWindowCapturer() : callback_(nullptr) {}
+  FakeWindowCapturer() = default;
+  explicit FakeWindowCapturer(const webrtc::DesktopCaptureOptions& options)
+      : options_(options) {}
 
   FakeWindowCapturer(const FakeWindowCapturer&) = delete;
   FakeWindowCapturer& operator=(const FakeWindowCapturer&) = delete;
@@ -148,6 +201,22 @@
   }
 
   bool GetSourceList(SourceList* windows) override {
+#if BUILDFLAG(IS_WIN)
+    // WebRTC calls `GetWindowTextLength` and `GetWindowText` to get the title
+    // of every window. If the window is owned by the current process, these
+    // functions will send a `WM_GETTEXT` message to the window. This can cause
+    // a deadlock if the message loop is waiting on `GetSourceList`. To avoid
+    // this issue, WebRTC exposes the `enumerate_current_process_windows` which,
+    // when set to false, prevents these APIs from being called on windows from
+    // the current process.
+    if (options_.enumerate_current_process_windows()) {
+      for (const Source& source : window_list_) {
+        HWND hwnd = reinterpret_cast<HWND>(source.id);
+        ::GetWindowTextLength(hwnd);  // Side-effect: Sends WM_GETTEXT message.
+      }
+    }
+#endif  // BUILDFLAG(IS_WIN)
+
     base::AutoLock lock(window_list_lock_);
     *windows = window_list_;
     return true;
@@ -162,6 +231,8 @@
 
  private:
   raw_ptr<Callback> callback_;
+  webrtc::DesktopCaptureOptions options_ =
+      webrtc::DesktopCaptureOptions::CreateDefault();
   SourceList window_list_;
   base::Lock window_list_lock_;
 
@@ -573,3 +644,46 @@
   EXPECT_EQ(model_->GetSource(0).id.id, WindowIndex(0));
   EXPECT_EQ(model_->GetSource(0).thumbnail.size(), gfx::Size());
 }
+
+#if BUILDFLAG(IS_WIN)
+TEST_F(NativeDesktopMediaListTest, GetSourceListAvoidsDeadlock) {
+  // We need a real window so we can send a message and reproduce the deadlock
+  // scenario. This window must be created on a different thread than from where
+  // `GetSourceList` will be called. Otherwise, it can directly invoke the
+  // window procedure and avoid the deadlock.
+  base::Thread window_thread("GetSourceListDeadlockTestWindowThread");
+  window_thread.Start();
+  base::RunLoop run_loop;
+  WindowInfo info;
+  window_thread.task_runner()->PostTaskAndReplyWithResult(
+      FROM_HERE, base::BindOnce(&CreateTestWindow),
+      base::BindLambdaForTesting([&](WindowInfo window_info) {
+        info = window_info;
+        run_loop.Quit();
+      }));
+  // After this point, the window will be unresponsive because we've quit its
+  // message loop. This means any messages sent to the window will cause a
+  // deadlock.
+  run_loop.Run();
+  EXPECT_NE(info.hwnd, static_cast<HWND>(0));
+
+  // These `options` should have the `enumerate_current_process_windows`
+  // option set to false, so that `GetSourceList` won't send a `WM_GETTEXT`
+  // message to our window.
+  webrtc::DesktopCaptureOptions options =
+      content::desktop_capture::CreateDesktopCaptureOptions();
+  EXPECT_FALSE(options.enumerate_current_process_windows());
+  auto window_capturer = std::make_unique<FakeWindowCapturer>(options);
+  window_capturer->SetWindowList(
+      {{reinterpret_cast<intptr_t>(info.hwnd), kWindowTitle}});
+
+  // This should not hang, because we told it to ignore windows owned by the
+  // current process.
+  webrtc::DesktopCapturer::SourceList source_list;
+  EXPECT_TRUE(window_capturer->GetSourceList(&source_list));
+
+  window_thread.task_runner()->PostTask(
+      FROM_HERE, base::BindOnce(&DestroyTestWindow, info));
+  window_thread.Stop();
+}
+#endif  // BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/media/webrtc/test_stats_dictionary.cc b/chrome/browser/media/webrtc/test_stats_dictionary.cc
index 8301d099..9b02bd4 100644
--- a/chrome/browser/media/webrtc/test_stats_dictionary.cc
+++ b/chrome/browser/media/webrtc/test_stats_dictionary.cc
@@ -171,7 +171,7 @@
   if (!stats_->GetList(key, &list))
     return false;
   std::vector<bool> sequence;
-  base::Value::ConstListView args_list = list->GetList();
+  base::Value::ConstListView args_list = list->GetListDeprecated();
   for (const base::Value& arg : args_list) {
     if (!arg.is_bool())
       return false;
@@ -189,7 +189,7 @@
     return false;
 
   out->clear();
-  for (const base::Value& element : number_sequence->GetList()) {
+  for (const base::Value& element : number_sequence->GetListDeprecated()) {
     absl::optional<double> double_value = element.GetIfDouble();
     if (!double_value)
       return false;
@@ -207,7 +207,7 @@
   if (!stats_->GetList(key, &list))
     return false;
   std::vector<std::string> sequence;
-  for (const base::Value& i : list->GetList()) {
+  for (const base::Value& i : list->GetListDeprecated()) {
     const std::string* element = i.GetIfString();
     if (!element)
       return false;
diff --git a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
index bfc8e75..b88131a 100644
--- a/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
+++ b/chrome/browser/media/webrtc/webrtc_browsertest_base.cc
@@ -112,8 +112,8 @@
   std::unique_ptr<base::ListValue> list =
       base::ListValue::From(std::move(value));
   std::vector<std::string> vector;
-  vector.reserve(list->GetList().size());
-  for (size_t i = 0; i < list->GetList().size(); ++i) {
+  vector.reserve(list->GetListDeprecated().size());
+  for (size_t i = 0; i < list->GetListDeprecated().size(); ++i) {
     base::Value* item;
     EXPECT_TRUE(list->Get(i, &item));
     EXPECT_TRUE(item->is_string());
diff --git a/chrome/browser/media_galleries/media_galleries_preferences.cc b/chrome/browser/media_galleries/media_galleries_preferences.cc
index 9cf3534..f40e58bc 100644
--- a/chrome/browser/media_galleries/media_galleries_preferences.cc
+++ b/chrome/browser/media_galleries/media_galleries_preferences.cc
@@ -581,7 +581,7 @@
   const base::Value* list =
       prefs->GetList(prefs::kMediaGalleriesRememberedGalleries);
   if (list) {
-    for (const auto& gallery_value : list->GetList()) {
+    for (const auto& gallery_value : list->GetListDeprecated()) {
       if (!gallery_value.is_dict())
         continue;
 
@@ -802,7 +802,7 @@
         prefs, prefs::kMediaGalleriesRememberedGalleries);
     base::Value* list = update->Get();
 
-    for (auto& gallery_value : list->GetList()) {
+    for (auto& gallery_value : list->GetListDeprecated()) {
       MediaGalleryPrefId iter_id;
       if (gallery_value.is_dict() && GetPrefId(gallery_value, &iter_id) &&
           *pref_id_it == iter_id) {
@@ -900,7 +900,7 @@
 
   std::vector<MediaGalleryPrefId> pref_ids;
 
-  for (auto& gallery_value : list->GetList()) {
+  for (auto& gallery_value : list->GetListDeprecated()) {
     MediaGalleryPrefId pref_id;
 
     if (!(gallery_value.is_dict() && GetPrefId(gallery_value, &pref_id)))
@@ -995,8 +995,8 @@
   if (!base::Contains(known_galleries_, id))
     return;
 
-  for (auto iter = list->GetList().begin(); iter != list->GetList().end();
-       ++iter) {
+  for (auto iter = list->GetListDeprecated().begin();
+       iter != list->GetListDeprecated().end(); ++iter) {
     MediaGalleryPrefId iter_id;
     if (iter->is_dict() && GetPrefId(*iter, &iter_id) && id == iter_id) {
       RemoveGalleryPermissionsFromPrefs(id);
@@ -1173,7 +1173,7 @@
     permissions = update.Create();
   } else {
     // If the gallery is already in the list, update the permission...
-    for (auto& permission : permissions->GetList()) {
+    for (auto& permission : permissions->GetListDeprecated()) {
       if (!permission.is_dict())
         continue;
       MediaGalleryPermission perm;
@@ -1209,8 +1209,8 @@
   if (!permissions)
     return false;
 
-  for (auto iter = permissions->GetList().begin();
-       iter != permissions->GetList().end(); ++iter) {
+  for (auto iter = permissions->GetListDeprecated().begin();
+       iter != permissions->GetListDeprecated().end(); ++iter) {
     if (!iter->is_dict())
       continue;
     MediaGalleryPermission perm;
@@ -1237,7 +1237,7 @@
     return result;
   }
 
-  for (const auto& permission : permissions->GetList()) {
+  for (const auto& permission : permissions->GetListDeprecated()) {
     if (!permission.is_dict())
       continue;
     MediaGalleryPermission perm;
diff --git a/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc b/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc
index 150dab8..bd07638 100644
--- a/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc
+++ b/chrome/browser/media_galleries/media_galleries_preferences_unittest.cc
@@ -193,7 +193,7 @@
         new ListPrefUpdate(prefs, prefs::kMediaGalleriesRememberedGalleries));
     base::Value* list = update->Get();
 
-    for (auto& entry : list->GetList()) {
+    for (auto& entry : list->GetListDeprecated()) {
       base::DictionaryValue* dict;
 
       if (entry.GetAsDictionary(&dict)) {
diff --git a/chrome/browser/metrics/metrics_reporting_state.h b/chrome/browser/metrics/metrics_reporting_state.h
index 69417d0..fd72913 100644
--- a/chrome/browser/metrics/metrics_reporting_state.h
+++ b/chrome/browser/metrics/metrics_reporting_state.h
@@ -5,9 +5,7 @@
 #ifndef CHROME_BROWSER_METRICS_METRICS_REPORTING_STATE_H_
 #define CHROME_BROWSER_METRICS_METRICS_REPORTING_STATE_H_
 
-#include "base/callback.h"
-#include "build/build_config.h"
-#include "components/metrics/metrics_service_client.h"
+#include "base/callback_forward.h"
 
 using OnMetricsReportingCallbackType = base::OnceCallback<void(bool)>;
 
diff --git a/chrome/browser/metrics/plugin_metrics_provider.cc b/chrome/browser/metrics/plugin_metrics_provider.cc
index 85996e7..5b1896e 100644
--- a/chrome/browser/metrics/plugin_metrics_provider.cc
+++ b/chrome/browser/metrics/plugin_metrics_provider.cc
@@ -122,7 +122,7 @@
 
   metrics::SystemProfileProto::Stability* stability =
       system_profile_proto->mutable_stability();
-  for (const auto& value : plugin_stats_list->GetList()) {
+  for (const auto& value : plugin_stats_list->GetListDeprecated()) {
     const base::DictionaryValue* plugin_dict;
     if (!value.GetAsDictionary(&plugin_dict)) {
       NOTREACHED();
@@ -172,7 +172,7 @@
   base::Value* plugins = update.Get();
   DCHECK(plugins);
 
-  for (auto& value : plugins->GetList()) {
+  for (auto& value : plugins->GetListDeprecated()) {
     base::DictionaryValue* plugin_dict;
     if (!value.GetAsDictionary(&plugin_dict)) {
       NOTREACHED();
diff --git a/chrome/browser/metrics/power/power_metrics_reporter.cc b/chrome/browser/metrics/power/power_metrics_reporter.cc
index 5918b548..d03d1a0 100644
--- a/chrome/browser/metrics/power/power_metrics_reporter.cc
+++ b/chrome/browser/metrics/power/power_metrics_reporter.cc
@@ -57,8 +57,13 @@
   // description of each scenario in the histograms.xml file.
   if (interval_data.max_tab_count == 0)
     return ".ZeroWindow";
-  if (interval_data.max_visible_window_count == 0)
-    return ".AllTabsHidden";
+  if (interval_data.max_visible_window_count == 0) {
+    if (!interval_data.time_capturing_video.is_zero())
+      return ".AllTabsHidden_VideoCapture";
+    if (!interval_data.time_playing_audio.is_zero())
+      return ".AllTabsHidden_Audio";
+    return ".AllTabsHidden_NoVideoCaptureOrAudio";
+  }
   if (!interval_data.time_capturing_video.is_zero())
     return ".VideoCapture";
   if (!interval_data.time_playing_video_full_screen_single_monitor.is_zero())
diff --git a/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc b/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc
index 2a9b4dcf..7bf442cd 100644
--- a/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc
+++ b/chrome/browser/metrics/power/power_metrics_reporter_unittest.cc
@@ -574,12 +574,13 @@
   // PerformanceMonitor.* histograms is recorded correctly.
 }
 
-TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_AllTabsHidden) {
+TEST_F(PowerMetricsReporterUnitTest,
+       SuffixedHistograms_AllTabsHidden_VideoCapture) {
   UsageScenarioDataStore::IntervalData interval_data;
   interval_data.max_tab_count = 1;
   interval_data.max_visible_window_count = 0;
-  // Values below should be ignored.
   interval_data.time_capturing_video = base::Seconds(1);
+  // Values below should be ignored.
   interval_data.time_playing_video_full_screen_single_monitor =
       base::Seconds(1);
   interval_data.time_playing_video_in_visible_tab = base::Seconds(1);
@@ -602,12 +603,95 @@
 
   // Suffixed histograms.
   histogram_tester_.ExpectUniqueSample(
-      "Power.BatteryDischargeRate2.AllTabsHidden", 2500, 1);
+      "Power.BatteryDischargeRate2.AllTabsHidden_VideoCapture", 2500, 1);
   histogram_tester_.ExpectUniqueSample(
-      "Power.BatteryDischargeMode.AllTabsHidden",
+      "Power.BatteryDischargeMode.AllTabsHidden_VideoCapture",
       PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1);
   histogram_tester_.ExpectUniqueSample(
-      "PerformanceMonitor.AverageCPU2.Total.AllTabsHidden", 500, 1);
+      "PerformanceMonitor.AverageCPU2.Total.AllTabsHidden_VideoCapture", 500,
+      1);
+
+  // Note: For simplicity, this test only verifies that one of the
+  // PerformanceMonitor.* histograms is recorded correctly.
+}
+
+TEST_F(PowerMetricsReporterUnitTest, SuffixedHistograms_AllTabsHidden_Audio) {
+  UsageScenarioDataStore::IntervalData interval_data;
+  interval_data.max_tab_count = 1;
+  interval_data.max_visible_window_count = 0;
+  interval_data.time_capturing_video = base::Seconds(0);
+  interval_data.time_playing_audio = base::Seconds(1);
+  // Values below should be ignored.
+  interval_data.time_playing_video_full_screen_single_monitor =
+      base::Seconds(1);
+  interval_data.time_playing_video_in_visible_tab = base::Seconds(1);
+  interval_data.top_level_navigation_count = 1;
+  interval_data.user_interaction_count = 1;
+
+  PowerMetricsReporterAccess::ReportHistograms(
+      interval_data, GetFakeProcessMetrics(),
+      kExpectedMetricsCollectionInterval,
+      PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500);
+
+  // Non-suffixed histograms.
+  histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "Power.BatteryDischargeMode",
+      PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1);
+  histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total",
+                                       500, 1);
+
+  // Suffixed histograms.
+  histogram_tester_.ExpectUniqueSample(
+      "Power.BatteryDischargeRate2.AllTabsHidden_Audio", 2500, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "Power.BatteryDischargeMode.AllTabsHidden_Audio",
+      PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "PerformanceMonitor.AverageCPU2.Total.AllTabsHidden_Audio", 500, 1);
+
+  // Note: For simplicity, this test only verifies that one of the
+  // PerformanceMonitor.* histograms is recorded correctly.
+}
+
+TEST_F(PowerMetricsReporterUnitTest,
+       SuffixedHistograms_AllTabsHidden_NoVideoCaptureOrAudio) {
+  UsageScenarioDataStore::IntervalData interval_data;
+  interval_data.max_tab_count = 1;
+  interval_data.max_visible_window_count = 0;
+  interval_data.time_capturing_video = base::Seconds(0);
+  interval_data.time_playing_audio = base::Seconds(0);
+  // Values below should be ignored.
+  interval_data.time_playing_video_full_screen_single_monitor =
+      base::Seconds(1);
+  interval_data.time_playing_video_in_visible_tab = base::Seconds(1);
+  interval_data.top_level_navigation_count = 1;
+  interval_data.user_interaction_count = 1;
+
+  PowerMetricsReporterAccess::ReportHistograms(
+      interval_data, GetFakeProcessMetrics(),
+      kExpectedMetricsCollectionInterval,
+      PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 2500);
+
+  // Non-suffixed histograms.
+  histogram_tester_.ExpectUniqueSample("Power.BatteryDischargeRate2", 2500, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "Power.BatteryDischargeMode",
+      PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1);
+  histogram_tester_.ExpectUniqueSample("PerformanceMonitor.AverageCPU2.Total",
+                                       500, 1);
+
+  // Suffixed histograms.
+  histogram_tester_.ExpectUniqueSample(
+      "Power.BatteryDischargeRate2.AllTabsHidden_NoVideoCaptureOrAudio", 2500,
+      1);
+  histogram_tester_.ExpectUniqueSample(
+      "Power.BatteryDischargeMode.AllTabsHidden_NoVideoCaptureOrAudio",
+      PowerMetricsReporterAccess::BatteryDischargeMode::kDischarging, 1);
+  histogram_tester_.ExpectUniqueSample(
+      "PerformanceMonitor.AverageCPU2.Total.AllTabsHidden_"
+      "NoVideoCaptureOrAudio",
+      500, 1);
 
   // Note: For simplicity, this test only verifies that one of the
   // PerformanceMonitor.* histograms is recorded correctly.
diff --git a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc
index d1867df..4107142 100644
--- a/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc
+++ b/chrome/browser/nearby_sharing/certificates/nearby_share_certificate_storage_impl.cc
@@ -439,7 +439,7 @@
   const base::Value* list =
       pref_service_->Get(prefs::kNearbySharingPrivateCertificateListPrefName);
   std::vector<NearbySharePrivateCertificate> certs;
-  for (const base::Value& cert_dict : list->GetList()) {
+  for (const base::Value& cert_dict : list->GetListDeprecated()) {
     absl::optional<NearbySharePrivateCertificate> cert(
         NearbySharePrivateCertificate::FromDictionary(cert_dict));
     if (!cert)
diff --git a/chrome/browser/nearby_sharing/common/nearby_share_features.cc b/chrome/browser/nearby_sharing/common/nearby_share_features.cc
index 6318904..cb1c149 100644
--- a/chrome/browser/nearby_sharing/common/nearby_share_features.cc
+++ b/chrome/browser/nearby_sharing/common/nearby_share_features.cc
@@ -32,6 +32,10 @@
 const base::Feature kNearbySharingOnePageOnboarding{
     "NearbySharingOnePageOnboarding", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables receiving WiFi networks using Nearby Share.
+const base::Feature kNearbySharingReceiveWifiCredentials{
+    "NearbySharingReceiveWifiCredentials", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables seamless sharing between a user's own devices.
 const base::Feature kNearbySharingSelfShare{"NearbySharingSelfShare",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/nearby_sharing/common/nearby_share_features.h b/chrome/browser/nearby_sharing/common/nearby_share_features.h
index 52807b5..303f247 100644
--- a/chrome/browser/nearby_sharing/common/nearby_share_features.h
+++ b/chrome/browser/nearby_sharing/common/nearby_share_features.h
@@ -14,6 +14,7 @@
 extern const base::Feature kNearbySharingChildAccounts;
 extern const base::Feature kNearbySharingDeviceContacts;
 extern const base::Feature kNearbySharingOnePageOnboarding;
+extern const base::Feature kNearbySharingReceiveWifiCredentials;
 extern const base::Feature kNearbySharingSelfShare;
 extern const base::Feature kNearbySharingWebRtc;
 extern const base::Feature kNearbySharingWifiLan;
diff --git a/chrome/browser/nearby_sharing/contacts/nearby_share_contact_manager_impl.cc b/chrome/browser/nearby_sharing/contacts/nearby_share_contact_manager_impl.cc
index 177c3f8..9b2f787 100644
--- a/chrome/browser/nearby_sharing/contacts/nearby_share_contact_manager_impl.cc
+++ b/chrome/browser/nearby_sharing/contacts/nearby_share_contact_manager_impl.cc
@@ -270,7 +270,7 @@
   std::set<std::string> allowlist;
   for (const base::Value& id :
        pref_service_->Get(prefs::kNearbySharingAllowedContactsPrefName)
-           ->GetList()) {
+           ->GetListDeprecated()) {
     allowlist.insert(id.GetString());
   }
   return allowlist;
diff --git a/chrome/browser/nearby_sharing/nearby_share_settings.cc b/chrome/browser/nearby_sharing/nearby_share_settings.cc
index bc1a2b06c..6e44292e 100644
--- a/chrome/browser/nearby_sharing/nearby_share_settings.cc
+++ b/chrome/browser/nearby_sharing/nearby_share_settings.cc
@@ -101,7 +101,7 @@
   const base::Value* list =
       pref_service_->GetList(prefs::kNearbySharingAllowedContactsPrefName);
   if (list) {
-    base::Value::ConstListView view = list->GetList();
+    base::Value::ConstListView view = list->GetListDeprecated();
     for (const auto& value : view) {
       allowed_contacts.push_back(value.GetString());
     }
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
index e9e522b..1773bca6 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
@@ -1326,6 +1326,24 @@
   InvalidateSurfaceState();
 }
 
+void NearbySharingServiceImpl::
+    LowEnergyScanSessionHardwareOffloadingStatusChanged(
+        device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+            status) {
+  if (!IsBackgroundScanningFeatureEnabled()) {
+    return;
+  }
+
+  NS_LOG(VERBOSE)
+      << __func__
+      << ": Bluetooth low energy scan session hardware offloading status : "
+      << (status == device::BluetoothAdapter::
+                        LowEnergyScanSessionHardwareOffloadingStatus::kSupported
+              ? "enabled"
+              : "disabled");
+  InvalidateSurfaceState();
+}
+
 void NearbySharingServiceImpl::SuspendImminent() {
   NS_LOG(VERBOSE) << __func__ << ": Suspend imminent.";
   InvalidateSurfaceState();
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h
index bfc440b..6422f0b 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.h
@@ -183,6 +183,9 @@
                              bool present) override;
   void AdapterPoweredChanged(device::BluetoothAdapter* adapter,
                              bool powered) override;
+  void LowEnergyScanSessionHardwareOffloadingStatusChanged(
+      device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+          status) override;
 
   // PowerClient::Observer:
   void SuspendImminent() override;
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
index b1507969..99385f4 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
@@ -650,6 +650,14 @@
                                              powered);
   }
 
+  void SetHardwareSupportState(
+      device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+          state) {
+    hardware_support_state_ = state;
+    adapter_observer_->LowEnergyScanSessionHardwareOffloadingStatusChanged(
+        state);
+  }
+
   void AddAdapterObserver(device::BluetoothAdapter::Observer* observer) {
     DCHECK(!adapter_observer_);
     adapter_observer_ = observer;
@@ -1320,6 +1328,8 @@
       fast_initiation_scanner_factory_;
   bool is_bluetooth_present_ = true;
   bool is_bluetooth_powered_ = true;
+  device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+      hardware_support_state_;
   device::BluetoothAdapter::Observer* adapter_observer_ = nullptr;
   scoped_refptr<NiceMock<MockBluetoothAdapterWithIntervals>>
       mock_bluetooth_adapter_;
@@ -4758,10 +4768,10 @@
   EXPECT_EQ(0u, fast_initiation_scanner_factory_->scanner_destroyed_count());
 
   fast_initiation_scanner_factory_->SetHardwareSupportAvailable(false);
-
-  // Toggle Bluetooth to trigger InvalidateFastInitiationScanning().
-  SetBluetoothIsPowered(false);
-  SetBluetoothIsPowered(true);
+  // Changes in HardwareSupportState should trigger InvalidateSurfaceState
+  SetHardwareSupportState(
+      device::BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
+          kNotSupported);
 
   // Make sure we stopped scanning and didn't restart.
   EXPECT_EQ(1u, fast_initiation_scanner_factory_->scanner_created_count());
diff --git a/chrome/browser/nearby_sharing/network_traversal_ice_config_fetcher.cc b/chrome/browser/nearby_sharing/network_traversal_ice_config_fetcher.cc
index 6e26b8f..de22c42 100644
--- a/chrome/browser/nearby_sharing/network_traversal_ice_config_fetcher.cc
+++ b/chrome/browser/nearby_sharing/network_traversal_ice_config_fetcher.cc
@@ -102,13 +102,13 @@
   if (!ice_servers_json)
     return ice_servers;
 
-  for (base::Value& server : ice_servers_json->GetList()) {
+  for (base::Value& server : ice_servers_json->GetListDeprecated()) {
     const base::Value* urls_json = server.FindListKey("urls");
     if (!urls_json)
       continue;
 
     std::vector<GURL> urls;
-    for (const base::Value& url_json : urls_json->GetList()) {
+    for (const base::Value& url_json : urls_json->GetListDeprecated()) {
       const std::string* url = url_json.GetIfString();
       if (!url)
         continue;
diff --git a/chrome/browser/net/cert_verify_proc_browsertest.cc b/chrome/browser/net/cert_verify_proc_browsertest.cc
index 70c225f..27d15e6 100644
--- a/chrome/browser/net/cert_verify_proc_browsertest.cc
+++ b/chrome/browser/net/cert_verify_proc_browsertest.cc
@@ -103,7 +103,7 @@
     ASSERT_TRUE(events);
 
     bool found_cert_verify_proc_event = false;
-    for (const auto& event : events->GetList()) {
+    for (const auto& event : events->GetListDeprecated()) {
       absl::optional<int> event_type = event.FindIntKey("type");
       ASSERT_TRUE(event_type.has_value());
       if (event_type ==
diff --git a/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc b/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc
index 313968af..3104398 100644
--- a/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc
+++ b/chrome/browser/net/convert_explicitly_allowed_network_ports_pref.cc
@@ -18,7 +18,8 @@
   const base::Value* explicitly_allowed_network_ports_list_value =
       local_state->GetList(prefs::kExplicitlyAllowedNetworkPorts);
   DCHECK(explicitly_allowed_network_ports_list_value);
-  auto list_view = explicitly_allowed_network_ports_list_value->GetList();
+  auto list_view =
+      explicitly_allowed_network_ports_list_value->GetListDeprecated();
   if (list_view.empty()) {
     return explicitly_allowed_network_ports;
   }
diff --git a/chrome/browser/net/errorpage_browsertest.cc b/chrome/browser/net/errorpage_browsertest.cc
index 5a9bcb9..668937cf 100644
--- a/chrome/browser/net/errorpage_browsertest.cc
+++ b/chrome/browser/net/errorpage_browsertest.cc
@@ -665,6 +665,10 @@
         std::make_unique<content::URLLoaderInterceptor>(base::BindRepeating(
             [](int32_t requests_to_fail, int32_t* requests, int32_t* failures,
                content::URLLoaderInterceptor::RequestParams* params) {
+              if (params->url_request.url.host().find("googleapis.com") !=
+                  std::string::npos) {
+                return false;
+              }
               if (params->url_request.url.path() == "/searchdomaincheck")
                 return false;
               if (params->url_request.url.path() == "/favicon.ico")
diff --git a/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc b/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc
index 659589a..71518a7d 100644
--- a/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc
+++ b/chrome/browser/net/explicitly_allowed_network_ports_policy_handler_unittest.cc
@@ -71,7 +71,7 @@
   auto* value = pref_value();
   ASSERT_TRUE(value);
   ASSERT_TRUE(value->is_list());
-  EXPECT_TRUE(value->GetList().empty());
+  EXPECT_TRUE(value->GetListDeprecated().empty());
 }
 
 TEST_F(ExplicitlyAllowedNetworkPortsPolicyHandlerTest, Valid) {
@@ -83,8 +83,8 @@
   auto* value = pref_value();
   ASSERT_TRUE(value);
   ASSERT_TRUE(value->is_list());
-  ASSERT_EQ(value->GetList().size(), 1u);
-  const auto& element = value->GetList()[0];
+  ASSERT_EQ(value->GetListDeprecated().size(), 1u);
+  const auto& element = value->GetListDeprecated()[0];
   EXPECT_TRUE(element.is_int());
   ASSERT_TRUE(element.GetIfInt());
   EXPECT_EQ(element.GetIfInt().value(), 6000);
@@ -108,8 +108,8 @@
   auto* value = pref_value();
   ASSERT_TRUE(value);
   ASSERT_TRUE(value->is_list());
-  ASSERT_EQ(value->GetList().size(), 1u);
-  const auto& element = value->GetList()[0];
+  ASSERT_EQ(value->GetListDeprecated().size(), 1u);
+  const auto& element = value->GetListDeprecated()[0];
   EXPECT_TRUE(element.is_int());
   ASSERT_TRUE(element.GetIfInt());
   EXPECT_EQ(element.GetIfInt().value(), 6000);
@@ -139,8 +139,8 @@
   auto* value = pref_value();
   ASSERT_TRUE(value);
   ASSERT_TRUE(value->is_list());
-  ASSERT_EQ(value->GetList().size(), 1u);
-  const auto& element = value->GetList()[0];
+  ASSERT_EQ(value->GetListDeprecated().size(), 1u);
+  const auto& element = value->GetListDeprecated()[0];
   EXPECT_TRUE(element.is_int());
   ASSERT_TRUE(element.GetIfInt());
   EXPECT_EQ(element.GetIfInt().value(), 6000);
diff --git a/chrome/browser/net/log_net_log_browsertest.cc b/chrome/browser/net/log_net_log_browsertest.cc
index f84c2905fb..33e6dcc 100644
--- a/chrome/browser/net/log_net_log_browsertest.cc
+++ b/chrome/browser/net/log_net_log_browsertest.cc
@@ -109,7 +109,7 @@
     // Ensure it has an "events" property.
     base::ListValue* events;
     ASSERT_TRUE(main->GetList("events", &events));
-    ASSERT_FALSE(events->GetList().empty());
+    ASSERT_FALSE(events->GetListDeprecated().empty());
 
     // Verify that cookies were stripped when the --net-log-capture-mode flag
     // was omitted, and not stripped when it was given a value of
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index ea7d8c5a..01af4c7 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -120,7 +120,7 @@
     return std::vector<std::string>();
 
   std::vector<std::string> strings;
-  for (const base::Value& value : list->GetList()) {
+  for (const base::Value& value : list->GetListDeprecated()) {
     DCHECK(value.is_string());
     strings.push_back(value.GetString());
   }
@@ -772,7 +772,7 @@
   }
   const base::Value* hsts_policy_bypass_list =
       g_browser_process->local_state()->GetList(prefs::kHSTSPolicyBypassList);
-  for (const auto& value : hsts_policy_bypass_list->GetList()) {
+  for (const auto& value : hsts_policy_bypass_list->GetListDeprecated()) {
     const std::string* string_value = value.GetIfString();
     if (!string_value)
       continue;
diff --git a/chrome/browser/net/reporting_browsertest.cc b/chrome/browser/net/reporting_browsertest.cc
index 27df9265..015038ba 100644
--- a/chrome/browser/net/reporting_browsertest.cc
+++ b/chrome/browser/net/reporting_browsertest.cc
@@ -193,7 +193,7 @@
 std::unique_ptr<base::Value> ParseReportUpload(const std::string& payload) {
   auto parsed_payload = base::test::ParseJsonDeprecated(payload);
   // Clear out any non-reproducible fields.
-  for (auto& report : parsed_payload->GetList()) {
+  for (auto& report : parsed_payload->GetListDeprecated()) {
     report.RemoveKey("age");
     report.RemovePath("body.elapsed_time");
     auto* user_agent =
@@ -471,7 +471,7 @@
 
   // Verify the contents of the report that we received.
   EXPECT_TRUE(response != nullptr);
-  auto report = response->GetList().begin();
+  auto report = response->GetListDeprecated().begin();
   auto* type = report->FindKeyOfType("type", base::Value::Type::STRING);
   auto* url = report->FindKeyOfType("url", base::Value::Type::STRING);
 
@@ -508,7 +508,7 @@
 
   // Verify the contents of the report that we received.
   EXPECT_TRUE(response != nullptr);
-  auto report = response->GetList().begin();
+  auto report = response->GetListDeprecated().begin();
   auto* type = report->FindKeyOfType("type", base::Value::Type::STRING);
   auto* url = report->FindKeyOfType("url", base::Value::Type::STRING);
   auto* body = report->FindKeyOfType("body", base::Value::Type::DICTIONARY);
diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc
index 51348a4..011c76e 100644
--- a/chrome/browser/net/system_network_context_manager.cc
+++ b/chrome/browser/net/system_network_context_manager.cc
@@ -129,7 +129,7 @@
 
   for (const base::Value& item :
        local_state->GetList(prefs::kAllHttpAuthSchemesAllowedForOrigins)
-           ->GetList()) {
+           ->GetListDeprecated()) {
     auth_dynamic_params->patterns_allowed_to_use_all_schemes.push_back(
         item.GetString());
   }
diff --git a/chrome/browser/new_tab_page/modules/drive/drive_service.cc b/chrome/browser/new_tab_page/modules/drive/drive_service.cc
index 031617a..33dfa75 100644
--- a/chrome/browser/new_tab_page/modules/drive/drive_service.cc
+++ b/chrome/browser/new_tab_page/modules/drive/drive_service.cc
@@ -306,17 +306,18 @@
     return;
   }
   std::vector<drive::mojom::FilePtr> document_list;
-  for (const auto& item : items->GetList()) {
+  for (const auto& item : items->GetListDeprecated()) {
     auto* title = item.FindStringPath("driveItem.title");
     auto* mime_type = item.FindStringPath("driveItem.mimeType");
     auto* justification_text_segments =
         item.FindListPath("justification.displayText.textSegment");
     if (!justification_text_segments ||
-        justification_text_segments->GetList().size() == 0) {
+        justification_text_segments->GetListDeprecated().size() == 0) {
       continue;
     }
     std::string justification_text;
-    for (auto& text_segment : justification_text_segments->GetList()) {
+    for (auto& text_segment :
+         justification_text_segments->GetListDeprecated()) {
       auto* justification_text_path = text_segment.FindStringPath("text");
       if (!justification_text_path) {
         continue;
diff --git a/chrome/browser/new_tab_page/modules/photos/photos_service.cc b/chrome/browser/new_tab_page/modules/photos/photos_service.cc
index 6b94d0f..66c452d 100644
--- a/chrome/browser/new_tab_page/modules/photos/photos_service.cc
+++ b/chrome/browser/new_tab_page/modules/photos/photos_service.cc
@@ -337,8 +337,9 @@
   std::vector<photos::mojom::MemoryPtr> memory_list;
 
   base::UmaHistogramCustomCounts("NewTabPage.Photos.DataResponseCount",
-                                 memories->GetList().size(), 0, 10, 11);
-  for (const auto& memory : memories->GetList()) {
+                                 memories->GetListDeprecated().size(), 0, 10,
+                                 11);
+  for (const auto& memory : memories->GetListDeprecated()) {
     auto* title = memory.FindStringPath("title.header");
     auto* memory_id = memory.FindStringPath("memoryMediaKey");
     auto* cover_id = memory.FindStringPath("coverMediaKey");
diff --git a/chrome/browser/new_tab_page/modules/task_module/task_module_service.cc b/chrome/browser/new_tab_page/modules/task_module/task_module_service.cc
index 3ff24c5..bec8bbf 100644
--- a/chrome/browser/new_tab_page/modules/task_module/task_module_service.cc
+++ b/chrome/browser/new_tab_page/modules/task_module/task_module_service.cc
@@ -239,7 +239,7 @@
   ListPrefUpdate update(profile_->GetPrefs(),
                         GetDismissedTasksPrefName(task_module_type));
   base::Value task_name_value(task_name);
-  if (!base::Contains(update->GetList(), task_name_value))
+  if (!base::Contains(update->GetListDeprecated(), task_name_value))
     update->Append(std::move(task_name_value));
 }
 
@@ -296,25 +296,25 @@
   // support showing a single task though. Therefore, pick the first task.
   auto* tasks = result.value->FindListPath(
       base::StringPrintf("update.%s", GetTasksKey(task_module_type)));
-  if (!tasks || tasks->GetList().size() == 0) {
+  if (!tasks || tasks->GetListDeprecated().size() == 0) {
     std::move(callback).Run(nullptr);
     return;
   }
 
-  for (const auto& task : tasks->GetList()) {
+  for (const auto& task : tasks->GetListDeprecated()) {
     auto* title = task.FindStringPath("title");
     auto* task_name = task.FindStringPath("task_name");
     auto* task_items = task.FindListPath(GetTaskItemsKey(task_module_type));
     auto* related_searches = task.FindListPath("related_searches");
     if (!title || !task_name || !task_items || !related_searches ||
-        task_items->GetList().size() == 0) {
+        task_items->GetListDeprecated().size() == 0) {
       continue;
     }
     if (IsTaskDismissed(task_module_type, *task_name)) {
       continue;
     }
     std::vector<task_module::mojom::TaskItemPtr> mojo_task_items;
-    for (const auto& task_item : task_items->GetList()) {
+    for (const auto& task_item : task_items->GetListDeprecated()) {
       auto* name = task_item.FindStringPath("name");
       auto* image_url = task_item.FindStringPath("image_url");
       auto* price = task_item.FindStringPath("price");
@@ -345,7 +345,7 @@
       mojo_task_items.push_back(std::move(mojom_task_item));
     }
     std::vector<task_module::mojom::RelatedSearchPtr> mojo_related_searches;
-    for (const auto& related_search : related_searches->GetList()) {
+    for (const auto& related_search : related_searches->GetListDeprecated()) {
       auto* text = related_search.FindStringPath("text");
       auto* target_url = related_search.FindStringPath("target_url");
       if (!text || !target_url) {
@@ -386,5 +386,6 @@
   const base::Value* dismissed_tasks = profile_->GetPrefs()->GetList(
       GetDismissedTasksPrefName(task_module_type));
   DCHECK(dismissed_tasks);
-  return base::Contains(dismissed_tasks->GetList(), base::Value(task_name));
+  return base::Contains(dismissed_tasks->GetListDeprecated(),
+                        base::Value(task_name));
 }
diff --git a/chrome/browser/notifications/notifier_state_tracker.cc b/chrome/browser/notifications/notifier_state_tracker.cc
index 6f9c642..b6eb67ad 100644
--- a/chrome/browser/notifications/notifier_state_tracker.cc
+++ b/chrome/browser/notifications/notifier_state_tracker.cc
@@ -131,7 +131,7 @@
 
   ListPrefUpdate update(profile_->GetPrefs(), pref_name);
   if (add_new_item) {
-    if (!base::Contains(update->GetList(), id))
+    if (!base::Contains(update->GetListDeprecated(), id))
       update->Append(std::move(id));
   } else {
     update->EraseListValue(id);
@@ -141,11 +141,12 @@
 void NotifierStateTracker::OnStringListPrefChanged(
     const char* pref_name, std::set<std::string>* ids_field) {
   ids_field->clear();
-  // Separate GetPrefs()->GetList() to analyze the crash. See crbug.com/322320
+  // Separate GetPrefs()->GetListDeprecated() to analyze the crash. See
+  // crbug.com/322320
   const PrefService* pref_service = profile_->GetPrefs();
   CHECK(pref_service);
   const base::Value* pref_list = pref_service->GetList(pref_name);
-  base::Value::ConstListView pref_list_view = pref_list->GetList();
+  base::Value::ConstListView pref_list_view = pref_list->GetListDeprecated();
   for (size_t i = 0; i < pref_list_view.size(); ++i) {
     const std::string* element = pref_list_view[i].GetIfString();
     if (element && !element->empty())
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.cc b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
index 511aed1..26cb735 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager.cc
@@ -276,7 +276,7 @@
 
   // If no fetch is scheduled, maybe schedule one.
   if (!fetch_timer_.IsRunning())
-    MaybeScheduleModelFetch();
+    MaybeFetchModels();
 
   // Otherwise, load prediction models for any newly registered targets.
   LoadPredictionModels({optimization_target});
@@ -371,8 +371,7 @@
   if (!prediction_model_fetcher_) {
     prediction_model_fetcher_ = std::make_unique<PredictionModelFetcherImpl>(
         url_loader_factory_,
-        features::GetOptimizationGuideServiceGetModelsURL(),
-        content::GetNetworkConnectionTracker());
+        features::GetOptimizationGuideServiceGetModelsURL());
   }
 
   std::vector<proto::ModelInfo> models_info = std::vector<proto::ModelInfo>();
@@ -633,7 +632,7 @@
   // targets.
   LoadPredictionModels(GetRegisteredOptimizationTargets());
 
-  MaybeScheduleModelFetch();
+  MaybeFetchModels();
 }
 
 void PredictionManager::LoadPredictionModels(
@@ -818,16 +817,14 @@
       optimization_target, std::move(prediction_model));
 }
 
-void PredictionManager::MaybeScheduleModelFetch() {
+void PredictionManager::MaybeFetchModels() {
   if (!ShouldFetchModels(profile_))
     return;
 
-  if (switches::ShouldOverrideFetchModelsAndFeaturesTimer()) {
-    fetch_timer_.Start(FROM_HERE, base::Seconds(1), this,
-                       &PredictionManager::FetchModels);
-  } else {
-    ScheduleModelsFetch();
-  }
+  // Add a slight delay to allow the rest of the browser startup process to
+  // finish up.
+  fetch_timer_.Start(FROM_HERE, base::Seconds(2), this,
+                     &PredictionManager::FetchModels);
 }
 
 base::Time PredictionManager::GetLastFetchAttemptTime() const {
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager.h b/chrome/browser/optimization_guide/prediction/prediction_manager.h
index 937e6a7..d0debf52 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager.h
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager.h
@@ -212,9 +212,8 @@
   // |last_success_time|.
   void SetLastModelFetchSuccessTime(base::Time last_success_time);
 
-  // Determine whether to schedule fetching new prediction models or fetch
-  // immediately due to override.
-  void MaybeScheduleModelFetch();
+  // Fetch models if enabled for this profile.
+  void MaybeFetchModels();
 
   // Schedule |fetch_timer_| to fire based on:
   // 1. The update time for models in the store and
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
index b866e248..bc2737dd 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_browsertest.cc
@@ -221,8 +221,6 @@
 
   void SetUpCommandLine(base::CommandLine* cmd) override {
     cmd->AppendSwitch("enable-spdy-proxy-auth");
-    cmd->AppendSwitch(optimization_guide::switches::
-                          kFetchModelsAndHostModelFeaturesOverrideTimer);
 
     cmd->AppendSwitch(optimization_guide::switches::
                           kDisableCheckingUserPermissionsForTesting);
diff --git a/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
index d67d4e7..c444acc0 100644
--- a/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
+++ b/chrome/browser/optimization_guide/prediction/prediction_manager_unittest.cc
@@ -205,11 +205,9 @@
   TestPredictionModelFetcher(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       const GURL& optimization_guide_service_get_models_url,
-      network::NetworkConnectionTracker* network_connection_tracker,
       PredictionModelFetcherEndState fetch_state)
       : PredictionModelFetcherImpl(url_loader_factory,
-                                   optimization_guide_service_get_models_url,
-                                   network_connection_tracker),
+                                   optimization_guide_service_get_models_url),
         fetch_state_(fetch_state) {}
 
   bool FetchOptimizationGuideServiceModels(
@@ -445,8 +443,6 @@
             &test_url_loader_factory_);
     base::CommandLine::ForCurrentProcess()->AppendSwitch(
         switches::kDisableCheckingUserPermissionsForTesting);
-    base::CommandLine::ForCurrentProcess()->AppendSwitch(
-        switches::kFetchModelsAndHostModelFeaturesOverrideTimer);
   }
 
   void CreatePredictionManager() {
@@ -482,8 +478,7 @@
       PredictionModelFetcherEndState end_state) {
     std::unique_ptr<TestPredictionModelFetcher> prediction_model_fetcher =
         std::make_unique<TestPredictionModelFetcher>(
-            url_loader_factory_, GURL("https://hintsserver.com"),
-            network::TestNetworkConnectionTracker::GetInstance(), end_state);
+            url_loader_factory_, GURL("https://hintsserver.com"), end_state);
     return prediction_model_fetcher;
   }
 
@@ -1178,9 +1173,6 @@
 }
 
 TEST_F(PredictionManagerTest, ModelFetcherTimerRetryDelay) {
-  base::CommandLine::ForCurrentProcess()->RemoveSwitch(
-      switches::kFetchModelsAndHostModelFeaturesOverrideTimer);
-
   CreatePredictionManager();
   prediction_manager()->SetPredictionModelFetcherForTesting(
       BuildTestPredictionModelFetcher(
@@ -1205,9 +1197,6 @@
 }
 
 TEST_F(PredictionManagerTest, ModelFetcherTimerFetchSucceeds) {
-  base::CommandLine::ForCurrentProcess()->RemoveSwitch(
-      switches::kFetchModelsAndHostModelFeaturesOverrideTimer);
-
   CreatePredictionManager();
   prediction_manager()->SetPredictionModelFetcherForTesting(
       BuildTestPredictionModelFetcher(
@@ -1220,8 +1209,6 @@
       proto::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD, absl::nullopt, &observer);
 
   SetStoreInitialized();
-  EXPECT_FALSE(prediction_model_fetcher()->models_fetched());
-  MoveClockForwardBy(base::Seconds(kTestFetchRetryDelaySecs));
   EXPECT_TRUE(prediction_model_fetcher()->models_fetched());
   EXPECT_EQ("en-US", prediction_model_fetcher()->locale_requested());
 
diff --git a/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc
index 29c7d9a..aedf591 100644
--- a/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc
+++ b/chrome/browser/page_load_metrics/integration_tests/largest_contentful_paint_browsertest.cc
@@ -173,7 +173,7 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_F(PageViewportInLCPTest, FullSizeImageInIframe) {
+IN_PROC_BROWSER_TEST_F(PageViewportInLCPTest, DISABLED_FullSizeImageInIframe) {
   Start();
   StartTracing({"loading"});
   Load("/full_size_image.html");
diff --git a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
index 5cd9cba..c947f96d 100644
--- a/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
+++ b/chrome/browser/page_load_metrics/integration_tests/layout_instability_browsertest.cc
@@ -82,8 +82,8 @@
     }
     const Value* sources = expectation.FindListKey("sources");
     if (sources) {
-      CheckSources(sources->GetList(),
-                   data.FindListKey("impacted_nodes")->GetList());
+      CheckSources(sources->GetListDeprecated(),
+                   data.FindListKey("impacted_nodes")->GetListDeprecated());
     }
   }
 
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService.java
index e98a532..7a30dfb 100644
--- a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService.java
+++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService.java
@@ -15,7 +15,6 @@
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.task.PostTask;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
 import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
@@ -25,7 +24,6 @@
 import org.chromium.content_public.browser.WebContents;
 
 import java.io.File;
-import java.util.HashSet;
 
 /**
  * The Java-side implementations of paint_preview_tab_service.cc. The C++ side owns and controls
@@ -41,8 +39,6 @@
     private Runnable mAuditRunnable;
     private long mNativePaintPreviewBaseService;
     private long mNativePaintPreviewTabService;
-    @VisibleForTesting
-    HashSet<Integer> mPreNativeCache;
 
     private class CaptureTriggerListener extends TabModelSelectorTabObserver
             implements ApplicationStatus.ApplicationStateListener {
@@ -99,9 +95,6 @@
             long nativePaintPreviewTabService, long nativePaintPreviewBaseService) {
         mNativePaintPreviewTabService = nativePaintPreviewTabService;
         mNativePaintPreviewBaseService = nativePaintPreviewBaseService;
-        if (!isNativeCacheInitialized()) {
-            createPreNativeCache(getPath());
-        }
     }
 
     @CalledByNative
@@ -128,11 +121,8 @@
     public boolean hasCaptureForTab(int tabId) {
         if (mNativePaintPreviewTabService == 0) return false;
 
-        if (mPreNativeCache != null) {
-            if (!isNativeCacheInitialized()) {
-                return mPreNativeCache.contains(tabId);
-            }
-            mPreNativeCache = null;
+        if (!isNativeCacheInitialized()) {
+            return previewExistsPreNative(getPath(), tabId);
         }
 
         return PaintPreviewTabServiceJni.get().hasCaptureForTabAndroid(
@@ -153,7 +143,16 @@
 
         // Delay actually performing the audit by a bit to avoid contention with the native task
         // runner that handles IO when showing at startup.
-        mAuditRunnable = () -> auditOnStart(tabModelSelector.getModel(/*incognito*/ false));
+        int id = tabModelSelector.getCurrentTabId();
+        int[] ids;
+        if (id == Tab.INVALID_TAB_ID || tabModelSelector.isIncognitoSelected()) {
+            // Delete all previews.
+            ids = new int[0];
+        } else {
+            // Delete all previews keeping the current tab.
+            ids = new int[] {id};
+        }
+        mAuditRunnable = () -> auditArtifacts(ids);
         PostTask.postDelayedTask(UiThreadTaskTraits.DEFAULT,
                 () -> {
                     mAuditRunnable.run();
@@ -163,18 +162,6 @@
     }
 
     @VisibleForTesting
-    void auditOnStart(TabModel regularTabModel) {
-        int tabCount = regularTabModel.getCount();
-        int[] tabIds = new int[tabCount];
-        for (int i = 0; i < tabCount; i++) {
-            Tab tab = regularTabModel.getTabAt(i);
-            tabIds[i] = tab.getId();
-        }
-
-        auditArtifacts(tabIds);
-    }
-
-    @VisibleForTesting
     public boolean isNativeCacheInitialized() {
         if (mNativePaintPreviewTabService == 0) return false;
 
@@ -189,29 +176,18 @@
     }
 
     @VisibleForTesting
-    void createPreNativeCache(String rootPath) {
-        mPreNativeCache = new HashSet<Integer>();
-
+    boolean previewExistsPreNative(String rootPath, int tabId) {
         assert rootPath != null;
         assert !rootPath.isEmpty();
 
-        String[] childPaths;
+        boolean exists = false;
         try (StrictModeContext ignored = StrictModeContext.allowDiskReads()) {
-            File rootDir = new File(rootPath);
-            childPaths = rootDir.list();
+            File zipPath = new File(
+                    rootPath, (new StringBuilder()).append(tabId).append(".zip").toString());
+            exists = zipPath.exists();
         }
 
-        // It is possible there are no captures.
-        if (childPaths == null) return;
-
-        // All children will have the name format # or #.zip.
-        for (String childName : childPaths) {
-            // Strip extension if present.
-            if (childName.indexOf(".") > 0) {
-                childName = childName.substring(0, childName.lastIndexOf("."));
-            }
-            mPreNativeCache.add(Integer.parseInt(childName));
-        }
+        return exists;
     }
 
     public void captureTab(Tab tab, Callback<Boolean> successCallback) {
@@ -236,7 +212,8 @@
                 mNativePaintPreviewTabService, tab.getId());
     }
 
-    private void auditArtifacts(int[] activeTabIds) {
+    @VisibleForTesting
+    void auditArtifacts(int[] activeTabIds) {
         if (mNativePaintPreviewTabService == 0) return;
 
         PaintPreviewTabServiceJni.get().auditArtifactsAndroid(
diff --git a/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabServiceTest.java b/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabServiceTest.java
index ff29d87..c7074ad 100644
--- a/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabServiceTest.java
+++ b/chrome/browser/paint_preview/android/javatests/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabServiceTest.java
@@ -29,7 +29,6 @@
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.EmbeddedTestServer;
 
-import java.util.HashSet;
 import java.util.concurrent.TimeUnit;
 
 /** Tests for the Paint Preview Tab Manager. */
@@ -158,11 +157,8 @@
             InstrumentationRegistry.getInstrumentation().callActivityOnResume(activity);
         });
 
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            // Use the incognito tab model as the normal tab model will still have the tab ids
-            // active.
-            mPaintPreviewTabService.auditOnStart(mTabModelSelector.getModel(/*incognito=*/true));
-        });
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> { mPaintPreviewTabService.auditArtifacts(new int[0]); });
 
         CriteriaHelper.pollUiThread(() -> {
             return !mPaintPreviewTabService.hasCaptureForTab(tabId);
@@ -170,28 +166,27 @@
     }
 
     /**
-     * Verifies the early cache is created correctly.
+     * Verifies the pre-native preview exists check works.
      */
     @Test
     @MediumTest
     @Feature({"PaintPreview"})
-    public void testEarlyCache() throws Exception {
-        mTemporaryFolder.newFolder("1");
+    public void testPreNativePreviewExists() throws Exception {
         mTemporaryFolder.newFile("2.zip");
-        mTemporaryFolder.newFile("6.zip");
+        mTemporaryFolder.newFile("3.zip");
+        mTemporaryFolder.newFile("6");
         mTemporaryFolder.newFolder("10");
 
-        HashSet<Integer> expectedFiles = new HashSet<>();
-        expectedFiles.add(1);
-        expectedFiles.add(2);
-        expectedFiles.add(6);
-        expectedFiles.add(10);
-
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mPaintPreviewTabService = PaintPreviewTabServiceFactory.getServiceInstance();
-            mPaintPreviewTabService.createPreNativeCache(mTemporaryFolder.getRoot().getPath());
+            Assert.assertTrue(mPaintPreviewTabService.previewExistsPreNative(
+                    mTemporaryFolder.getRoot().getPath(), 2));
+            Assert.assertTrue(mPaintPreviewTabService.previewExistsPreNative(
+                    mTemporaryFolder.getRoot().getPath(), 3));
+            Assert.assertFalse(mPaintPreviewTabService.previewExistsPreNative(
+                    mTemporaryFolder.getRoot().getPath(), 6));
+            Assert.assertFalse(mPaintPreviewTabService.previewExistsPreNative(
+                    mTemporaryFolder.getRoot().getPath(), 10));
         });
-
-        Assert.assertEquals(expectedFiles, mPaintPreviewTabService.mPreNativeCache);
     }
 }
diff --git a/chrome/browser/paint_preview/services/paint_preview_tab_service.h b/chrome/browser/paint_preview/services/paint_preview_tab_service.h
index 4783dee..7897913 100644
--- a/chrome/browser/paint_preview/services/paint_preview_tab_service.h
+++ b/chrome/browser/paint_preview/services/paint_preview_tab_service.h
@@ -22,10 +22,10 @@
 #include "content/public/browser/global_routing_id.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-#if defined(os_android)
+#if BUILDFLAG(IS_ANDROID)
 #include "base/android/jni_android.h"
 #include "base/android/scoped_java_ref.h"
-#endif  // defined(os_android)
+#endif  // BUILDFLAG(IS_ANDROID)
 
 namespace content {
 class WebContents;
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index 03fb660..8aff5d5 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -18,7 +18,6 @@
 #include "base/memory/ref_counted.h"
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
@@ -82,7 +81,6 @@
 #include "components/sessions/content/content_record_password_state.h"
 #include "components/signin/public/base/signin_metrics.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
-#include "components/site_engagement/content/site_engagement_service.h"
 #include "components/site_isolation/site_isolation_policy.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_user_settings.h"
@@ -225,36 +223,6 @@
 }
 #endif  // BUILDFLAG(IS_ANDROID)
 
-class NavigationPasswordMetricsRecorder
-    : public PasswordManagerMetricsRecorder::NavigationMetricRecorderDelegate {
- public:
-  explicit NavigationPasswordMetricsRecorder(content::WebContents* web_contents)
-      : web_contents_(web_contents) {}
-
-  void OnUserFocusedPasswordFieldFirstTime() override {
-    RecordEngagementLevel("Security.PasswordFocus.SiteEngagementLevel");
-  }
-
-  void OnUserModifiedPasswordFieldFirstTime() override {
-    RecordEngagementLevel("Security.PasswordEntry.SiteEngagementLevel");
-  }
-
- private:
-  void RecordEngagementLevel(const char* histogram_name) {
-    const GURL& main_frame_url = web_contents_->GetLastCommittedURL();
-    if (main_frame_url.SchemeIsHTTPOrHTTPS()) {
-      site_engagement::SiteEngagementService* site_engagement_service =
-          site_engagement::SiteEngagementService::Get(
-              Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
-      blink::mojom::EngagementLevel engagement_level =
-          site_engagement_service->GetEngagementLevel(main_frame_url);
-      base::UmaHistogramEnumeration(histogram_name, engagement_level);
-    }
-  }
-
-  raw_ptr<content::WebContents> web_contents_;
-};
-
 }  // namespace
 
 // static
@@ -927,9 +895,7 @@
 PasswordManagerMetricsRecorder*
 ChromePasswordManagerClient::GetMetricsRecorder() {
   if (!metrics_recorder_) {
-    metrics_recorder_.emplace(
-        GetUkmSourceId(),
-        std::make_unique<NavigationPasswordMetricsRecorder>(web_contents()));
+    metrics_recorder_.emplace(GetUkmSourceId());
   }
   return base::OptionalOrNullptr(metrics_recorder_);
 }
diff --git a/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc b/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc
index 9b19518b..c39c2393 100644
--- a/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc
+++ b/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc
@@ -594,7 +594,7 @@
   DictionaryPrefUpdate update(profile()->GetPrefs(),
                               permissions::prefs::kPermissionActions);
   const auto permissions_actions =
-      update->FindListPath("notifications")->GetList();
+      update->FindListPath("notifications")->GetListDeprecated();
   PermissionActionsHistoryFactory::GetForProfile(profile())->ClearHistory(
       from_time, to_time);
 
diff --git a/chrome/browser/plugins/plugin_finder.cc b/chrome/browser/plugins/plugin_finder.cc
index 1b793bf6..8415dd9 100644
--- a/chrome/browser/plugins/plugin_finder.cc
+++ b/chrome/browser/plugins/plugin_finder.cc
@@ -54,7 +54,7 @@
   if (!plugin_dict->GetList(list_key, &mime_types))
     return;
 
-  for (const auto& mime_type : mime_types->GetList()) {
+  for (const auto& mime_type : mime_types->GetListDeprecated()) {
     const std::string& mime_type_str = mime_type.GetString();
     if (matching_mime_types)
       plugin->AddMatchingMimeType(mime_type_str);
@@ -87,7 +87,7 @@
       group_name_matcher, language_str, plugin_is_deprecated);
   const base::ListValue* versions = NULL;
   if (plugin_dict->GetList("versions", &versions)) {
-    for (const auto& entry : versions->GetList()) {
+    for (const auto& entry : versions->GetListDeprecated()) {
       const base::DictionaryValue* version_dict = nullptr;
       if (!entry.GetAsDictionary(&version_dict)) {
         NOTREACHED();
diff --git a/chrome/browser/plugins/plugin_finder_unittest.cc b/chrome/browser/plugins/plugin_finder_unittest.cc
index 2d16fa2..bf516a72 100644
--- a/chrome/browser/plugins/plugin_finder_unittest.cc
+++ b/chrome/browser/plugins/plugin_finder_unittest.cc
@@ -40,14 +40,14 @@
       EXPECT_TRUE(plugin->FindBoolKey("requires_authorization").has_value());
     const base::ListValue* mime_types = NULL;
     if (plugin->GetList("mime_types", &mime_types)) {
-      for (const auto& mime_type : mime_types->GetList()) {
+      for (const auto& mime_type : mime_types->GetListDeprecated()) {
         EXPECT_TRUE(mime_type.GetAsString(&dummy_str));
       }
     }
 
     const base::ListValue* matching_mime_types = NULL;
     if (plugin->GetList("matching_mime_types", &matching_mime_types)) {
-      for (const auto& mime_type : matching_mime_types->GetList()) {
+      for (const auto& mime_type : matching_mime_types->GetListDeprecated()) {
         EXPECT_TRUE(mime_type.GetAsString(&dummy_str));
       }
     }
@@ -56,7 +56,7 @@
     if (!plugin->GetList("versions", &versions))
       continue;
 
-    for (const auto& version_value : versions->GetList()) {
+    for (const auto& version_value : versions->GetListDeprecated()) {
       const base::DictionaryValue* version_dict = nullptr;
       ASSERT_TRUE(version_value.GetAsDictionary(&version_dict));
       EXPECT_TRUE(version_dict->GetString("version", &dummy_str));
diff --git a/chrome/browser/plugins/plugin_prefs.cc b/chrome/browser/plugins/plugin_prefs.cc
index a86ac62..ea6561f 100644
--- a/chrome/browser/plugins/plugin_prefs.cc
+++ b/chrome/browser/plugins/plugin_prefs.cc
@@ -116,7 +116,7 @@
     ListPrefUpdate update(prefs_, prefs::kPluginsPluginsList);
     base::Value* saved_plugins_list = update.Get();
     if (saved_plugins_list) {
-      for (auto& plugin_value : saved_plugins_list->GetList()) {
+      for (auto& plugin_value : saved_plugins_list->GetListDeprecated()) {
         base::DictionaryValue* plugin;
         if (!plugin_value.GetAsDictionary(&plugin)) {
           LOG(WARNING) << "Invalid entry in " << prefs::kPluginsPluginsList;
diff --git a/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc b/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc
index f3fd0cc..598d6f07 100644
--- a/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/public/report_client_unittest.cc
@@ -252,7 +252,7 @@
                   policy::CloudPolicyClient::ResponseCallback done_cb) {
       base::Value* const records = payload.FindListKey("encryptedRecord");
       ASSERT_THAT(records, Ne(nullptr));
-      base::Value::ListView records_list = records->GetList();
+      base::Value::ListView records_list = records->GetListDeprecated();
       ASSERT_THAT(records_list, SizeIs(1));
       base::Value& record = records_list[0];
       if (is_encryption_enabled()) {
diff --git a/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service_unittest.cc b/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service_unittest.cc
index a87dcb4..048cfd1 100644
--- a/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/dm_server_upload_service_unittest.cc
@@ -68,20 +68,14 @@
                DmServerUploadService::EncryptionKeyAttachedCallback));
 };
 
-class DmServerUploaderTest : public ::testing::TestWithParam<
-                                 ::testing::tuple</*need_encryption_key*/ bool,
-                                                  /*force_confirm*/ bool>> {
+class DmServerTest {
  public:
-  DmServerUploaderTest()
+  DmServerTest()
       : sequenced_task_runner_(base::ThreadPool::CreateSequencedTaskRunner({})),
         handler_(std::make_unique<TestRecordHandler>()),
         records_(std::make_unique<std::vector<EncryptedRecord>>()) {}
 
  protected:
-  bool need_encryption_key() const { return std::get<0>(GetParam()); }
-
-  bool force_confirm() const { return std::get<1>(GetParam()); }
-
   content::BrowserTaskEnvironment task_envrionment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 
@@ -93,6 +87,19 @@
   const base::TimeDelta kMaxDelay_ = base::Seconds(1);
 };
 
+class DmServerFailureTest : public DmServerTest,
+                            public testing::TestWithParam<error::Code> {};
+
+class DmServerUploaderTest : public DmServerTest,
+                             public testing::TestWithParam<
+                                 ::testing::tuple</*need_encryption_key*/ bool,
+                                                  /*force_confirm*/ bool>> {
+ protected:
+  bool need_encryption_key() const { return std::get<0>(GetParam()); }
+
+  bool force_confirm() const { return std::get<1>(GetParam()); }
+};
+
 using TestSuccessfulUpload = MockFunction<void(SequenceInformation,
                                                /*force_confirm*/ bool)>;
 using TestEncryptionKeyAttached = MockFunction<void(SignedEncryptionInfo)>;
@@ -223,38 +230,6 @@
               Property(&Status::error_code, Eq(error::FAILED_PRECONDITION)));
 }
 
-TEST_P(DmServerUploaderTest, ReportsFailureToUpload) {
-  // Add an empty record.
-  records_->emplace_back();
-
-  EXPECT_CALL(*handler_, HandleRecords_(_, _, _, _))
-      .WillOnce(WithArgs<2>(
-          Invoke([](DmServerUploadService::CompletionCallback callback) {
-            std::move(callback).Run(
-                Status(error::DEADLINE_EXCEEDED, "Fail for test"));
-          })));
-
-  StrictMock<TestSuccessfulUpload> successful_upload;
-  EXPECT_CALL(successful_upload, Call(_, _)).Times(0);
-  auto successful_upload_cb = base::BindRepeating(
-      &TestSuccessfulUpload::Call, base::Unretained(&successful_upload));
-  StrictMock<TestEncryptionKeyAttached> encryption_key_attached;
-  EXPECT_CALL(encryption_key_attached, Call(_)).Times(0);
-  auto encryption_key_attached_cb =
-      base::BindRepeating(&TestEncryptionKeyAttached::Call,
-                          base::Unretained(&encryption_key_attached));
-
-  test::TestEvent<DmServerUploadService::CompletionResponse> callback_waiter;
-  Start<DmServerUploadService::DmServerUploader>(
-      need_encryption_key(), std::move(records_), handler_.get(),
-      std::move(successful_upload_cb), std::move(encryption_key_attached_cb),
-      callback_waiter.cb(), sequenced_task_runner_);
-
-  const auto response = callback_waiter.result();
-  EXPECT_THAT(response.status(),
-              Property(&Status::error_code, Eq(error::DEADLINE_EXCEEDED)));
-}
-
 TEST_P(DmServerUploaderTest, ReprotWithZeroRecords) {
   StrictMock<TestSuccessfulUpload> successful_upload;
   EXPECT_CALL(successful_upload, Call(_, _))
@@ -304,10 +279,52 @@
   }
 }
 
+TEST_P(DmServerFailureTest, ReportsFailureToUpload) {
+  const error::Code& error_code = GetParam();
+  // Add an empty record.
+  records_->emplace_back();
+
+  EXPECT_CALL(*handler_, HandleRecords_(_, _, _, _))
+      .WillOnce(WithArgs<2>(Invoke(
+          [error_code](DmServerUploadService::CompletionCallback callback) {
+            std::move(callback).Run(Status(error_code, "Failing for test"));
+          })));
+
+  StrictMock<TestSuccessfulUpload> successful_upload;
+  EXPECT_CALL(successful_upload, Call(_, _)).Times(0);
+  auto successful_upload_cb = base::BindRepeating(
+      &TestSuccessfulUpload::Call, base::Unretained(&successful_upload));
+  StrictMock<TestEncryptionKeyAttached> encryption_key_attached;
+  EXPECT_CALL(encryption_key_attached, Call(_)).Times(0);
+  auto encryption_key_attached_cb =
+      base::BindRepeating(&TestEncryptionKeyAttached::Call,
+                          base::Unretained(&encryption_key_attached));
+
+  test::TestEvent<DmServerUploadService::CompletionResponse> callback_waiter;
+  Start<DmServerUploadService::DmServerUploader>(
+      /*need_encryption_key*/ true, std::move(records_), handler_.get(),
+      std::move(successful_upload_cb), std::move(encryption_key_attached_cb),
+      callback_waiter.cb(), sequenced_task_runner_);
+
+  const auto response = callback_waiter.result();
+  EXPECT_THAT(response.status(), Property(&Status::code, Eq(error_code)));
+}
+
 INSTANTIATE_TEST_SUITE_P(
     NeedOrNoNeedKey,
     DmServerUploaderTest,
     ::testing::Combine(/*need_encryption_key*/ ::testing::Bool(),
                        /*force_confirm*/ ::testing::Bool()));
+
+INSTANTIATE_TEST_SUITE_P(
+    DmServerFailureTests,
+    DmServerFailureTest,
+    testing::Values(error::INVALID_ARGUMENT,
+                    error::PERMISSION_DENIED,
+                    error::OUT_OF_RANGE,
+                    error::UNAVAILABLE),
+    [](const testing::TestParamInfo<DmServerFailureTest::ParamType>& info) {
+      return Status(info.param, "").ToString();
+    });
 }  // namespace
 }  // namespace reporting
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
index e0bee9d1..c16121e8 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl_unittest.cc
@@ -77,9 +77,9 @@
   const base::Value* const encrypted_record_list =
       request.FindListKey("encryptedRecord");
   ASSERT_TRUE(encrypted_record_list != nullptr);
-  ASSERT_FALSE(encrypted_record_list->GetList().empty());
+  ASSERT_FALSE(encrypted_record_list->GetListDeprecated().empty());
   const auto* const seq_info =
-      encrypted_record_list->GetList().rbegin()->FindDictKey(
+      encrypted_record_list->GetListDeprecated().rbegin()->FindDictKey(
           "sequenceInformation");
   ASSERT_TRUE(seq_info != nullptr);
   ASSERT_TRUE(!seq_info->FindStringKey("sequencingId")->empty());
diff --git a/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc b/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc
index d7f0da0c..9b42555 100644
--- a/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/record_upload_request_builder_unittest.cc
@@ -113,14 +113,15 @@
       UploadEncryptedReportingRequestBuilder::GetEncryptedRecordListPath());
   ASSERT_TRUE(record_list);
   ASSERT_TRUE(record_list->is_list());
-  EXPECT_EQ(record_list->GetList().size(), records.size());
+  EXPECT_EQ(record_list->GetListDeprecated().size(), records.size());
 
   size_t counter = 0;
   for (auto record : records) {
     auto record_value_result =
         EncryptedRecordDictionaryBuilder(std::move(record)).Build();
     ASSERT_TRUE(record_value_result.has_value());
-    EXPECT_EQ(record_list->GetList()[counter++], record_value_result.value());
+    EXPECT_EQ(record_list->GetListDeprecated()[counter++],
+              record_value_result.value());
   }
 }
 
diff --git a/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc b/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc
index 9d9eb8db8..5d02786 100644
--- a/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/upload_client_unittest.cc
@@ -72,11 +72,11 @@
   const base::Value* const encrypted_record_list =
       request.value().FindListKey("encryptedRecord");
   EXPECT_TRUE(encrypted_record_list != nullptr);
-  EXPECT_FALSE(encrypted_record_list->GetList().empty());
+  EXPECT_FALSE(encrypted_record_list->GetListDeprecated().empty());
 
   // Retrieve and process sequence information
   const base::Value* seq_info =
-      encrypted_record_list->GetList().rbegin()->FindDictKey(
+      encrypted_record_list->GetListDeprecated().rbegin()->FindDictKey(
           "sequenceInformation");
   EXPECT_TRUE(seq_info != nullptr);
   response.SetPath("lastSucceedUploadedRecord", seq_info->Clone());
diff --git a/chrome/browser/policy/messaging_layer/upload/upload_provider_unittest.cc b/chrome/browser/policy/messaging_layer/upload/upload_provider_unittest.cc
index 670fd8c0..ff62339 100644
--- a/chrome/browser/policy/messaging_layer/upload/upload_provider_unittest.cc
+++ b/chrome/browser/policy/messaging_layer/upload/upload_provider_unittest.cc
@@ -55,11 +55,11 @@
   const base::Value* const encrypted_record_list =
       request.value().FindListKey("encryptedRecord");
   EXPECT_NE(encrypted_record_list, nullptr);
-  EXPECT_FALSE(encrypted_record_list->GetList().empty());
+  EXPECT_FALSE(encrypted_record_list->GetListDeprecated().empty());
 
   // Retrieve and process sequence information
   const base::Value* seq_info =
-      encrypted_record_list->GetList().rbegin()->FindDictKey(
+      encrypted_record_list->GetListDeprecated().rbegin()->FindDictKey(
           "sequenceInformation");
   EXPECT_TRUE(seq_info != nullptr);
   response.SetPath("lastSucceedUploadedRecord", seq_info->Clone());
diff --git a/chrome/browser/policy/networking/network_configuration_updater.cc b/chrome/browser/policy/networking/network_configuration_updater.cc
index 5ee2774..fe14dcf 100644
--- a/chrome/browser/policy/networking/network_configuration_updater.cc
+++ b/chrome/browser/policy/networking/network_configuration_updater.cc
@@ -214,7 +214,7 @@
 void NetworkConfigurationUpdater::
     MarkFieldsAsRecommendedForBackwardsCompatibility(
         base::Value* network_configs_onc) {
-  for (auto& network_config_onc : network_configs_onc->GetList()) {
+  for (auto& network_config_onc : network_configs_onc->GetListDeprecated()) {
     DCHECK(network_config_onc.is_dict());
     const std::string* type =
         network_config_onc.FindStringKey(::onc::network_config::kType);
diff --git a/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc b/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
index 237f2706..d4d7f47 100644
--- a/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
+++ b/chrome/browser/policy/networking/network_configuration_updater_ash_unittest.cc
@@ -275,10 +275,11 @@
       toplevel_onc->FindKey(onc::toplevel_config::kCertificates);
   ASSERT_TRUE(certs);
   ASSERT_TRUE(certs->is_list());
-  ASSERT_TRUE(certs->GetList().size() > client_certificate_index);
+  ASSERT_TRUE(certs->GetListDeprecated().size() > client_certificate_index);
 
   base::ListValue selected_certs;
-  selected_certs.Append(certs->GetList()[client_certificate_index].Clone());
+  selected_certs.Append(
+      certs->GetListDeprecated()[client_certificate_index].Clone());
 
   chromeos::onc::OncParsedCertificates parsed_selected_certs(selected_certs);
   ASSERT_FALSE(parsed_selected_certs.has_error());
@@ -455,7 +456,7 @@
       base::StringPiece guid,
       std::initializer_list<base::StringPiece> path,
       base::Value value) {
-    for (base::Value& network_config : network_configs->GetList()) {
+    for (base::Value& network_config : network_configs->GetListDeprecated()) {
       const base::Value* guid_value =
           network_config.FindKey(::onc::network_config::kGUID);
       if (!guid_value || guid_value->GetString() != guid)
diff --git a/chrome/browser/policy/networking/policy_cert_service_factory.cc b/chrome/browser/policy/networking/policy_cert_service_factory.cc
index 932d6635..756da11 100644
--- a/chrome/browser/policy/networking/policy_cert_service_factory.cc
+++ b/chrome/browser/policy/networking/policy_cert_service_factory.cc
@@ -113,7 +113,7 @@
     return false;
   }
 
-  if (base::Contains(list->GetList(), user_email_value)) {
+  if (base::Contains(list->GetListDeprecated(), user_email_value)) {
     profile->GetPrefs()->SetBoolean(prefs::kUsedPolicyCertificates, true);
     return PolicyCertServiceFactory::ClearUsedPolicyCertificates(user_email);
   }
diff --git a/chrome/browser/policy/networking/policy_cert_service_factory_ash_unittest.cc b/chrome/browser/policy/networking/policy_cert_service_factory_ash_unittest.cc
index 23c3dbc2..990f260 100644
--- a/chrome/browser/policy/networking/policy_cert_service_factory_ash_unittest.cc
+++ b/chrome/browser/policy/networking/policy_cert_service_factory_ash_unittest.cc
@@ -46,9 +46,10 @@
   }
 
   bool LocalStateContains(const char* value) {
-    return base::Contains(
-        local_state_.Get()->GetList(prefs::kUsedPolicyCertificates)->GetList(),
-        base::Value(value));
+    return base::Contains(local_state_.Get()
+                              ->GetList(prefs::kUsedPolicyCertificates)
+                              ->GetListDeprecated(),
+                          base::Value(value));
   }
 
  protected:
diff --git a/chrome/browser/policy/system_features_disable_list_policy_handler.cc b/chrome/browser/policy/system_features_disable_list_policy_handler.cc
index ab0a5dd..05fc20c5 100644
--- a/chrome/browser/policy/system_features_disable_list_policy_handler.cc
+++ b/chrome/browser/policy/system_features_disable_list_policy_handler.cc
@@ -68,7 +68,7 @@
     return false;
 
   const auto disabled_system_features =
-      disabled_system_features_pref->GetList();
+      disabled_system_features_pref->GetListDeprecated();
   return base::Contains(disabled_system_features, base::Value(feature));
 }
 
@@ -86,7 +86,7 @@
     enums_list.Append(feature);
 
     if (!old_list ||
-        !base::Contains(old_list->GetList(), base::Value(feature))) {
+        !base::Contains(old_list->GetListDeprecated(), base::Value(feature))) {
       base::UmaHistogramEnumeration(kSystemFeaturesDisableListHistogram,
                                     feature);
     }
diff --git a/chrome/browser/policy/test/component_updater_policy_browsertest.cc b/chrome/browser/policy/test/component_updater_policy_browsertest.cc
index ce943bf..eb64a3e 100644
--- a/chrome/browser/policy/test/component_updater_policy_browsertest.cc
+++ b/chrome/browser/policy/test/component_updater_policy_browsertest.cc
@@ -236,9 +236,10 @@
                               base::CompareCase::SENSITIVE)) {
     const auto root = base::JSONReader::Read(request);
     ASSERT_TRUE(root);
-    const auto* update_check =
-        root->FindKey("request")->FindKey("app")->GetList()[0].FindKey(
-            "updatecheck");
+    const auto* update_check = root->FindKey("request")
+                                   ->FindKey("app")
+                                   ->GetListDeprecated()[0]
+                                   .FindKey("updatecheck");
     ASSERT_TRUE(update_check);
     if (update_disabled) {
       EXPECT_EQ(true, update_check->FindKey("updatedisabled")->GetBool());
diff --git a/chrome/browser/policy/test/ssl_error_overriding_allowed_policy_browsertest.cc b/chrome/browser/policy/test/ssl_error_overriding_allowed_policy_browsertest.cc
index e5e46d8..13301d98a 100644
--- a/chrome/browser/policy/test/ssl_error_overriding_allowed_policy_browsertest.cc
+++ b/chrome/browser/policy/test/ssl_error_overriding_allowed_policy_browsertest.cc
@@ -52,7 +52,7 @@
   // default.
   EXPECT_TRUE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_TRUE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .empty());
 
   // Policy allows overriding - navigate to an SSL error page and expect the
@@ -83,7 +83,7 @@
   // default.
   EXPECT_TRUE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_TRUE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .empty());
 
   // Add a policy to allow overriding on specific sites only. Since
@@ -98,7 +98,7 @@
 
   // Policy should be set.
   EXPECT_FALSE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                   ->GetList()
+                   ->GetListDeprecated()
                    .empty());
 
   // Policy allows overriding - navigate to an SSL error page and expect the
@@ -170,7 +170,7 @@
   // default.
   EXPECT_TRUE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_TRUE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .empty());
 
   // Disallowing the proceed link by setting the policy to |false|.
@@ -189,7 +189,7 @@
   // Policy should be set.
   EXPECT_FALSE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_FALSE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                   ->GetList()
+                   ->GetListDeprecated()
                    .empty());
 
   // Policy disallows overriding - navigate to an SSL error page and expect no
@@ -223,7 +223,7 @@
       chrome_test_utils::GetProfile(this)->GetPrefs();
   EXPECT_TRUE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_TRUE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .empty());
 
   // Disallowing the proceed link by setting the policy to |false|.
@@ -243,7 +243,7 @@
   // Policy should not allow overriding.
   EXPECT_FALSE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_FALSE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                   ->GetList()
+                   ->GetListDeprecated()
                    .empty());
 
   // Policy disallows overriding - navigate to an SSL error page and expect no
@@ -276,7 +276,7 @@
       chrome_test_utils::GetProfile(this)->GetPrefs();
   EXPECT_TRUE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_TRUE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .empty());
 
   // Disallowing the proceed link by setting the policy to |false|.
@@ -294,7 +294,7 @@
   // Policy should not allow overriding.
   EXPECT_FALSE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_TRUE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .empty());
 
   // Policy disallows overriding - navigate to an SSL error page and expect no
@@ -331,7 +331,7 @@
   // default.
   EXPECT_TRUE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_TRUE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .empty());
 
   // Disallowing the proceed link by setting the policy to |false|.
@@ -351,7 +351,7 @@
   // Policy should be set.
   EXPECT_FALSE(prefs->GetBoolean(prefs::kSSLErrorOverrideAllowed));
   EXPECT_FALSE(prefs->GetList(prefs::kSSLErrorOverrideAllowedForOrigins)
-                   ->GetList()
+                   ->GetListDeprecated()
                    .empty());
 
   // Policy allows overriding - navigate to an SSL error page and expect the
diff --git a/chrome/browser/policy/test/url_blocklist_policy_browsertest.cc b/chrome/browser/policy/test/url_blocklist_policy_browsertest.cc
index 48aa5f5..1cd1228f 100644
--- a/chrome/browser/policy/test/url_blocklist_policy_browsertest.cc
+++ b/chrome/browser/policy/test/url_blocklist_policy_browsertest.cc
@@ -422,9 +422,9 @@
   FlushBlocklistPolicy();
 
   PrefService* prefs = browser()->profile()->GetPrefs();
-  EXPECT_FALSE(
-      base::Contains(prefs->GetList(policy_prefs::kUrlBlocklist)->GetList(),
-                     base::Value("file://*")));
+  EXPECT_FALSE(base::Contains(
+      prefs->GetList(policy_prefs::kUrlBlocklist)->GetListDeprecated(),
+      base::Value("file://*")));
 
   base::ListValue disabledscheme;
   disabledscheme.Append("file");
@@ -433,9 +433,9 @@
   UpdateProviderPolicy(policies);
   FlushBlocklistPolicy();
 
-  EXPECT_TRUE(
-      base::Contains(prefs->GetList(policy_prefs::kUrlBlocklist)->GetList(),
-                     base::Value("file://*")));
+  EXPECT_TRUE(base::Contains(
+      prefs->GetList(policy_prefs::kUrlBlocklist)->GetListDeprecated(),
+      base::Value("file://*")));
 
   // Allowlist one folder and blocklist an another just inside.
   base::ListValue allowlist;
diff --git a/chrome/browser/policy/test/web_rtc_local_ips_allowed_urls_policy_browsertest.cc b/chrome/browser/policy/test/web_rtc_local_ips_allowed_urls_policy_browsertest.cc
index f46baa8..69185b97 100644
--- a/chrome/browser/policy/test/web_rtc_local_ips_allowed_urls_policy_browsertest.cc
+++ b/chrome/browser/policy/test/web_rtc_local_ips_allowed_urls_policy_browsertest.cc
@@ -48,7 +48,8 @@
       user_prefs::UserPrefs::Get(browser()->profile())
           ->FindPreference(prefs::kWebRtcLocalIpsAllowedUrls);
   EXPECT_TRUE(pref->IsManaged());
-  base::Value::ConstListView allowed_urls = pref->GetValue()->GetList();
+  base::Value::ConstListView allowed_urls =
+      pref->GetValue()->GetListDeprecated();
   const auto& expected_urls = GenerateUrlList();
   EXPECT_EQ(expected_urls.size(), allowed_urls.size());
   for (const auto& allowed_url : allowed_urls) {
diff --git a/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc b/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc
index 764fa77..8b92264 100644
--- a/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc
+++ b/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler.cc
@@ -63,14 +63,14 @@
     return result;
 
   int item_index = 0;
-  for (const auto& item : value->GetList()) {
+  for (const auto& item : value->GetListDeprecated()) {
     // The vendor and product ID descriptors of a USB devices should be
     // unsigned short integers.
     int device_index = 0;
     auto* devices_list =
         item.FindKeyOfType(kDevicesKey, base::Value::Type::LIST);
     DCHECK(devices_list);
-    for (const auto& device : devices_list->GetList()) {
+    for (const auto& device : devices_list->GetListDeprecated()) {
       auto* vendor_id_value =
           device.FindKeyOfType(kVendorIdKey, base::Value::Type::INTEGER);
       auto* product_id_value =
@@ -93,7 +93,7 @@
     int url_index = 0;
     auto* urls_list = item.FindKeyOfType(kUrlsKey, base::Value::Type::LIST);
     DCHECK(urls_list);
-    for (const auto& url_value : urls_list->GetList()) {
+    for (const auto& url_value : urls_list->GetListDeprecated()) {
       const std::string url_error_path = base::StringPrintf(
           kErrorPathTemplate, item_index, kUrlsKey, url_index);
 
diff --git a/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler_unittest.cc b/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler_unittest.cc
index 07dbb49..69021a6 100644
--- a/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler_unittest.cc
+++ b/chrome/browser/policy/webusb_allow_devices_for_urls_policy_handler_unittest.cc
@@ -487,14 +487,14 @@
   ASSERT_TRUE(pref_value->is_list());
 
   // Ensure that the kManagedWebUsbAllowDevicesForUrls pref is set correctly.
-  const auto& list = pref_value->GetList();
+  const auto& list = pref_value->GetListDeprecated();
   ASSERT_EQ(2ul, list.size());
 
   // Check the first item's devices list.
   const base::Value* devices = list[0].FindKey(kDevicesKey);
   ASSERT_TRUE(devices);
 
-  const auto& first_devices_list = devices->GetList();
+  const auto& first_devices_list = devices->GetListDeprecated();
   ASSERT_EQ(2ul, first_devices_list.size());
 
   const base::Value* vendor_id = first_devices_list[0].FindKey(kVendorIdKey);
@@ -516,7 +516,7 @@
   const base::Value* urls = list[0].FindKey(kUrlsKey);
   ASSERT_TRUE(urls);
 
-  const auto& first_urls_list = urls->GetList();
+  const auto& first_urls_list = urls->GetListDeprecated();
   ASSERT_EQ(2ul, first_urls_list.size());
   ASSERT_TRUE(first_urls_list[0].is_string());
   ASSERT_TRUE(first_urls_list[1].is_string());
@@ -528,7 +528,7 @@
   devices = list[1].FindKey(kDevicesKey);
   ASSERT_TRUE(devices);
 
-  const auto& second_devices_list = devices->GetList();
+  const auto& second_devices_list = devices->GetListDeprecated();
   ASSERT_EQ(1ul, second_devices_list.size());
 
   vendor_id = second_devices_list[0].FindKey(kVendorIdKey);
@@ -541,7 +541,7 @@
   urls = list[1].FindKey(kUrlsKey);
   ASSERT_TRUE(urls);
 
-  const auto& second_urls_list = urls->GetList();
+  const auto& second_urls_list = urls->GetListDeprecated();
   ASSERT_EQ(1ul, second_urls_list.size());
   ASSERT_TRUE(second_urls_list[0].is_string());
   EXPECT_EQ("https://chromium.org,", second_urls_list[0].GetString());
diff --git a/chrome/browser/predictors/autocomplete_action_predictor.cc b/chrome/browser/predictors/autocomplete_action_predictor.cc
index 0e9e8b1..e084332 100644
--- a/chrome/browser/predictors/autocomplete_action_predictor.cc
+++ b/chrome/browser/predictors/autocomplete_action_predictor.cc
@@ -31,6 +31,7 @@
 #include "components/omnibox/browser/autocomplete_result.h"
 #include "components/omnibox/browser/omnibox_log.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/web_contents_delegate.h"
 
 namespace {
 
@@ -193,10 +194,12 @@
   if (prerender_utils::IsDirectUrlInputPrerenderEnabled()) {
     // Check whether preloading is enabled. If users disable this
     // setting, it means users do not want to preload pages.
-    // TODO(https://crbug.com/1269204): Move this check into
-    // WebContentsDelegate::IsPrerender2Supported after exposing TriggerType to
-    // embedders.
-    if (!prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs())) {
+    // TODO(https://crbug.com/1292422): Move this check into
+    // content::PrerenderHostRegistry::CreateAndStartHost().
+    content::WebContentsDelegate* web_contents_delegate =
+        web_contents.GetDelegate();
+    if (!web_contents_delegate ||
+        !web_contents_delegate->IsPrerender2Supported(web_contents)) {
       return;
     }
 
diff --git a/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc
index 3d94375..1f51f22 100644
--- a/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc
+++ b/chrome/browser/prefetch/no_state_prefetch/prerender_nostate_prefetch_browsertest.cc
@@ -367,7 +367,7 @@
     base::ListValue* history_list;
     if (!prerender_dict->GetList("history", &history_list))
       return std::numeric_limits<size_t>::max();
-    return history_list->GetList().size();
+    return history_list->GetListDeprecated().size();
   }
 
   // Clears the specified data using BrowsingDataRemover.
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc
index 7b1d6440..359e2c4 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_params.cc
@@ -277,7 +277,7 @@
 bool PrefetchProxyAllowAllDomainsForExtendedPreloading() {
   return base::GetFieldTrialParamByFeatureAsBool(
       features::kIsolatePrerenders, "allow_all_domains_for_extended_preloading",
-      true);
+      false);
 }
 
 base::TimeDelta PrefetchProxyCacheableDuration() {
diff --git a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
index 346839e..5f8e2b2a 100644
--- a/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
+++ b/chrome/browser/prefetch/prefetch_proxy/prefetch_proxy_tab_helper_unittest.cc
@@ -2127,7 +2127,9 @@
  public:
   PrefetchProxyTabHelperSpeculationRulesTest() {
     scoped_feature_list_.InitAndEnableFeatureWithParameters(
-        features::kIsolatePrerenders, {{"use_speculation_rules", "true"}});
+        features::kIsolatePrerenders,
+        {{"use_speculation_rules", "true"},
+         {"allow_all_domains_for_extended_preloading", "true"}});
   }
 };
 
diff --git a/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc b/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc
index 7f80ffb..b2803fc 100644
--- a/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc
+++ b/chrome/browser/prefs/chrome_command_line_pref_store_unittest.cc
@@ -52,9 +52,9 @@
     const base::Value* value = nullptr;
     ASSERT_TRUE(GetValue(prefs::kCipherSuiteBlacklist, &value));
     ASSERT_TRUE(value->is_list());
-    ASSERT_EQ(cipher_count, value->GetList().size());
+    ASSERT_EQ(cipher_count, value->GetListDeprecated().size());
 
-    for (const base::Value& cipher_string : value->GetList()) {
+    for (const base::Value& cipher_string : value->GetListDeprecated()) {
       ASSERT_TRUE(cipher_string.is_string());
       EXPECT_EQ(*ciphers++, cipher_string.GetString());
     }
@@ -237,10 +237,10 @@
   ASSERT_TRUE(store->GetValue(prefs::kExplicitlyAllowedNetworkPorts, &value));
   ASSERT_TRUE(value);
   ASSERT_TRUE(value->is_list());
-  ASSERT_EQ(base::size(kExpectedPorts), value->GetList().size());
+  ASSERT_EQ(base::size(kExpectedPorts), value->GetListDeprecated().size());
 
   int i = 0;
-  for (const base::Value& port : value->GetList()) {
+  for (const base::Value& port : value->GetListDeprecated()) {
     ASSERT_TRUE(port.is_int());
     EXPECT_EQ(kExpectedPorts[i], port.GetInt());
     ++i;
diff --git a/chrome/browser/prefs/pref_metrics_service.cc b/chrome/browser/prefs/pref_metrics_service.cc
index b9b3e4c8..05358e5 100644
--- a/chrome/browser/prefs/pref_metrics_service.cc
+++ b/chrome/browser/prefs/pref_metrics_service.cc
@@ -80,7 +80,7 @@
     const base::Value* url_list =
         prefs_->GetList(prefs::kURLsToRestoreOnStartup);
     // Similarly, check startup pages for known search engine TLD+1s.
-    for (const base::Value& i : url_list->GetList()) {
+    for (const base::Value& i : url_list->GetListDeprecated()) {
       const std::string* url_text = i.GetIfString();
       if (url_text) {
         GURL start_url(*url_text);
diff --git a/chrome/browser/prefs/session_startup_pref.cc b/chrome/browser/prefs/session_startup_pref.cc
index b1a6b0d..589004e 100644
--- a/chrome/browser/prefs/session_startup_pref.cc
+++ b/chrome/browser/prefs/session_startup_pref.cc
@@ -40,7 +40,7 @@
 
 void URLListToPref(const base::Value* url_list, SessionStartupPref* pref) {
   pref->urls.clear();
-  for (const base::Value& i : url_list->GetList()) {
+  for (const base::Value& i : url_list->GetListDeprecated()) {
     const std::string* url_text = i.GetIfString();
     if (url_text) {
       GURL fixed_url = url_formatter::FixupURL(*url_text, std::string());
diff --git a/chrome/browser/prefs/tracked/pref_hash_browsertest.cc b/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
index b6550e0d..3237146 100644
--- a/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
+++ b/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
@@ -758,7 +758,7 @@
     EXPECT_TRUE(
         selected_prefs->GetList(prefs::kURLsToRestoreOnStartup, &startup_urls));
     EXPECT_TRUE(startup_urls);
-    EXPECT_EQ(1U, startup_urls->GetList().size());
+    EXPECT_EQ(1U, startup_urls->GetListDeprecated().size());
     startup_urls->Append("http://example.org");
   }
 
@@ -795,7 +795,7 @@
               profile()
                   ->GetPrefs()
                   ->GetList(prefs::kURLsToRestoreOnStartup)
-                  ->GetList()
+                  ->GetListDeprecated()
                   .size());
 #endif
 
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index 4c98263d..71784e09 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -9,9 +9,12 @@
 #include "base/path_service.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
+#include "chrome/browser/prefetch/prefetch_prefs.h"
 #include "chrome/browser/prerender/prerender_utils.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/chrome_test_utils.h"
+#include "components/prefs/pref_service.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/prerender_test_util.h"
@@ -170,4 +173,43 @@
       blink::mojom::WebFeature::kSpeculationRulesPrerender, 1);
 }
 
+// Tests that Prerender2 cannot be triggered when preload setting is disabled.
+IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, DisableNetworkPrediction) {
+  // Navigate to an initial page.
+  GURL url = embedded_test_server()->GetURL("/empty.html");
+  ASSERT_TRUE(content::NavigateToURL(GetActiveWebContents(), url));
+
+  // Disable network prediction.
+  PrefService* prefs = chrome_test_utils::GetProfile(this)->GetPrefs();
+  prefetch::SetPreloadPagesState(prefs,
+                                 prefetch::PreloadPagesState::kNoPreloading);
+  ASSERT_FALSE(prefetch::IsSomePreloadingEnabled(*prefs));
+
+  // Attempt to trigger prerendering.
+  GURL prerender_url = embedded_test_server()->GetURL("/simple.html?1");
+  prerender_helper().AddPrerenderAsync(prerender_url);
+  // Since preload setting is disabled, prerender shouldn't be triggered.
+  base::RunLoop().RunUntilIdle();
+  int host_id = prerender_helper().GetHostForUrl(prerender_url);
+  EXPECT_EQ(host_id, content::RenderFrameHost::kNoFrameTreeNodeId);
+
+  // Reload the initial page to reset the speculation rules.
+  ASSERT_TRUE(content::NavigateToURL(GetActiveWebContents(), url));
+
+  // Re-enable the setting.
+  prefetch::SetPreloadPagesState(
+      prefs, prefetch::PreloadPagesState::kStandardPreloading);
+  ASSERT_TRUE(prefetch::IsSomePreloadingEnabled(*prefs));
+
+  // Attempt to trigger prerendering again.
+  content::test::PrerenderHostRegistryObserver registry_observer(
+      *GetActiveWebContents());
+  prerender_helper().AddPrerenderAsync(prerender_url);
+  // Since preload setting is enabled, prerender should be triggered
+  // successfully.
+  registry_observer.WaitForTrigger(prerender_url);
+  host_id = prerender_helper().GetHostForUrl(prerender_url);
+  EXPECT_NE(host_id, content::RenderFrameHost::kNoFrameTreeNodeId);
+}
+
 }  // namespace
diff --git a/chrome/browser/prerender/prerender_manager.cc b/chrome/browser/prerender/prerender_manager.cc
index d235bba0..3cbdfe35 100644
--- a/chrome/browser/prerender/prerender_manager.cc
+++ b/chrome/browser/prerender/prerender_manager.cc
@@ -58,7 +58,7 @@
       *(match.search_terms_args);
   std::u16string search_terms = search_terms_args.search_terms;
 
-  // Do not re-prerender the same saerch result.
+  // Do not re-prerender the same search result.
   if (search_prerender_handle_ && prerendered_search_terms_ == search_terms) {
     return;
   }
diff --git a/chrome/browser/printing/print_preview_sticky_settings.cc b/chrome/browser/printing/print_preview_sticky_settings.cc
index 1420bb0..1f47377b 100644
--- a/chrome/browser/printing/print_preview_sticky_settings.cc
+++ b/chrome/browser/printing/print_preview_sticky_settings.cc
@@ -82,8 +82,9 @@
     return {};
 
   std::vector<std::string> printers;
-  printers.reserve(recent_destinations->GetList().size());
-  for (const auto& recent_destination : recent_destinations->GetList()) {
+  printers.reserve(recent_destinations->GetListDeprecated().size());
+  for (const auto& recent_destination :
+       recent_destinations->GetListDeprecated()) {
     const std::string* printer_id = recent_destination.FindStringKey(kId);
     if (!printer_id)
       continue;
diff --git a/chrome/browser/profile_resetter/brandcoded_default_settings.cc b/chrome/browser/profile_resetter/brandcoded_default_settings.cc
index 466d354..b020a171 100644
--- a/chrome/browser/profile_resetter/brandcoded_default_settings.cc
+++ b/chrome/browser/profile_resetter/brandcoded_default_settings.cc
@@ -101,7 +101,7 @@
     const char* pref_name) const {
   const base::ListValue* value = nullptr;
   if (master_dictionary_ && master_dictionary_->GetList(pref_name, &value) &&
-      !value->GetList().empty()) {
+      !value->GetListDeprecated().empty()) {
     return base::ListValue::From(base::Value::ToUniquePtrValue(value->Clone()));
   }
   return nullptr;
diff --git a/chrome/browser/profile_resetter/profile_resetter_unittest.cc b/chrome/browser/profile_resetter/profile_resetter_unittest.cc
index ee0dacf..4f0281c 100644
--- a/chrome/browser/profile_resetter/profile_resetter_unittest.cc
+++ b/chrome/browser/profile_resetter/profile_resetter_unittest.cc
@@ -792,7 +792,7 @@
       settings->GetUrlsToRestoreOnStartup());
   EXPECT_TRUE(startup_list);
   std::vector<std::string> startup_pages;
-  for (const auto& entry : startup_list->GetList()) {
+  for (const auto& entry : startup_list->GetListDeprecated()) {
     std::string url_str;
     EXPECT_TRUE(entry.GetAsString(&url_str));
     startup_pages.push_back(url_str);
@@ -988,8 +988,8 @@
   ASSERT_TRUE(list);
   bool checked_extensions = false;
   bool checked_shortcuts = false;
-  for (size_t i = 0; i < list->GetList().size(); ++i) {
-    const base::Value& dict = list->GetList()[i];
+  for (size_t i = 0; i < list->GetListDeprecated().size(); ++i) {
+    const base::Value& dict = list->GetListDeprecated()[i];
     ASSERT_TRUE(dict.is_dict());
     const std::string* value = dict.FindStringKey("key");
     ASSERT_TRUE(value);
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 6447763..83c8813b 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -1209,7 +1209,7 @@
       local_state->GetList(prefs::kProfilesDeleted);
   DCHECK(deleted_profiles);
 
-  for (const base::Value& value : deleted_profiles->GetList()) {
+  for (const base::Value& value : deleted_profiles->GetListDeprecated()) {
     absl::optional<base::FilePath> profile_path = base::ValueToFilePath(value);
     // Although it should never happen, make sure this is a valid path in the
     // user_data_dir, so we don't accidentally delete something else.
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc
index a834768..72814dc 100644
--- a/chrome/browser/profiles/profile_manager_unittest.cc
+++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -1563,9 +1563,10 @@
   EXPECT_TRUE(base::DirectoryExists(path2));
   EXPECT_EQ(profile_name2, local_state->GetString(prefs::kProfileLastUsed));
   ASSERT_EQ(1u, storage.GetNumberOfProfiles());
-  ASSERT_EQ(1u, final_last_active_profile_list->GetList().size());
-  ASSERT_EQ(path2.BaseName().MaybeAsASCII(),
-            (final_last_active_profile_list->GetList())[0].GetString());
+  ASSERT_EQ(1u, final_last_active_profile_list->GetListDeprecated().size());
+  ASSERT_EQ(
+      path2.BaseName().MaybeAsASCII(),
+      (final_last_active_profile_list->GetListDeprecated())[0].GetString());
 
   // Mark the remaining profile ephemeral and clean up.
   storage.GetAllProfilesAttributes()[0]->SetIsEphemeral(true);
@@ -1576,7 +1577,7 @@
   EXPECT_FALSE(base::DirectoryExists(path2));
   EXPECT_EQ(0u, storage.GetNumberOfProfiles());
   EXPECT_EQ("Profile 1", local_state->GetString(prefs::kProfileLastUsed));
-  ASSERT_EQ(0u, final_last_active_profile_list->GetList().size());
+  ASSERT_EQ(0u, final_last_active_profile_list->GetListDeprecated().size());
 }
 
 TEST_F(ProfileManagerGuestTest, CleanUpOnlyEphemeralProfiles) {
@@ -1633,9 +1634,10 @@
   EXPECT_EQ(guest_profile_name,
             local_state->GetString(prefs::kProfileLastUsed));
   ASSERT_EQ(1u, storage.GetNumberOfProfiles());
-  ASSERT_EQ(2u, final_last_active_profile_list->GetList().size());
-  ASSERT_EQ(guest_path.BaseName().MaybeAsASCII(),
-            (final_last_active_profile_list->GetList())[0].GetString());
+  ASSERT_EQ(2u, final_last_active_profile_list->GetListDeprecated().size());
+  ASSERT_EQ(
+      guest_path.BaseName().MaybeAsASCII(),
+      (final_last_active_profile_list->GetListDeprecated())[0].GetString());
 }
 
 TEST_F(ProfileManagerTest, CleanUpEphemeralProfilesWithGuestLastUsedProfile) {
diff --git a/chrome/browser/renderer_preferences_util.cc b/chrome/browser/renderer_preferences_util.cc
index c8f918a..98be42418 100644
--- a/chrome/browser/renderer_preferences_util.cc
+++ b/chrome/browser/renderer_preferences_util.cc
@@ -86,7 +86,7 @@
     const base::Value* allowed_urls) {
   std::vector<std::string> ret;
   if (allowed_urls) {
-    const auto& urls = allowed_urls->GetList();
+    const auto& urls = allowed_urls->GetListDeprecated();
     for (const auto& url : urls)
       ret.push_back(url.GetString());
   }
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index 5d73e76..cafb3bb 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -81,7 +81,7 @@
     public_deps += [ "browser_switch:resources" ]
   }
 
-  if (is_win || is_mac || is_linux) {
+  if (is_win || is_mac || is_linux || is_fuchsia) {
     public_deps += [ "app_settings:resources" ]
   }
 
diff --git a/chrome/browser/resources/access_code_cast/access_code_cast.html b/chrome/browser/resources/access_code_cast/access_code_cast.html
index bcfdcd4..8cfb7e0f 100644
--- a/chrome/browser/resources/access_code_cast/access_code_cast.html
+++ b/chrome/browser/resources/access_code_cast/access_code_cast.html
@@ -17,7 +17,7 @@
   }
 
   .space {
-    height: 48px;
+    height: 32px;
   }
 
   .text-button:not(:focus) {
@@ -67,7 +67,7 @@
     <cr-button on-click="close" class="cancel-button">$i18n{close}</cr-button>
     <cr-button id="castButton" on-click="addSinkAndCast" class="action-button"
       disabled="[[castButtonDisabled(accessCode, canCast)]]">
-      $i18n{cast}
+      $i18n{submit}
     </cr-button>
     <cr-button id="backButton" on-click="switchToCodeInput"
       class="action-button">
diff --git a/chrome/browser/resources/access_code_cast/access_code_cast.ts b/chrome/browser/resources/access_code_cast/access_code_cast.ts
index de16ddf..b9533ab 100644
--- a/chrome/browser/resources/access_code_cast/access_code_cast.ts
+++ b/chrome/browser/resources/access_code_cast/access_code_cast.ts
@@ -125,6 +125,7 @@
     }
 
     this.canCast = false;
+    this.$.errorMessage.setNoError();
 
     const method = this.state === PageState.CODE_INPUT ? 
       CastDiscoveryMethod.INPUT_ACCESS_CODE : CastDiscoveryMethod.QR_CODE;
diff --git a/chrome/browser/resources/access_code_cast/error_message/error_message.html b/chrome/browser/resources/access_code_cast/error_message/error_message.html
index 3590072..21d17763 100644
--- a/chrome/browser/resources/access_code_cast/error_message/error_message.html
+++ b/chrome/browser/resources/access_code_cast/error_message/error_message.html
@@ -1,20 +1,13 @@
 <style include="cr-shared-style">
   .error {
     color: var(--google-red-600);
-    padding-top: 16px;
-  }
-
-  .error > iron-icon {
-    --iron-icon-height: 16px;
-    --iron-icon-width: 16px;
+    text-align: center;
   }
 </style>
 <div class="error">
   <template is="dom-if"
     if="[[isNotEqual(messageCode, errorMessageEnum.NO_ERROR)]]"
   >
-    <iron-icon class="button-image" icon="cr:error-outline" size="16">
-    </iron-icon>
     <template is="dom-if" if="[[isEqual(messageCode, errorMessageEnum.GENERIC)]]">
       $i18n{errorUnknown}
     </template>
diff --git a/chrome/browser/resources/access_code_cast/error_message/error_message.ts b/chrome/browser/resources/access_code_cast/error_message/error_message.ts
index 09457057d..255dc544 100644
--- a/chrome/browser/resources/access_code_cast/error_message/error_message.ts
+++ b/chrome/browser/resources/access_code_cast/error_message/error_message.ts
@@ -4,7 +4,6 @@
 
 import 'chrome://resources/cr_elements/icons.m.js';
 import 'chrome://resources/cr_elements/shared_vars_css.m.js';
-import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/app_settings/BUILD.gn b/chrome/browser/resources/app_settings/BUILD.gn
index bda63f1..08a069af 100644
--- a/chrome/browser/resources/app_settings/BUILD.gn
+++ b/chrome/browser/resources/app_settings/BUILD.gn
@@ -9,7 +9,7 @@
 import("//tools/typescript/ts_library.gni")
 import("//ui/webui/resources/tools/generate_grd.gni")
 
-assert(is_win || is_mac || is_linux)
+assert(is_win || is_mac || is_linux || is_fuchsia)
 preprocess_folder = "preprocessed"
 resources_grd_file = "$target_gen_dir/resources.grd"
 
@@ -32,6 +32,7 @@
 ts_library("build_ts") {
   root_dir = "$target_gen_dir/$preprocess_folder"
   out_dir = "$target_gen_dir/tsc"
+  composite = true
   tsconfig_base = "tsconfig_base.json"
   in_files = web_component_files + [ "app_management.mojom-webui.js" ]
   deps = [
diff --git a/chrome/browser/resources/app_settings/app.html b/chrome/browser/resources/app_settings/app.html
index cc55854..a21af22d 100644
--- a/chrome/browser/resources/app_settings/app.html
+++ b/chrome/browser/resources/app_settings/app.html
@@ -41,24 +41,25 @@
         <div class="header-text">$i18n{appManagementPermissionsLabel}</div>
       </div>
       <div class="permission-list indented-permission-block">
-        <app-management-permission-item
-            class="subpermission-row" icon="app-management:location"
-            app="[[app_]]"
+        <app-management-permission-item class="subpermission-row"
+            icon="app-management:location" app="[[app_]]"
             permission-label="$i18n{appManagementLocationPermissionLabel}"
             permission-type="kLocation">
         </app-management-permission-item>
         <app-management-permission-item class="subpermission-row"
-            icon="app-management:camera"
-            app="[[app_]]"
+            icon="app-management:camera" app="[[app_]]"
             permission-label="$i18n{appManagementCameraPermissionLabel}"
             permission-type="kCamera">
         </app-management-permission-item>
-        <app-management-permission-item
-            class="subpermission-row" icon="app-management:microphone"
-            app="[[app_]]"
+        <app-management-permission-item class="subpermission-row"
+            icon="app-management:microphone" app="[[app_]]"
             permission-label="$i18n{appManagementMicrophonePermissionLabel}"
             permission-type="kMicrophone">
         </app-management-permission-item>
       </div>
   </div>
+  <app-management-more-permissions-item
+      class="permission-card-row separated-row" app="[[app_]]"
+      more-permissions-label="$i18n{appManagementMorePermissionsLabel}">
+  </app-management-more-permissions-item>
 </div>
diff --git a/chrome/browser/resources/app_settings/app.ts b/chrome/browser/resources/app_settings/app.ts
index 236e589..55284f6 100644
--- a/chrome/browser/resources/app_settings/app.ts
+++ b/chrome/browser/resources/app_settings/app.ts
@@ -4,6 +4,7 @@
 
 import './strings.m.js';
 import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js';
+import 'chrome://resources/cr_components/app_management/more_permissions_item.js';
 import 'chrome://resources/cr_components/app_management/permission_item.js';
 import 'chrome://resources/cr_components/app_management/icons.js';
 
@@ -30,7 +31,6 @@
     };
   }
 
-  private appId_: string;
   private app_: App|null;
   private iconUrl_: string;
   private showSearch_: boolean;
@@ -62,4 +62,10 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    'web-app-settings-app': WebAppSettingsAppElement;
+  }
+}
+
 customElements.define(WebAppSettingsAppElement.is, WebAppSettingsAppElement);
diff --git a/chrome/browser/resources/app_settings/web_app_settings.ts b/chrome/browser/resources/app_settings/web_app_settings.ts
index 55129175..0e62592 100644
--- a/chrome/browser/resources/app_settings/web_app_settings.ts
+++ b/chrome/browser/resources/app_settings/web_app_settings.ts
@@ -3,3 +3,5 @@
 // found in the LICENSE file.
 
 import './app.js';
+
+export {WebAppSettingsAppElement} from './app.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js
index 1b6be50..3c6cccb 100644
--- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js
+++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation.js
@@ -488,7 +488,7 @@
     MetricsUtils.recordMacroFailed(macro);
 
     this.interimText_ = '';
-    // TODO(crbug.com/1252037): Finalize string and internationalization.
+    // TODO(crbug.com/1288964): Finalize string and internationalization.
     this.inputController_.showBubble({
       icon: IconType.MACRO_FAIL,
       text: `Failed to run command: ${transcript}`
diff --git a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js
index 57458eb..900e805 100644
--- a/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/accessibility_common/dictation/dictation_test.js
@@ -359,7 +359,6 @@
         this.mockSpeechRecognitionPrivate.fireMockOnResultEvent(command, false);
         // Nothing is added to composition text when commands UI is enabled.
         assertFalse(!!this.mockInputIme.getLastCompositionParameters());
-        // TODO(crbug.com/1252037): Check UI shows correct command info.
 
         if (command !== this.commandStrings.LIST_COMMANDS) {
           // LIST_COMMANDS opens a new tab and ends Dictation. Skip this.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
index ddfc89b5..de89ef40 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_line.js
@@ -632,15 +632,21 @@
     // ancestors of line nodes.
     const isLineBreakingSpace = this.text === '\u00a0';
 
-    let prev = (prevLine && prevLine.startContainer_.role) ?
+    const prev = (prevLine && prevLine.startContainer_.role) ?
         prevLine.startContainer_ :
         null;
     const lineNodes =
         /** @type {Array<!AutomationNode>} */ (this.value_.getSpansInstanceOf(
             /** @type {function()} */ (this.startContainer_.constructor)));
-    for (let i = 0, cur; cur = lineNodes[i]; i++) {
+    const speakNodeAtIndex = (index, prev) => {
+      const cur = lineNodes[index];
+      if (!cur) {
+        return;
+      }
+
       if (cur.children.length) {
-        continue;
+        speakNodeAtIndex(++index, cur);
+        return;
       }
 
       const o = new Output();
@@ -651,17 +657,23 @@
       }
 
       o.withRichSpeech(
-          Range.fromNode(cur),
-          prev ? Range.fromNode(prev) : Range.fromNode(cur),
-          OutputEventType.NAVIGATE);
+           Range.fromNode(cur),
+           prev ? Range.fromNode(prev) : Range.fromNode(cur),
+           OutputEventType.NAVIGATE)
+          .onSpeechEnd(() => {
+            speakNodeAtIndex(++index, cur);
+          });
 
       // Ignore whitespace only output except if it is leading content on the
       // line.
-      if (!o.isOnlyWhitespace || i === 0) {
+      if (!o.isOnlyWhitespace || index === 0) {
         o.go();
+      } else {
+        speakNodeAtIndex(++index, cur);
       }
-      prev = cur;
-    }
+    };
+
+    speakNodeAtIndex(0, prev);
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
index e07ad4aa..dc23d8e 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editing_test.js
@@ -1689,7 +1689,7 @@
     await this.focusFirstTextField(root);
 
     mockFeedback.call(this.press(KeyCode.DOWN))
-        .expectSpeech(' typing')
+        .expectSpeech('I ')
         // Move forward through line.
         .call(this.press(KeyCode.RIGHT))
         .expectSpeech(' ')
@@ -1738,7 +1738,7 @@
     await this.focusFirstTextField(root);
 
     mockFeedback.call(this.press(KeyCode.DOWN))
-        .expectSpeech(' typing')
+        .expectSpeech('I ')
         // Move forward through line.
         .call(this.press(KeyCode.RIGHT, {ctrl: true}))
         .expectSpeech('I')
@@ -1804,7 +1804,7 @@
     await this.focusFirstTextField(root);
 
     mockFeedback.call(this.press(KeyCode.DOWN))
-        .expectSpeech(' typing')
+        .expectSpeech('I ')
         // Move forward through line.
 
         // This first right arrow is allowed to be processed by the content
diff --git a/chrome/browser/resources/chromeos/arc_support/recommend_app_old_list_view.html b/chrome/browser/resources/chromeos/arc_support/recommend_app_old_list_view.html
new file mode 100644
index 0000000..0dbf8bb
--- /dev/null
+++ b/chrome/browser/resources/chromeos/arc_support/recommend_app_old_list_view.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <style>
+    :root {
+      color: #333;
+      font-family: 'Google Sans', Roboto, sans-serif;
+      font-size: 13px;
+      font-weight: 400; /* roboto-regular */
+    }
+
+    body {
+      margin: 0;
+    }
+
+    #recommend-apps-container {
+      box-sizing: border-box;
+      display: flex;
+      flex-flow: row wrap;
+      gap: 16px;
+      overflow: hidden;
+      padding: 2px;
+    }
+
+    #recommend-apps-container .item {
+      display: flex;
+      flex: 0 0 calc((100% - 32px) / 3); /* This size allows <= 3 items in a row */
+      flex-flow: row nowrap;
+      float: left;
+      max-width: 280px;
+      min-width: 156px;
+      position: relative;
+      user-select: none;
+    }
+
+    #recommend-apps-container .item .image-picker {
+      background: url(images/ic_checkmark.svg) no-repeat;
+      display: none;
+      flex-shrink: 0;
+      transform: translate(-32px, 8px);
+      width: 24px;
+    }
+
+    #recommend-apps-container .item.checked .image-picker {
+      display: block;
+    }
+
+    #recommend-apps-container .item .chip {
+      border-radius: 8px;
+      box-shadow:
+          1px 1px 4px rgba(60, 64, 67, 0.30),
+          1px 2px 4px 1px rgba(60, 64, 67, 0.15);
+      flex-shrink: 0;
+      height: 160px;
+      position: relative;
+      width: 100%;
+      --x: 0;
+      --y: 0;
+    }
+
+    #recommend-apps-container .item .chip .chip-content-container {
+      display: flex;
+      flex-direction: column;
+      height: 100%;
+      overflow: hidden;
+      position: relative;
+      text-align: center;
+    }
+
+    #recommend-apps-container .item .chip:focus,
+    #recommend-apps-container .item .chip .chip-content-container:focus {
+      outline: none;
+    }
+
+    #recommend-apps-container .item .chip:focus > .chip-content-container {
+      outline: 2px solid rgba(26, 115, 232, 0.5);
+    }
+
+    @keyframes ripple {
+      30% {
+        transform: scale(7);
+      }
+      100% {
+        opacity: 0;
+      }
+    }
+
+    #recommend-apps-container .item .chip .chip-content-container .ripple {
+      animation: ripple 1s forwards;
+      background: rgba(32, 33, 36, 0.14);
+      border-radius: 50%;
+      height: 100px;
+      margin-inline-start: calc(var(--x) * 1px);
+      margin-top: calc(var(--y) * 1px);
+      position: absolute;
+      transform: translate(-50%, -50%);
+      width: 100px;
+    }
+
+    #recommend-apps-container .item .chip:active {
+      box-shadow:
+          0 1px 2px 0 rgba(60, 64, 67, 0.30),
+          0 3px 6px 2px rgba(60, 64, 67, 0.15);
+    }
+
+    img.app-icon {
+      height: 48px;
+      margin-bottom: 20px;
+      margin-inline: auto;
+      margin-top: 32px;
+      vertical-align: middle;
+      width: 48px;
+    }
+
+    span.app-title {
+      color: rgb(32, 33, 36);
+      display: inline-block;
+      font-size: 13px;
+      line-height: 20px;
+      margin-bottom: 20px;
+      margin-inline: 8px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      vertical-align: middle;
+      white-space: nowrap;
+    }
+  </style>
+</head>
+<body>
+  <div id="scroll-top"></div>
+  <div id="recommend-apps-container"></div>
+  <div id="scroll-bottom"></div>
+</body>
+</html>
diff --git a/chrome/browser/resources/chromeos/arc_support/recommend_app_old_list_view.js b/chrome/browser/resources/chromeos/arc_support/recommend_app_old_list_view.js
new file mode 100644
index 0000000..6103665b
--- /dev/null
+++ b/chrome/browser/resources/chromeos/arc_support/recommend_app_old_list_view.js
@@ -0,0 +1,157 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+let appWindow;
+let appOrigin;
+
+function generateContents(appIcon, appTitle, appPackageName) {
+  const doc = document;
+  const recommendAppsContainer = doc.getElementById('recommend-apps-container');
+  const item = doc.createElement('div');
+  item.classList.add('item');
+  item.setAttribute('data-packagename', appPackageName);
+
+  const chip = doc.createElement('div');
+  chip.classList.add('chip');
+  chip.tabIndex = 0;
+  chip.addEventListener('mousedown', addRippleCircle_);
+  chip.addEventListener('mouseup', toggleCheckStatus_);
+  chip.addEventListener('animationend', removeRippleCircle_);
+
+  // Add keyboard events
+  let keyEventFired = false;
+  chip.addEventListener('keydown', function(e) {
+    if (!keyEventFired && isConfirmKey_(e))
+      addRippleCircle_(e);
+    keyEventFired = true;
+  });
+  chip.addEventListener('keyup', function(e) {
+    if (isConfirmKey_(e)) {
+      toggleCheckStatus_(e);
+      keyEventFired = false;
+    }
+  });
+
+  const chipContent = doc.createElement('div');
+  chipContent.classList.add('chip-content-container');
+  chipContent.tabIndex = -1;
+  chip.appendChild(chipContent);
+
+  item.appendChild(chip);
+
+  const img = doc.createElement('img');
+  img.classList.add('app-icon');
+  img.setAttribute('src', decodeURIComponent(appIcon));
+
+  const title = doc.createElement('span');
+  title.classList.add('app-title');
+  title.innerHTML = appTitle;
+
+  chipContent.appendChild(img);
+  chipContent.appendChild(title);
+
+  const imagePicker = doc.createElement('div');
+  imagePicker.classList.add('image-picker');
+  imagePicker.addEventListener('click', toggleCheckStatus_);
+  item.appendChild(imagePicker);
+
+  recommendAppsContainer.appendChild(item);
+}
+
+/**
+ * Add a layer on top of the chip to create the ripple effect.
+ * @param {!Event} e
+ * @private
+ */
+function addRippleCircle_(e) {
+  const chip = e.currentTarget;
+  const item = chip.parentNode;
+  const offsetX = e.pageX - item.offsetLeft;
+  const offsetY = e.pageY - item.offsetTop;
+  chip.style.setProperty('--x', offsetX);
+  chip.style.setProperty('--y', offsetY);
+  const chipContent = chip.querySelector('.chip-content-container');
+  chipContent.innerHTML += '<div class="ripple"></div>';
+}
+
+/**
+ * After the animation ends, remove the ripple layer.
+ * @param {!Event} e
+ * @private
+ */
+function removeRippleCircle_(e) {
+  const chip = e.currentTarget;
+  const rippleLayers = chip.querySelectorAll('.ripple');
+  for (const rippleLayer of rippleLayers) {
+    if (rippleLayer.className === 'ripple') {
+      rippleLayer.remove();
+    }
+  }
+}
+
+/**
+ * Toggle the check status of an app. If an app is selected, add the "checked"
+ * lass so that the checkmark is visible. Otherwise, remove the checked class.
+ * @param {!Event} e
+ * @private
+ */
+function toggleCheckStatus_(e) {
+  const item = e.currentTarget.parentNode;
+  item.classList.toggle('checked');
+
+  sendNumberOfSelectedApps();
+}
+
+function getSelectedPackages() {
+  const selectedPackages = [];
+  const checkedItems = document.getElementsByClassName('checked');
+  for (const checkedItem of checkedItems) {
+    selectedPackages.push(checkedItem.dataset.packagename);
+  }
+  return selectedPackages;
+}
+
+function isConfirmKey_(e) {
+  return e.keyCode === 13   // Enter
+      || e.keyCode === 32;  // Space
+}
+
+/**
+ * Send the number of selected apps back to the embedding page.
+ */
+function sendNumberOfSelectedApps() {
+  if (appWindow && appOrigin) {
+    const checkedItems = document.querySelectorAll('.checked');
+    appWindow.postMessage(
+        {type: 'NUM_OF_SELECTED_APPS', numOfSelected: checkedItems.length},
+        appOrigin);
+  }
+}
+
+function onMessage_(e) {
+  appWindow = e.source;
+  appOrigin = e.origin;
+}
+
+/**
+ * Mark all recommended apps as checked.
+ */
+function selectAll() {
+  const allItems = document.getElementsByClassName('item');
+  for (const item of allItems) {
+    item.classList.add('checked');
+  }
+
+  sendNumberOfSelectedApps();
+}
+
+/**
+ * Calculate height of the recommend-apps-container.
+ * @return {number}
+ */
+function getHeight() {
+  return document.querySelector('#recommend-apps-container').clientHeight;
+}
+
+window.addEventListener('message', onMessage_);
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn
index 3458ef4..35d0dfb 100644
--- a/chrome/browser/resources/chromeos/login/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -266,6 +266,8 @@
     "screens/common/parental_handoff.js",
     "screens/common/pin_setup.html",
     "screens/common/pin_setup.js",
+    "screens/common/recommend_apps_old.html",
+    "screens/common/recommend_apps_old.js",
     "screens/common/recommend_apps.html",
     "screens/common/recommend_apps.js",
     "screens/common/saml_confirm_password.html",
@@ -422,6 +424,7 @@
     "screens/common/os_install.m.js",
     "screens/common/parental_handoff.m.js",
     "screens/common/pin_setup.m.js",
+    "screens/common/recommend_apps_old.m.js",
     "screens/common/recommend_apps.m.js",
     "screens/common/saml_confirm_password.m.js",
     "screens/common/signin_fatal_error.m.js",
@@ -509,9 +512,7 @@
 
 js_type_check("closure_compile_local") {
   uses_legacy_modules = true
-  deps = [
-    ":oobe_screen_assistant_optin_flow",
-  ]
+  deps = [ ":oobe_screen_assistant_optin_flow" ]
 }
 
 ###############################
diff --git a/chrome/browser/resources/chromeos/login/components/display_manager_types.js b/chrome/browser/resources/chromeos/login/components/display_manager_types.js
index a98b835..ecb9cbf 100644
--- a/chrome/browser/resources/chromeos/login/components/display_manager_types.js
+++ b/chrome/browser/resources/chromeos/login/components/display_manager_types.js
@@ -83,6 +83,8 @@
 'ad-password-change';
 /* #export */ const SCREEN_SYNC_CONSENT = 'sync-consent';
 /* #export */ const SCREEN_FINGERPRINT_SETUP = 'fingerprint-setup';
+// TODO(crbug.com/1261902): Remove.
+/* #export */ const SCREEN_RECOMMEND_APPS_OLD = 'recommend-apps-old';
 /* #export */ const SCREEN_RECOMMEND_APPS = 'recommend-apps';
 /* #export */ const SCREEN_APP_DOWNLOADING = 'app-downloading';
 /* #export */ const SCREEN_PIN_SETUP = 'pin-setup';
diff --git a/chrome/browser/resources/chromeos/login/debug/debug.js b/chrome/browser/resources/chromeos/login/debug/debug.js
index 2e5ed8e..bc7c2fb 100644
--- a/chrome/browser/resources/chromeos/login/debug/debug.js
+++ b/chrome/browser/resources/chromeos/login/debug/debug.js
@@ -1188,6 +1188,49 @@
         },
       ],
     },
+    // TODO(crbug.com/1261902): Remove.
+    {
+      id: 'recommend-apps-old',
+      kind: ScreenKind.NORMAL,
+      handledSteps: 'list',
+      // Known issue: reset() does not clear list of apps, so loadAppList
+      // will append apps instead of replacing.
+      states: [
+        {
+          id: '2-apps',
+          trigger: (screen) => {
+            screen.reset();
+            screen.setWebview(RECOMMENDED_APPS_OLD_CONTENT);
+            screen.loadAppList([
+              {
+                name: 'Test app 1',
+                package_name: 'test1.app',
+              },
+              {
+                name: 'Test app 2 with some really long name',
+                package_name: 'test2.app',
+              },
+            ]);
+          },
+        },
+        {
+          id: '21-apps',
+          trigger: (screen) => {
+            // There can be up to 21 apps: see recommend_apps_fetcher_impl
+            screen.reset();
+            screen.setWebview(RECOMMENDED_APPS_OLD_CONTENT);
+            let apps = [];
+            for (let i = 1; i <= 21; i++) {
+              apps.push({
+                name: 'Test app ' + i,
+                package_name: 'app.test' + i,
+              });
+            }
+            screen.loadAppList(apps);
+          },
+        },
+      ],
+    },
     {
       id: 'recommend-apps',
       kind: ScreenKind.NORMAL,
diff --git a/chrome/browser/resources/chromeos/login/debug/debug_util.js b/chrome/browser/resources/chromeos/login/debug/debug_util.js
index 557129b1..615304b6 100644
--- a/chrome/browser/resources/chromeos/login/debug/debug_util.js
+++ b/chrome/browser/resources/chromeos/login/debug/debug_util.js
@@ -3,6 +3,13 @@
 // found in the LICENSE file.
 
 // TODO(crbug.com/1229130) - Remove this global namespace pollution.
+// TODO(crbug.com/1261902): Remove from the place it will be moved to after
+// crbug.com/1229130.
+window.RECOMMENDED_APPS_OLD_CONTENT = `
+  // <include src="../../arc_support/recommend_app_old_list_view.html">
+  `;
+
+// TODO(crbug.com/1229130) - Remove this global namespace pollution.
 window.RECOMMENDED_APPS_CONTENT = `
-  // <include src="../../arc_support/recommend_app_list_view.html">
-    `;
+// <include src="../../arc_support/recommend_app_list_view.html">
+  `;
diff --git a/chrome/browser/resources/chromeos/login/oobe_polymer3.html b/chrome/browser/resources/chromeos/login/oobe_polymer3.html
index 5a57a714..ed654ef1 100644
--- a/chrome/browser/resources/chromeos/login/oobe_polymer3.html
+++ b/chrome/browser/resources/chromeos/login/oobe_polymer3.html
@@ -74,6 +74,9 @@
           </enterprise-enrollment-element>
           <fingerprint-setup-element id="fingerprint-setup" class="step hidden" hidden>
           </fingerprint-setup-element>
+          <!-- TODO(crbug.com/1261902): Remove. -->
+          <recommend-apps-old-element id="recommend-apps-old" class="step hidden" hidden>
+          </recommend-apps-old-element>
           <recommend-apps-element id="recommend-apps" class="step hidden" hidden>
           </recommend-apps-element>
           <parental-handoff-element id="parental-handoff" class="step hidden" hidden>
diff --git a/chrome/browser/resources/chromeos/login/oobe_polymer3.js b/chrome/browser/resources/chromeos/login/oobe_polymer3.js
index bead597..f7a87445 100644
--- a/chrome/browser/resources/chromeos/login/oobe_polymer3.js
+++ b/chrome/browser/resources/chromeos/login/oobe_polymer3.js
@@ -34,6 +34,8 @@
 import 'chrome://oobe/screens/common/os_trial.m.js';
 import 'chrome://oobe/screens/common/parental_handoff.m.js';
 import 'chrome://oobe/screens/common/pin_setup.m.js';
+// TODO(crbug.com/1261902): Remove.
+import 'chrome://oobe/screens/common/recommend_apps_old.m.js';
 import 'chrome://oobe/screens/common/recommend_apps.m.js';
 import 'chrome://oobe/screens/common/saml_confirm_password.m.js';
 import 'chrome://oobe/screens/common/signin_fatal_error.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
index 10e32d4..ab878bb 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -37,6 +37,7 @@
     ":parental_handoff_module",
     ":pin_setup_module",
     ":recommend_apps_module",
+    ":recommend_apps_old_module",
     ":saml_confirm_password_module",
     ":signin_fatal_error_module",
     ":sync_consent_module",
@@ -85,6 +86,7 @@
     ":parental_handoff.m",
     ":pin_setup.m",
     ":recommend_apps.m",
+    ":recommend_apps_old.m",
     ":saml_confirm_password.m",
     ":signin_fatal_error.m",
     ":sync_consent.m",
@@ -99,9 +101,7 @@
 js_type_check("closure_compile_module_multidevice_setup") {
   is_polymer3 = true
   closure_flags = default_closure_args
-  deps = [
-    ":multidevice_setup.m",
-  ]
+  deps = [ ":multidevice_setup.m" ]
 }
 
 ###############################
@@ -365,9 +365,9 @@
 js_library("multidevice_setup.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.m.js" ]
   deps = [
-    "../../components/behaviors:oobe_i18n_behavior.m",
     "../../components/behaviors:login_screen_behavior.m",
     "../../components/behaviors:multi_step_behavior.m",
+    "../../components/behaviors:oobe_i18n_behavior.m",
     "../../components/buttons:oobe_next_button.m",
     "../../components/buttons:oobe_text_button.m",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -484,21 +484,35 @@
   extra_deps = [ ":pin_setup_module" ]
 }
 
+js_library("recommend_apps_old.m") {
+  sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.m.js" ]
+  deps = [
+    "../../components:oobe_types.m",
+    "../../components/behaviors:login_screen_behavior.m",
+    "../../components/behaviors:multi_step_behavior.m",
+    "../../components/behaviors:oobe_dialog_host_behavior.m",
+    "../../components/behaviors:oobe_i18n_behavior.m",
+    "../../components/buttons:oobe_text_button.m",
+    "../../components/dialogs:oobe_adaptive_dialog.m",
+    "../../components/dialogs:oobe_loading_dialog.m",
+  ]
+  externs_list = [ "$externs_path/webview_tag.js" ]
+  extra_deps = [ ":recommend_apps_old_module" ]
+}
+
 js_library("recommend_apps.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.m.js" ]
   deps = [
-     "../../components:oobe_types.m",
-     "../../components/behaviors:login_screen_behavior.m",
-     "../../components/behaviors:multi_step_behavior.m",
-     "../../components/behaviors:oobe_dialog_host_behavior.m",
-     "../../components/behaviors:oobe_i18n_behavior.m",
-     "../../components/buttons:oobe_text_button.m",
-     "../../components/dialogs:oobe_adaptive_dialog.m",
-     "../../components/dialogs:oobe_loading_dialog.m",
+    "../../components:oobe_types.m",
+    "../../components/behaviors:login_screen_behavior.m",
+    "../../components/behaviors:multi_step_behavior.m",
+    "../../components/behaviors:oobe_dialog_host_behavior.m",
+    "../../components/behaviors:oobe_i18n_behavior.m",
+    "../../components/buttons:oobe_text_button.m",
+    "../../components/dialogs:oobe_adaptive_dialog.m",
+    "../../components/dialogs:oobe_loading_dialog.m",
   ]
-  externs_list = [
-    "$externs_path/webview_tag.js",
-  ]
+  externs_list = [ "$externs_path/webview_tag.js" ]
   extra_deps = [ ":recommend_apps_module" ]
 }
 
@@ -785,6 +799,14 @@
   namespace_rewrites = oobe_namespace_rewrites
 }
 
+polymer_modulizer("recommend_apps_old") {
+  js_file = "recommend_apps_old.js"
+  html_file = "recommend_apps_old.html"
+  html_type = "dom-module"
+  auto_imports = oobe_auto_imports
+  namespace_rewrites = oobe_namespace_rewrites
+}
+
 polymer_modulizer("recommend_apps") {
   js_file = "recommend_apps.js"
   html_file = "recommend_apps.html"
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.html b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.html
new file mode 100644
index 0000000..3a988d7f
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.html
@@ -0,0 +1,75 @@
+<!-- Copyright 2022 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file. -->
+
+<link rel="import" href="chrome://resources/html/polymer.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+
+<link rel="import" href="../../display_manager.html">
+<link rel="import" href="../../components/display_manager_types.html">
+<link rel="import" href="../../components/behaviors/login_screen_behavior.html">
+<link rel="import" href="../../components/behaviors/multi_step_behavior.html">
+<link rel="import" href="../../components/behaviors/oobe_dialog_host_behavior.html">
+<link rel="import" href="../../components/behaviors/oobe_i18n_behavior.html">
+<link rel="import" href="../../components/buttons/oobe_text_button.html">
+<link rel="import" href="../../components/common_styles/oobe_dialog_host_styles.html">
+<link rel="import" href="../../components/dialogs/oobe_adaptive_dialog.html">
+<link rel="import" href="../../components/oobe_types.html">
+
+<dom-module id="recommend-apps-old-element">
+  <template>
+    <style include="oobe-dialog-host-styles action-link">
+      #skipButton {
+        color: rgba(0, 0, 0, 0.54);
+        padding-inline-end: 6px;
+      }
+
+      #app-list-view-container {
+        display: flex;
+        flex-direction: column;
+      }
+
+      #selectAllButton {
+        display: flex;
+        justify-content: flex-end;
+        margin-bottom: 16px;
+      }
+    </style>
+    <oobe-loading-dialog id="loadingDialog" for-step="loading"
+        title-key="recommendAppsLoading">
+      <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon>
+    </oobe-loading-dialog>
+    <oobe-adaptive-dialog id="appsDialog" role="dialog"
+        aria-label$="[[i18nDynamic(locale, 'recommendAppsScreenTitle')]]"
+        no-footer-padding footer-shrinkable for-step="list">
+      <iron-icon src="chrome://oobe/playstore.svg" slot="icon">
+      </iron-icon>
+      <h1 slot="title">
+        [[i18nDynamic(locale, 'recommendAppsScreenTitle')]]
+      </h1>
+      <div slot="subtitle">
+        [[i18nDynamic(locale, 'recommendAppsScreenDescription', appCount_)]]
+      </div>
+      <div id="app-list-view-container" slot="content">
+        <div id="selectAllButton">
+          <a class="oobe-local-link focus-on-show" is="action-link"
+              on-click="onSelectAll_">
+            [[i18nDynamic(locale, 'recommendAppsSelectAll')]]
+          </a>
+        </div>
+        <webview id="appView" on-message="onMessage_"></webview>
+      </div>
+      <div slot="bottom-buttons">
+        <oobe-text-button id="skipButton"
+            text-key="recommendAppsSkip" on-click="onSkip_" border>
+        </oobe-text-button>
+        <oobe-text-button id="installButton" on-click="onInstall_" inverse
+            text-key="recommendAppsInstall"
+            disabled="[[!canProceed_(appsSelected_)]]">
+        </oobe-text-button>
+      </div>
+    </oobe-adaptive-dialog>
+  </template>
+  <script src="recommend_apps_old.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.js b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.js
new file mode 100644
index 0000000..e9121bd
--- /dev/null
+++ b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.js
@@ -0,0 +1,211 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Polymer element for displaying material design Recommend Apps
+ * screen.
+ */
+
+/* #js_imports_placeholder */
+
+/**
+ * UI mode for the dialog.
+ * @enum {string}
+ */
+const RecommendAppsOldUiState = {
+  LOADING: 'loading',
+  LIST: 'list',
+};
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {LoginScreenBehaviorInterface}
+ * @implements {MultiStepBehaviorInterface}
+ */
+const RecommendAppsOldElementBase = Polymer.mixinBehaviors(
+    [
+      OobeI18nBehavior, OobeDialogHostBehavior, LoginScreenBehavior,
+      MultiStepBehavior
+    ],
+    Polymer.Element);
+
+/**
+ * @typedef {{
+ *   appsDialog:  OobeAdaptiveDialogElement,
+ *   appView:  WebView,
+ *   installButton:  OobeTextButtonElement,
+ * }}
+ */
+RecommendAppsOldElementBase.$;
+
+/**
+ * @polymer
+ */
+class RecommendAppsOldElement extends RecommendAppsOldElementBase {
+  static get is() {
+    return 'recommend-apps-old-element';
+  }
+
+  /* #html_template_placeholder */
+
+  static get properties() {
+    return {
+      appCount_: {
+        type: Number,
+        value: 0,
+      },
+
+      appsSelected_: {
+        type: Number,
+        value: 0,
+      },
+    };
+  }
+
+  constructor() {
+    super();
+    this.initialized_ = false;
+  }
+
+  get EXTERNAL_API() {
+    return ['setWebview', 'loadAppList'];
+  }
+
+  get UI_STEPS() {
+    return RecommendAppsOldUiState;
+  }
+
+  ready() {
+    super.ready();
+    this.initializeLoginScreen('RecommendAppsOldScreen', {
+      resetAllowed: true,
+    });
+    window.addEventListener('message', this.onMessage_.bind(this));
+  }
+
+  /**
+   * Resets screen to initial state.
+   * Currently is used for debugging purposes only.
+   */
+  reset() {
+    this.setUIStep(RecommendAppsOldUiState.LOADING);
+    this.appCount_ = 0;
+    this.appsSelected_ = 0;
+  }
+
+  /**
+   * Returns the control which should receive initial focus.
+   */
+  get defaultControl() {
+    return this.$.appsDialog;
+  }
+
+  defaultUIStep() {
+    return RecommendAppsOldUiState.LOADING;
+  }
+
+  /**
+   * Initial UI State for screen
+   */
+  getOobeUIInitialState() {
+    return OOBE_UI_STATE.ONBOARDING;
+  }
+
+  setWebview(contents) {
+    cr.ui.login.invokePolymerMethod(this.$.appsDialog, 'onBeforeShow');
+    this.$.appView.src =
+        'data:text/html;charset=utf-8,' + encodeURIComponent(contents);
+  }
+
+  /**
+   * Generates the contents in the webview.
+   * It is assumed that |loadAppList| is called only once after |setWebview|.
+   */
+  loadAppList(appList) {
+    this.appCount_ = appList.length;
+
+    const appListView = this.$.appView;
+    appListView.addEventListener('contentload', () => {
+      appListView.executeScript(
+          {file: 'recommend_app_old_list_view.js'}, () => {
+            appListView.contentWindow.postMessage('initialMessage', '*');
+
+            appList.forEach(function(app_data, index) {
+              const app =
+                  /** @type {OobeTypes.RecommendedAppsExpectedAppData} */ (
+                      app_data);
+              let generateItemScript = 'generateContents("' + app.icon +
+                  '", "' + app.name + '", "' + app.package_name + '");';
+              const generateContents = {code: generateItemScript};
+              appListView.executeScript(generateContents);
+            });
+
+            const getNumOfSelectedAppsScript = 'sendNumberOfSelectedApps();';
+            appListView.executeScript({code: getNumOfSelectedAppsScript});
+
+            this.onFullyLoaded_();
+          });
+    });
+  }
+
+  /**
+   * Handles event when contents in the webview is generated.
+   */
+  onFullyLoaded_() {
+    const appListView = this.$.appView;
+    appListView.executeScript({code: 'getHeight();'}, function(result) {
+      appListView.setAttribute('style', 'height: ' + result + 'px');
+    });
+    this.setUIStep(RecommendAppsOldUiState.LIST);
+    this.$.installButton.focus();
+  }
+
+  /**
+   * Handles Skip button click.
+   */
+  onSkip_() {
+    chrome.send('recommendAppsSkip');
+  }
+
+  /**
+   * Handles Install button click.
+   */
+  onInstall_() {
+    // Only start installation if there are apps to install.
+    if (this.appsSelected_ > 0) {
+      let appListView = this.$.appView;
+      appListView.executeScript(
+          {code: 'getSelectedPackages();'}, function(result) {
+            chrome.send('recommendAppsInstall', result[0]);
+          });
+    }
+  }
+
+  /**
+   * Handles the message sent from the WebView.
+   * @param {Event} event
+   */
+  onMessage_(event) {
+    let data =
+        /** @type {OobeTypes.RecommendedAppsSelectionEventData} */ (event.data);
+    if (data.type && (data.type === 'NUM_OF_SELECTED_APPS')) {
+      this.appsSelected_ = data.numOfSelected;
+    }
+  }
+
+  /**
+   * Handles Select all button click.
+   */
+  onSelectAll_() {
+    let appListView = this.$.appView;
+    appListView.executeScript({code: 'selectAll();'});
+  }
+
+  canProceed_(appsSelected) {
+    return appsSelected > 0;
+  }
+}
+
+customElements.define(RecommendAppsOldElement.is, RecommendAppsOldElement);
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/structure/components_common.html b/chrome/browser/resources/chromeos/login/structure/components_common.html
index 0b37712..7ed344d 100644
--- a/chrome/browser/resources/chromeos/login/structure/components_common.html
+++ b/chrome/browser/resources/chromeos/login/structure/components_common.html
@@ -31,6 +31,8 @@
 <link rel="import" href="/screens/common/oobe_reset.html">
 <link rel="import" href="/screens/common/parental_handoff.html">
 <link rel="import" href="/screens/common/pin_setup.html">
+<!-- TODO(crbug.com/1261902): Remove. -->
+<link rel="import" href="/screens/common/recommend_apps_old.html">
 <link rel="import" href="/screens/common/recommend_apps.html">
 <link rel="import" href="/screens/common/saml_confirm_password.html">
 <link rel="import" href="/screens/common/signin_fatal_error.html">
diff --git a/chrome/browser/resources/chromeos/login/structure/screens_common.html b/chrome/browser/resources/chromeos/login/structure/screens_common.html
index b8ff4fa..429cd54 100644
--- a/chrome/browser/resources/chromeos/login/structure/screens_common.html
+++ b/chrome/browser/resources/chromeos/login/structure/screens_common.html
@@ -39,6 +39,9 @@
 </sync-consent-element>
 <fingerprint-setup-element id="fingerprint-setup" class="step hidden" hidden>
 </fingerprint-setup-element>
+<!-- TODO(crbug.com/1261902): Remove. -->
+<recommend-apps-old-element id="recommend-apps-old" class="step hidden" hidden>
+</recommend-apps-old-element>
 <recommend-apps-element id="recommend-apps" class="step hidden" hidden>
 </recommend-apps-element>
 <app-downloading-element id="app-downloading" class="step hidden" hidden>
diff --git a/chrome/browser/resources/component_extension_resources.grd b/chrome/browser/resources/component_extension_resources.grd
index 6670482..8904511 100644
--- a/chrome/browser/resources/component_extension_resources.grd
+++ b/chrome/browser/resources/component_extension_resources.grd
@@ -94,7 +94,11 @@
         <include name="IDR_ARC_SUPPORT_ICON_192" file="chromeos/arc_support/icon/192.png" type="BINDATA" />
         <include name="IDR_ARC_SUPPORT_ICON_ERROER_IMAGE" file="chromeos/arc_support/images/error_image.png" type="BINDATA" />
         <include name="IDR_ARC_SUPPORT_ICON_HEADER" file="chromeos/arc_support/images/header.png" type="BINDATA" />
+        <!-- TODO(crbug.com/1261902): Remove. -->
+        <include name="IDR_ARC_SUPPORT_RECOMMEND_APP_OLD_LIST_VIEW_JS" file="chromeos/arc_support/recommend_app_old_list_view.js" type="BINDATA" />
         <include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_JS" file="chromeos/arc_support/recommend_app_list_view.js" type="BINDATA" />
+        <!-- TODO(crbug.com/1261902): Remove. -->
+        <include name="IDR_ARC_SUPPORT_RECOMMEND_APP_OLD_LIST_VIEW_HTML" file="chromeos/arc_support/recommend_app_old_list_view.html" type="chrome_html" flattenhtml="true" />
         <include name="IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML" file="chromeos/arc_support/recommend_app_list_view.html" type="chrome_html" flattenhtml="true" />
       </if>
       <include name="IDR_CRYPTOTOKEN_UTIL_JS" file="cryptotoken/util.js" type="BINDATA" />
diff --git a/chrome/browser/resources/history/app.ts b/chrome/browser/resources/history/app.ts
index a1c1ff7..4c11ea15 100644
--- a/chrome/browser/resources/history/app.ts
+++ b/chrome/browser/resources/history/app.ts
@@ -29,7 +29,7 @@
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './app.html.js';
-import {BrowserService} from './browser_service.js';
+import {BrowserService, BrowserServiceImpl} from './browser_service.js';
 import {HistoryPageViewHistogram} from './constants.js';
 import {ForeignSession, QueryResult, QueryState} from './externs.js';
 import {HistoryListElement} from './history_list.js';
@@ -101,7 +101,7 @@
 
       if ((anchor.protocol === 'file:' || anchor.protocol === 'about:') &&
           (e.button === 0 || e.button === 1)) {
-        BrowserService.getInstance().navigateToUrl(
+        BrowserServiceImpl.getInstance().navigateToUrl(
             anchor.href, anchor.target, e);
         e.preventDefault();
       }
@@ -270,7 +270,7 @@
         'foreign-sessions-changed',
         (sessionList: Array<ForeignSession>) =>
             this.setForeignSessions_(sessionList));
-    this.browserService_ = BrowserService.getInstance();
+    this.browserService_ = BrowserServiceImpl.getInstance();
     this.shadowRoot!.querySelector('history-query-manager')!.initialize();
     this.browserService_!.getForeignSessions().then(
         sessionList => this.setForeignSessions_(sessionList));
diff --git a/chrome/browser/resources/history/browser_service.ts b/chrome/browser/resources/history/browser_service.ts
index a00dcca..73990400 100644
--- a/chrome/browser/resources/history/browser_service.ts
+++ b/chrome/browser/resources/history/browser_service.ts
@@ -6,18 +6,41 @@
 import {RESULTS_PER_PAGE} from './constants.js';
 import {ForeignSession, HistoryEntry, HistoryQuery} from './externs.js';
 
-type RemoveVisitsRequest = Array<{
+export type RemoveVisitsRequest = Array<{
   url: string,
   timestamps: Array<number>,
 }>;
 
+export type QueryResult = {
+  info: HistoryQuery,
+  value: HistoryEntry[],
+};
+
 /**
  * @fileoverview Defines a singleton object, history.BrowserService, which
  * provides access to chrome.send APIs.
  */
 
-export class BrowserService {
-  /** @return {!Promise<!Array<!ForeignSession>>} */
+export interface BrowserService {
+  getForeignSessions(): Promise<ForeignSession[]>;
+  removeBookmark(url: string): void;
+  removeVisits(removalList: RemoveVisitsRequest): Promise<void>;
+  openForeignSessionAllTabs(sessionTag: string): void;
+  openForeignSessionTab(
+      sessionTag: string, windowId: number, tabId: number, e: MouseEvent): void;
+  deleteForeignSession(sessionTag: string): void;
+  openClearBrowsingData(): void;
+  recordHistogram(histogram: string, value: number, max: number): void;
+  recordAction(action: string): void;
+  recordTime(histogram: string, time: number): void;
+  navigateToUrl(url: string, target: string, e: MouseEvent): void;
+  otherDevicesInitialized(): void;
+  queryHistoryContinuation(): Promise<QueryResult>;
+  queryHistory(searchTerm: string): Promise<QueryResult>;
+  startSignInFlow(): void;
+}
+
+export class BrowserServiceImpl implements BrowserService {
   getForeignSessions() {
     return sendWithPromise('getForeignSessions');
   }
@@ -30,11 +53,10 @@
    * @return Promise that is resolved when items are deleted
    *     successfully or rejected when deletion fails.
    */
-  removeVisits(removalList: RemoveVisitsRequest): Promise<void> {
+  removeVisits(removalList: RemoveVisitsRequest) {
     return sendWithPromise('removeVisits', removalList);
   }
 
-  /** @param {string} sessionTag */
   openForeignSessionAllTabs(sessionTag: string) {
     chrome.send('openForeignSession', [sessionTag]);
   }
@@ -84,15 +106,11 @@
     chrome.send('otherDevicesInitialized');
   }
 
-  /**
-   * @return {!Promise<{info: !HistoryQuery, value: !Array<!HistoryEntry>}>}
-   */
   queryHistoryContinuation() {
     return sendWithPromise('queryHistoryContinuation');
   }
 
-  queryHistory(searchTerm: string):
-      Promise<{info: HistoryQuery, value: Array<HistoryEntry>}> {
+  queryHistory(searchTerm: string) {
     return sendWithPromise('queryHistory', searchTerm, RESULTS_PER_PAGE);
   }
 
@@ -101,7 +119,7 @@
   }
 
   static getInstance(): BrowserService {
-    return instance || (instance = new BrowserService());
+    return instance || (instance = new BrowserServiceImpl());
   }
 
   static setInstance(obj: BrowserService) {
diff --git a/chrome/browser/resources/history/externs.ts b/chrome/browser/resources/history/externs.ts
index eb8173c..a613ebf 100644
--- a/chrome/browser/resources/history/externs.ts
+++ b/chrome/browser/resources/history/externs.ts
@@ -39,9 +39,9 @@
   time: number,
   title: string,
   url: string,
-  debug: HistoryEntryDebug,
   selected: boolean,
   readableTimestamp: string,
+  debug?: HistoryEntryDebug,
 };
 
 /**
diff --git a/chrome/browser/resources/history/history.ts b/chrome/browser/resources/history/history.ts
index cff9b4ac..9a5d8fa 100644
--- a/chrome/browser/resources/history/history.ts
+++ b/chrome/browser/resources/history/history.ts
@@ -5,8 +5,9 @@
 import './app.js';
 
 export {ensureLazyLoaded, listenForPrivilegedLinkClicks} from './app.js';
-export {BrowserService} from './browser_service.js';
+export {BrowserService, BrowserServiceImpl, QueryResult, RemoveVisitsRequest} from './browser_service.js';
 export {HistoryPageViewHistogram, SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram} from './constants.js';
+export {ForeignSession, ForeignSessionTab, ForeignSessionWindow, HistoryEntry, HistoryQuery} from './externs.js';
 export {BrowserProxyImpl} from './history_clusters/browser_proxy.js';
 export {PageCallbackRouter, PageHandlerRemote} from './history_clusters/history_clusters.mojom-webui.js';
 export {MetricsProxyImpl} from './history_clusters/metrics_proxy.js';
diff --git a/chrome/browser/resources/history/history_item.ts b/chrome/browser/resources/history/history_item.ts
index e7fe900b9..ec5a991d 100644
--- a/chrome/browser/resources/history/history_item.ts
+++ b/chrome/browser/resources/history/history_item.ts
@@ -19,7 +19,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {BrowserService} from './browser_service.js';
+import {BrowserServiceImpl} from './browser_service.js';
 import {UMA_MAX_BUCKET_VALUE, UMA_MAX_SUBSET_BUCKET_VALUE} from './constants.js';
 import {HistoryEntry} from './externs.js';
 import {getTemplate} from './history_item.html.js';
@@ -253,7 +253,7 @@
       focusWithoutInk(this.$['menu-button']);
     }
 
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.removeBookmark(this.item.url);
     browserService.recordAction('BookmarkStarClicked');
 
@@ -279,7 +279,7 @@
    * Record metrics when a result is clicked.
    */
   private onLinkClick_() {
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.recordAction('EntryLinkClick');
 
     if (this.searchTerm) {
@@ -316,7 +316,7 @@
   }
 
   onLinkRightClick_() {
-    BrowserService.getInstance().recordAction('EntryLinkRightClick');
+    BrowserServiceImpl.getInstance().recordAction('EntryLinkRightClick');
   }
 
   /**
diff --git a/chrome/browser/resources/history/history_list.ts b/chrome/browser/resources/history/history_list.ts
index 8bb5173..c146060 100644
--- a/chrome/browser/resources/history/history_list.ts
+++ b/chrome/browser/resources/history/history_list.ts
@@ -21,7 +21,7 @@
 import {IronScrollThresholdElement} from 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {BrowserService} from './browser_service.js';
+import {BrowserServiceImpl} from './browser_service.js';
 import {BROWSING_GAP_TIME, UMA_MAX_BUCKET_VALUE, UMA_MAX_SUBSET_BUCKET_VALUE} from './constants.js';
 import {HistoryEntry, HistoryQuery, QueryState} from './externs.js';
 import {HistoryItemElement, searchResultsTitle} from './history_item.js';
@@ -265,7 +265,7 @@
       return;
     }
 
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.recordAction('RemoveSelected');
     if (this.queryState.searchTerm !== '') {
       browserService.recordAction('SearchResultRemove');
@@ -353,7 +353,7 @@
   // Event listeners:
 
   private onDialogConfirmTap_() {
-    BrowserService.getInstance().recordAction('ConfirmRemoveSelected');
+    BrowserServiceImpl.getInstance().recordAction('ConfirmRemoveSelected');
 
     this.deleteSelected_();
     const dialog = this.$.dialog.getIfExists();
@@ -362,7 +362,7 @@
   }
 
   private onDialogCancelTap_() {
-    BrowserService.getInstance().recordAction('CancelRemoveSelected');
+    BrowserServiceImpl.getInstance().recordAction('CancelRemoveSelected');
 
     const dialog = this.$.dialog.getIfExists();
     assert(dialog);
@@ -415,7 +415,7 @@
   }
 
   private onMoreFromSiteTap_() {
-    BrowserService.getInstance().recordAction('EntryMenuShowMoreFromSite');
+    BrowserServiceImpl.getInstance().recordAction('EntryMenuShowMoreFromSite');
 
     assert(this.$.sharedMenu.getIfExists());
     this.fire_('change-query', {search: this.actionMenuModel_!.item.domain});
@@ -430,18 +430,18 @@
                                   }));
 
     this.pendingDelete = true;
-    return BrowserService.getInstance().removeVisits(removalList);
+    return BrowserServiceImpl.getInstance().removeVisits(removalList);
   }
 
   private onRemoveBookmarkTap_() {
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.removeBookmark(this.actionMenuModel_!.item.url);
     this.fire_('remove-bookmark-stars', this.actionMenuModel_!.item.url);
     this.closeMenu_();
   }
 
   private onRemoveFromHistoryTap_() {
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.recordAction('EntryMenuRemoveFromHistory');
 
     assert(!this.pendingDelete);
@@ -477,7 +477,7 @@
         }, 1);
       }
 
-      const browserService = BrowserService.getInstance();
+      const browserService = BrowserServiceImpl.getInstance();
       browserService.recordHistogram(
           'HistoryPage.RemoveEntryPosition',
           Math.min(index, UMA_MAX_BUCKET_VALUE), UMA_MAX_BUCKET_VALUE);
diff --git a/chrome/browser/resources/history/query_manager.ts b/chrome/browser/resources/history/query_manager.ts
index 14a4605..39e1124 100644
--- a/chrome/browser/resources/history/query_manager.ts
+++ b/chrome/browser/resources/history/query_manager.ts
@@ -5,7 +5,7 @@
 import {EventTracker} from 'chrome://resources/js/event_tracker.m.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {BrowserService} from './browser_service.js';
+import {BrowserServiceImpl} from './browser_service.js';
 import {HistoryEntry, HistoryQuery, QueryResult} from './externs.js';
 import {QueryState} from './externs.js';
 import {HistoryRouterElement} from './router.js';
@@ -85,7 +85,7 @@
     this.set('queryState.querying', true);
     this.set('queryState.incremental', incremental);
 
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     const promise = incremental ?
         browserService.queryHistoryContinuation() :
         browserService.queryHistory(this.queryState.searchTerm);
@@ -131,7 +131,7 @@
   private searchTermChanged_() {
     // TODO(tsergeant): Ignore incremental searches in this metric.
     if (this.queryState.searchTerm) {
-      BrowserService.getInstance().recordAction('Search');
+      BrowserServiceImpl.getInstance().recordAction('Search');
     }
   }
 }
diff --git a/chrome/browser/resources/history/side_bar.ts b/chrome/browser/resources/history/side_bar.ts
index a20b930b..bd923a17 100644
--- a/chrome/browser/resources/history/side_bar.ts
+++ b/chrome/browser/resources/history/side_bar.ts
@@ -20,7 +20,7 @@
 import {PaperRippleElement} from 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {BrowserService} from './browser_service.js';
+import {BrowserServiceImpl} from './browser_service.js';
 import {BrowserProxyImpl} from './history_clusters/browser_proxy.js';
 import {MetricsProxyImpl} from './history_clusters/metrics_proxy.js';
 import {Page, TABBED_PAGES} from './router.js';
@@ -134,7 +134,7 @@
    * Relocates the user to the clear browsing data section of the settings page.
    */
   private onClearBrowsingDataTap_(e: Event) {
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.recordAction('InitClearBrowsingData');
     browserService.openClearBrowsingData();
     this.$['cbd-ripple'].upAction();
diff --git a/chrome/browser/resources/history/synced_device_card.ts b/chrome/browser/resources/history/synced_device_card.ts
index 18bb7dc..b0552287 100644
--- a/chrome/browser/resources/history/synced_device_card.ts
+++ b/chrome/browser/resources/history/synced_device_card.ts
@@ -17,7 +17,7 @@
 import {IronCollapseElement} from 'chrome://resources/polymer/v3_0/iron-collapse/iron-collapse.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {BrowserService} from './browser_service.js';
+import {BrowserServiceImpl} from './browser_service.js';
 import {SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram} from './constants.js';
 import {ForeignSessionTab} from './externs.js';
 import {getTemplate} from './synced_device_card.html.js';
@@ -117,7 +117,7 @@
   private openTab_(e: MouseEvent) {
     const model = (e as unknown as OpenTabEvent).model;
     const tab = model.tab;
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.LINK_CLICKED,
         SyncedTabsHistogram.LIMIT);
@@ -134,7 +134,7 @@
         SyncedTabsHistogram.COLLAPSE_SESSION :
         SyncedTabsHistogram.EXPAND_SESSION;
 
-    BrowserService.getInstance().recordHistogram(
+    BrowserServiceImpl.getInstance().recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, histogramValue, SyncedTabsHistogram.LIMIT);
 
     this.$.collapse.toggle();
@@ -187,7 +187,7 @@
   }
 
   private onLinkRightClick_() {
-    BrowserService.getInstance().recordHistogram(
+    BrowserServiceImpl.getInstance().recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.LINK_RIGHT_CLICKED,
         SyncedTabsHistogram.LIMIT);
   }
diff --git a/chrome/browser/resources/history/synced_device_manager.ts b/chrome/browser/resources/history/synced_device_manager.ts
index dbe001b..c916fd4 100644
--- a/chrome/browser/resources/history/synced_device_manager.ts
+++ b/chrome/browser/resources/history/synced_device_manager.ts
@@ -20,7 +20,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {Debouncer, html, microTask, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {BrowserService} from './browser_service.js';
+import {BrowserServiceImpl} from './browser_service.js';
 import {SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram} from './constants.js';
 import {ForeignSession, ForeignSessionTab} from './externs.js';
 import {HistorySyncedDeviceCardElement} from './synced_device_card.js';
@@ -117,8 +117,8 @@
     this.focusGrid_ = new FocusGrid();
 
     // Update the sign in state.
-    BrowserService.getInstance().otherDevicesInitialized();
-    BrowserService.getInstance().recordHistogram(
+    BrowserServiceImpl.getInstance().otherDevicesInitialized();
+    BrowserServiceImpl.getInstance().recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.INITIALIZED,
         SyncedTabsHistogram.LIMIT);
   }
@@ -180,13 +180,13 @@
   }
 
   private onSignInTap_() {
-    BrowserService.getInstance().startSignInFlow();
+    BrowserServiceImpl.getInstance().startSignInFlow();
   }
 
   private onOpenMenu_(e: CustomEvent<{tag: string, target: HTMLElement}>) {
     this.actionMenuModel_ = e.detail.tag;
     this.$.menu.get().showAt(e.detail.target);
-    BrowserService.getInstance().recordHistogram(
+    BrowserServiceImpl.getInstance().recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.SHOW_SESSION_MENU,
         SyncedTabsHistogram.LIMIT);
   }
@@ -194,7 +194,7 @@
   private onOpenAllTap_() {
     const menu = this.$.menu.getIfExists();
     assert(menu);
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.OPEN_ALL,
         SyncedTabsHistogram.LIMIT);
@@ -229,7 +229,7 @@
   private onDeleteSessionTap_() {
     const menu = this.$.menu.getIfExists();
     assert(menu);
-    const browserService = BrowserService.getInstance();
+    const browserService = BrowserServiceImpl.getInstance();
     browserService.recordHistogram(
         SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.HIDE_FOR_NOW,
         SyncedTabsHistogram.LIMIT);
@@ -265,7 +265,7 @@
       signInAllowed: boolean): boolean {
     const show = !signInState && !guestSession && signInAllowed;
     if (show) {
-      BrowserService.getInstance().recordAction(
+      BrowserServiceImpl.getInstance().recordAction(
           'Signin_Impression_FromRecentTabs');
     }
 
@@ -300,7 +300,7 @@
 
     if (sessionList.length > 0 && !this.hasSeenForeignData_) {
       this.hasSeenForeignData_ = true;
-      BrowserService.getInstance().recordHistogram(
+      BrowserServiceImpl.getInstance().recordHistogram(
           SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram.HAS_FOREIGN_DATA,
           SyncedTabsHistogram.LIMIT);
     }
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html
index 8c4ca8b..60dbdaa 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html
+++ b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html
@@ -10,6 +10,7 @@
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/html/load_time_data.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-media-query/iron-media-query.html">
 <link rel="import" href="nearby_contact_manager.html">
 <link rel="import" href="nearby_page_template.html">
 <link rel="import" href="nearby_share_settings_behavior.html">
@@ -282,8 +283,11 @@
           if="[[showZeroState_(selectedVisibility, contactsState)]]">
         <div id="zeroStateContainer" class="content">
           <div id="zeroStateImageContainer">
+            <iron-media-query query="(prefers-color-scheme: dark)"
+                query-matches="{{isDarkModeActive_}}">
+            </iron-media-query>
             <iron-icon id="zeroStateImage"
-                icon="nearby-images:nearby-device-visibility">
+                icon="[[getDeviceVisibilityIcon_(isDarkModeActive_)]]">
             </iron-icon>
           </div>
           <div id="zeroStateTextContainer">
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js
index 593a6c5..b386b262 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js
+++ b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js
@@ -56,6 +56,18 @@
 };
 
 /**
+ * @type {string}
+ */
+const DEVICE_VISIBILITY_LIGHT_ICON =
+    'nearby-images:nearby-device-visibility-light';
+
+/**
+ * @type {string}
+ */
+const DEVICE_VISIBILITY_DARK_ICON =
+    'nearby-images:nearby-device-visibility-dark';
+
+/**
  * @typedef {{
  *            id:string,
  *            name:string,
@@ -127,6 +139,15 @@
       computed: 'isVisibilitySelected_(selectedVisibility)',
       notify: true,
     },
+
+    /**
+     * Whether the contact visibility page is being rendered in dark mode.
+     * @private {boolean}
+     */
+    isDarkModeActive_: {
+      type: Boolean,
+      value: false,
+    },
   },
 
   /** @private {?nearbyShare.mojom.ContactManagerInterface} */
@@ -577,5 +598,15 @@
     }
     this.contactManager_.setAllowedContacts(allowedContacts);
   },
+
+  /**
+   * Returns the icon based on Light/Dark mode.
+   * @returns {string}
+   * @private
+   */
+  getDeviceVisibilityIcon_() {
+    return this.isDarkModeActive_ ? DEVICE_VISIBILITY_DARK_ICON :
+                                    DEVICE_VISIBILITY_LIGHT_ICON;
+  },
 });
 })();
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html
index b9a035f..7a3d74ec 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html
+++ b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.html
@@ -4,6 +4,7 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-media-query/iron-media-query.html">
 <link rel="import" href="./nearby_page_template.html">
 <link rel="import" href="./nearby_share_settings.html">
 <link rel="import" href="./nearby_share_settings_behavior.html">
@@ -69,9 +70,12 @@
         cancel-button-label="$i18n{nearbyShareActionsCancel}"
         cancel-button-event-name="close">
       <div id=center-content slot="content">
+        <iron-media-query query="(prefers-color-scheme: dark)"
+            query-matches="{{isDarkModeActive_}}">
+        </iron-media-query>
         <iron-icon id="splash-image-column"
-            icon="nearby-images:nearby-onboarding-splash"
-            aria-hidden="true">
+            icon="[[getOnboardingSplashIcon_(isDarkModeActive_)]]"
+            aria-hidden="true">>
         </iron-icon>
         <div id="device-name-column">
           <cr-input label="$i18n{nearbyShareOnboardingPageDeviceName}"
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
index da2cddc8..fa784dd 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
+++ b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
@@ -7,6 +7,19 @@
  * onboarding flow. It is embedded in chrome://os-settings, chrome://settings
  * and as a standalone dialog via chrome://nearby.
  */
+
+/**
+ * @type {string}
+ */
+const ONBOARDING_SPLASH_LIGHT_ICON =
+    'nearby-images:nearby-onboarding-splash-light';
+
+/**
+ * @type {string}
+ */
+const ONBOARDING_SPLASH_DARK_ICON =
+    'nearby-images:nearby-onboarding-splash-dark';
+
 Polymer({
   is: 'nearby-onboarding-page',
 
@@ -23,6 +36,15 @@
       type: String,
       value: '',
     },
+
+    /**
+     * Whether the onboarding page is being rendered in dark mode.
+     * @private {boolean}
+     */
+    isDarkModeActive_: {
+      type: Boolean,
+      value: false,
+    },
   },
 
   listeners: {
@@ -118,5 +140,14 @@
    */
   hasErrorMessage_(errorMessage) {
     return errorMessage !== '';
-  }
+  },
+
+  /**
+   * Returns the icon based on Light/Dark mode.
+   * @return {string}
+   */
+  getOnboardingSplashIcon_() {
+    return this.isDarkModeActive_ ? ONBOARDING_SPLASH_DARK_ICON :
+                                    ONBOARDING_SPLASH_LIGHT_ICON;
+  },
 });
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_shared_icons.html b/chrome/browser/resources/nearby_share/shared/nearby_shared_icons.html
index 9e6ab98..bf001cb9 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_shared_icons.html
+++ b/chrome/browser/resources/nearby_share/shared/nearby_shared_icons.html
@@ -64,12 +64,20 @@
         <g jetway-hook-id="1B21145A-F9D1-4FC9-BEEE-803947016D7B" id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g jetway-hook-id="87118FA5-DB11-4BB8-938F-285C7F2DA7AB" id="video-ratio-copy" transform="translate(-207.000000, -511.000000)"> <g jetway-hook-id="BAC9FFF5-17FC-4983-A74E-7CA69E7AA580" id="Illo_Zero_contact" transform="translate(207.000000, 518.000000)"> <g jetway-hook-id="0F83DF5F-F409-4FE6-8C46-7F228F33FD31" id="glass" transform="translate(110.702644, 10.727953)"> <circle jetway-hook-id="40B770E9-C984-4FCB-8024-ADB6915AC3DE" id="Oval" fill="#D2E3FC" cx="16" cy="16" r="16"></circle> <rect jetway-hook-id="F634359F-92CD-4B63-BFEF-BBE4807259A1" id="Rectangle" fill="#D8D8D8" transform="translate(36.152671, 35.859670) rotate(-46.000000) translate(-36.152671, -35.859670) " x="34.1526708" y="27.3596699" width="4" height="17" rx="1"></rect> <path d="M27.8116966,23.2278245 L26.3116966,23.2278245 C24.7929135,23.2278245 23.5616966,24.4590415 23.5616966,25.9778245 L23.5616966,29.9778245 C23.5616966,31.4966076 24.7929135,32.7278245 26.3116966,32.7278245 L27.8116966,32.7278245 C30.1589068,32.7278245 32.0616966,30.8250347 32.0616966,28.4778245 L32.0616966,27.4778245 C32.0616966,25.1306144 30.1589068,23.2278245 27.8116966,23.2278245 Z M26.3116966,24.7278245 L27.8116966,24.7278245 C29.3304796,24.7278245 30.5616966,25.9590415 30.5616966,27.4778245 L30.5616966,28.4778245 C30.5616966,29.9966076 29.3304796,31.2278245 27.8116966,31.2278245 L26.3116966,31.2278245 C25.6213406,31.2278245 25.0616966,30.6681805 25.0616966,29.9778245 L25.0616966,25.9778245 C25.0616966,25.2874686 25.6213406,24.7278245 26.3116966,24.7278245 Z" jetway-hook-id="008E4C7A-ABA7-456E-B2E0-B2D975497AB7" id="Rectangle" fill="#FABD04" fill-rule="nonzero" transform="translate(27.811697, 27.977825) rotate(42.000000) translate(-27.811697, -27.977825) "></path> <path d="M25.9915923,23.6477298 C27.0078565,22.519054 28.7466739,22.4279265 29.8753497,23.4441907 L29.8753497,23.4441907 L30.0714669,23.6217978 C29.8280951,24.0701665 29.5639185,24.5056006 29.2802323,24.9268047 L28.8716538,24.558908 C28.3586194,24.0969697 27.5682478,24.1383913 27.1063095,24.6514257 L27.1063095,24.6514257 L24.4297871,27.624005 C23.9678488,28.1370395 24.0092704,28.927411 24.5223049,29.3893493 L24.5223049,29.3893493 L24.6227066,29.4800654 C24.1875963,29.7589678 23.738094,30.0173803 23.2755613,30.2539412 C22.3824587,29.2216234 22.3776643,27.6614035 23.3150698,26.6203091 L23.3150698,26.6203091 Z" jetway-hook-id="A3DBC112-B951-41B4-BBC1-81FA3AAFA8B5" id="Combined-Shape" fill="#FFFFFF" fill-rule="nonzero"></path> <path d="M17.0871617,19.4758659 L17.0871617,18.7798659 C17.0871617,18.2038659 17.1951617,17.7158659 17.4111617,17.3158659 C17.6271617,16.9158659 18.0071617,16.4678659 18.5511617,15.9718659 C19.2231617,15.3478659 19.7591617,14.7278659 20.1591617,14.1118659 C20.5591617,13.4958659 20.7591617,12.7638659 20.7591617,11.9158659 C20.7591617,11.0678659 20.5471617,10.2998659 20.1231617,9.61186591 C19.6991617,8.92386591 19.1071617,8.37986591 18.3471617,7.97986591 C17.5871617,7.57986591 16.7191617,7.37986591 15.7431617,7.37986591 C14.4311617,7.37986591 13.3511617,7.74786591 12.5031617,8.48386591 C11.6551617,9.21986591 11.0711617,10.0678659 10.7511617,11.0278659 L10.7511617,11.0278659 L13.0551617,11.9878659 C13.2631617,11.3638659 13.5871617,10.8478659 14.0271617,10.4398659 C14.4671617,10.0318659 15.0471617,9.82786591 15.7671617,9.82786591 C16.5191617,9.82786591 17.1111617,10.0318659 17.5431617,10.4398659 C17.9751617,10.8478659 18.1911617,11.3638659 18.1911617,11.9878659 C18.1911617,12.4998659 18.0671617,12.9398659 17.8191617,13.3078659 C17.5711617,13.6758659 17.1671617,14.1078659 16.6071617,14.6038659 C15.8071617,15.3238659 15.2511617,15.9558659 14.9391617,16.4998659 C14.6271617,17.0438659 14.4711617,17.7078659 14.4711617,18.4918659 L14.4711617,18.4918659 L14.4711617,19.4758659 L17.0871617,19.4758659 Z M15.7671617,25.0918659 C16.2631617,25.0918659 16.6831617,24.9158659 17.0271617,24.5638659 C17.3711617,24.2118659 17.5431617,23.7878659 17.5431617,23.2918659 C17.5431617,22.7958659 17.3711617,22.3718659 17.0271617,22.0198659 C16.6831617,21.6678659 16.2631617,21.4918659 15.7671617,21.4918659 C15.2711617,21.4918659 14.8471617,21.6638659 14.4951617,22.0078659 C14.1431617,22.3518659 13.9671617,22.7798659 13.9671617,23.2918659 C13.9671617,23.7878659 14.1431617,24.2118659 14.4951617,24.5638659 C14.8471617,24.9158659 15.2711617,25.0918659 15.7671617,25.0918659 Z" jetway-hook-id="7D6CA87B-D902-47EA-AAAF-EE6BF45DA3BE" id="?" fill="#4682F4" fill-rule="nonzero" transform="translate(15.755162, 16.235866) rotate(6.000000) translate(-15.755162, -16.235866) "></path> <path d="M16,3 C8.82029825,3 3,8.82029825 3,16 C3,23.1797017 8.82029825,29 16,29 C23.1797017,29 29,23.1797017 29,16 C29,8.82029825 23.1797017,3 16,3 Z M16,4 C22.627417,4 28,9.372583 28,16 C28,22.627417 22.627417,28 16,28 C9.372583,28 4,22.627417 4,16 C4,9.372583 9.372583,4 16,4 Z" jetway-hook-id="2D024BBB-D177-4B82-BC58-DF85C75B3AA4" id="Oval" fill="#FFFFFF" fill-rule="nonzero"></path> </g> <g jetway-hook-id="A0D557FE-1075-4B29-914E-7321D22DC556" id="Group-15"> <g jetway-hook-id="21F5BC8F-E389-4328-8C0B-58A1938AC1DD" id="Group-17" transform="translate(90.636527, 35.769915) rotate(-12.000000) translate(-90.636527, -35.769915) translate(53.636527, 0.291654)"> <path d="M8.83114634,14.8161913 L48.935198,6.29181195 C51.096062,5.83250613 53.2201293,7.21189158 53.6794351,9.37275559 L59.3924868,36.2505505 C59.8517926,38.4114145 58.4724072,40.5354819 56.3115432,40.9947877 L16.2074915,49.519167 C14.0466275,49.9784728 11.9225602,48.5990874 11.4632544,46.4382234 L5.7502027,19.5604284 C5.29089688,17.3995644 6.67028233,15.2754971 8.83114634,14.8161913 Z" jetway-hook-id="EB1DB367-5C69-4704-85D9-64CC6245C851" id="Rectangle-Copy-4" fill="#D2E3FC" transform="translate(32.571345, 27.905489) rotate(12.000000) translate(-32.571345, -27.905489) "></path> <path d="M15.2295742,25.7560991 L55.2712803,17.1118408 C57.4306733,16.6456681 59.5591149,18.0182944 60.0252876,20.1776874 C60.0270882,20.1860283 60.0288622,20.194375 60.0306094,20.2027274 L65.6624708,47.1246461 C66.1127687,49.2771995 64.7409299,51.3895489 62.5913024,51.8536134 L22.5495963,60.4978717 C20.3902033,60.9640444 18.2617617,59.5914181 17.795589,57.4320251 C17.7937884,57.4236842 17.7920144,57.4153375 17.7902672,57.4069852 L12.1584058,30.4850664 C11.7081079,28.3325131 13.0799467,26.2201636 15.2295742,25.7560991 Z" jetway-hook-id="F3495E78-46EF-45D0-802B-FDFD1AA927D3" id="Rectangle" fill="#FFFFFF" transform="translate(38.910438, 38.804856) rotate(25.000000) translate(-38.910438, -38.804856) "></path> <path d="M55.0641199,16.5299709 L14.9600683,24.9308085 C12.3940423,25.4683295 10.756022,27.9541039 11.3014477,30.4829411 L17.1229751,57.4741445 C17.6684007,60.0029817 20.1907307,61.6172625 22.7567567,61.0797416 L62.8608083,52.678904 C65.4268343,52.1413831 67.0648546,49.6556086 66.5194289,47.1267714 L60.6979015,20.135568 C60.1524759,17.6067308 57.6301459,15.99245 55.0641199,16.5299709 Z M59.2306801,20.4429157 L65.0522075,47.4341191 C65.4253935,49.1643761 64.3046428,50.8651692 62.5489408,51.2329467 L22.4448892,59.6337843 C20.6891871,60.0015618 18.9633824,58.8970538 18.5901965,57.1667968 L12.7686691,30.1755934 C12.3954831,28.4453364 13.5162338,26.7445433 15.2719358,26.3767658 L55.3759874,17.9759282 C57.1316895,17.6081508 58.8574942,18.7126587 59.2306801,20.4429157 Z" jetway-hook-id="7944401E-0269-4B38-B330-BD385FED8A90" id="Rectangle" fill="#D2E3FC" fill-rule="nonzero" transform="translate(38.910438, 38.804856) rotate(25.000000) translate(-38.910438, -38.804856) "></path> <g jetway-hook-id="56FDFA07-2ABB-4739-AF26-FBEFEFA00440" id="Group-14" transform="translate(58.075117, 26.030367)" fill="#4682F4" fill-rule="nonzero"> <path d="M2.80253991,0.25568634 L4.76869081,0.626478267 C6.39689163,0.933281294 7.46809619,2.50191184 7.16129316,4.13011266 C7.1561098,4.15762071 7.15054169,4.18505485 7.14459047,4.21240705 L4.28739248,17.3458222 C2.179929,14.6752635 0.924882546,11.3190271 0.924882546,7.67390722 C0.924882546,4.9921282 1.60421465,2.46671618 2.80253991,0.25568634 Z" jetway-hook-id="0079937D-7F77-4A27-8222-57873515EEFC" id="Combined-Shape"></path> </g> <g jetway-hook-id="CA4161A3-0523-4B26-8016-D846B7AD6514" id="Group-10" transform="translate(29.749621, 28.714095)" fill="#77AAF8"> <path d="M2.22220148,6.05827738 C-0.733844032,9.4753995 -0.319679249,14.607218 3.14744276,17.5202107 C6.61474361,20.4333535 11.8220301,20.0251911 14.7778608,16.6083173 C17.733844,13.1912672 17.3196792,8.05944863 13.8525572,5.146456 C10.3852882,2.23333984 5.17874789,2.64146233 2.22220148,6.05827738 Z M12.8794081,6.27139458 C15.7160725,8.65469187 16.0549363,12.8534739 13.636379,15.6492717 C11.2180332,18.444825 6.95750442,18.7787778 4.12059195,16.3952721 C1.28392753,14.0119748 0.945063705,9.81319276 3.36362097,7.01739496 C5.78261753,4.22181434 10.0425049,3.88789667 12.8794081,6.27139458 Z" jetway-hook-id="7027E108-5994-444C-A538-25E1893B51EC" id="Stroke-1" fill-rule="nonzero"></path> <path d="M5.68261234,11.1564023 C6.05790805,10.9836543 6.50424462,11.1434425 6.67953298,11.5132991 C7.11717709,12.4367237 7.86484556,13.0288489 8.56147974,13.057006 C9.25351428,13.0849963 9.99446453,12.5086788 10.2860754,11.6158858 C10.4129949,11.2273105 10.8355183,11.0137054 11.229808,11.1387854 C11.6240976,11.2638654 11.840844,11.6802653 11.7139246,12.0688407 C11.225881,13.56303 9.9044754,14.5908307 8.49999069,14.5340243 C7.1847226,14.4808629 5.97718167,13.5245359 5.32046702,12.1388748 C5.14517865,11.7690182 5.30731664,11.3291502 5.68261234,11.1564023 Z" jetway-hook-id="B40D8712-8E37-4CC4-9360-5A4C73296A65" id="Stroke-3" fill-rule="nonzero"></path> <path d="M13,5.94258851 C12.1158956,4.69634213 10.4311194,3.99676021 8.76667548,3.94537499 C7.10223155,3.89460887 5.4672344,4.42641495 4.05589252,5.20709884 C3.18931599,5.68628151 2.38023078,6.28680758 1.78498525,7.02725004 C1.47859856,7.40861505 1.21007201,7.83641249 1.06704482,8.28959299 C0.856009594,8.96255366 1.15117846,8.88949997 1.83967212,8.83811475 C4.33072909,8.65176594 6.7923393,8.18248886 9.14738022,7.4414273 C10.4710829,7.02601184 11.7597299,6.52454161 13,5.94258851" jetway-hook-id="354BD882-AA45-401B-BEF0-DA53ABEA7AEB" id="Fill-5"></path> <g jetway-hook-id="2B8DC94F-FFED-47D2-B1ED-136622670490" id="Group-9" transform="translate(4.000000, 0.000000)"> <path d="M2.81061883,4.75503791 C2.16691337,4.84487681 1.41569828,5.96582129 0.627970491,6.13665132 C0.72330922,6.11691399 -0.36801495,4.90136642 0.35006824,4.37730616 C1.06138982,3.85732948 1.93499008,3.54153213 2.75314513,3.23798554 C3.73628351,2.87386575 4.72347885,2.51859372 5.70391259,2.14562616 C6.66879461,1.77810338 7.61136332,1.35341039 8.58030231,0.998138369 C8.98058974,0.851129257 9.3889911,0.722496284 9.8055064,0.6272126 C10.3078942,0.511510984 10.8366522,0.445493003 11.3363353,0.572764781 C11.8360185,0.700717156 12.3032459,1.05530858 12.4486205,1.55282553 C12.6305079,2.17761426 12.2768756,2.83575227 11.8448086,3.31965727 C12.4959518,3.16448098 13.1754938,3.1290899 13.8394841,3.21688701 C14.2201628,3.26657064 14.6231549,3.37342449 14.8672491,3.6715263 C15.1106671,3.96962811 15.1370374,4.3936405 15.0761829,4.77545584 C14.8280318,6.31428733 13.4439298,7.36581084 12.1686898,8.25058791 C12.081465,8.31116111 11.9895071,8.3730955 11.8840259,8.38534626 C11.6960531,8.40712539 11.5317459,8.26556106 11.3917806,8.13692809 C8.86429002,5.8120062 7.99271823,4.0322431 2.81061883,4.75503791" jetway-hook-id="85E1A930-E96D-402E-85B8-CE9819F8D15C" id="Fill-7"></path> </g> </g> </g> </g> <path d="M95,56.75 C127.181864,56.75 160.493803,58.3211366 194.935841,61.4632993 L198.070049,61.7532784 L197.929951,63.2467216 C162.419387,59.9155336 128.109395,58.25 95,58.25 C62.743019,58.25 32.1954077,59.8308782 3.3572601,62.9923911 L1.08411575,63.2452681 L0.915884247,61.7547319 C30.4780445,58.4181563 61.8393825,56.75 95,56.75 Z" jetway-hook-id="5F489085-48F6-4160-AC18-4322F2EB2F02" id="Path-35" fill="#BBC0C7" fill-rule="nonzero"></path> <g jetway-hook-id="C77E9801-F22D-4F71-BD2B-650179A66387" id="Group-16" transform="translate(44.500000, 38.500000) rotate(-14.000000) translate(-44.500000, -38.500000) translate(32.000000, 30.000000)"> <path d="M8.47379613,-0.726359485 C6.22533146,-0.720600668 4.40402114,1.10070544 4.39825711,3.34917009 L4.37560179,12.2045686 C4.38133588,14.4443406 6.20011834,16.2538302 8.43796858,16.2481122 C10.6864332,16.2423398 12.5077436,14.4210337 12.5135076,12.172569 L12.5361629,3.31717055 C12.5306026,1.14527041 10.8202107,-0.62202996 8.67604381,-0.721918471 L8.47379613,-0.726359485 Z M8.47763795,0.773627043 C9.83068674,0.770170136 10.9404939,1.82032284 11.0303073,3.15131037 L11.0361629,3.33409071 L11.0135125,12.1687237 C11.0098645,13.5917644 9.85716742,14.7444588 8.43412676,14.7481121 C7.08107796,14.751569 5.97127082,13.7014163 5.88145736,12.3704288 L5.87560181,12.1876484 L5.89825218,3.35301538 C5.9019002,1.92997473 7.05459728,0.777280318 8.47763795,0.773627043 Z" jetway-hook-id="9C58E853-A834-4F27-9289-E7F446E62FC0" id="Rectangle" fill="#BDC1C6" fill-rule="nonzero" transform="translate(8.455882, 7.760876) rotate(-50.000000) translate(-8.455882, -7.760876) "></path> <circle jetway-hook-id="34D11793-C947-4799-8939-A91C1EAC8AF1" id="Oval" fill="#D2E3FC" cx="18.9602499" cy="10.861705" r="6"></circle> <path d="M13.768149,8.26511298 L13.7449828,8.24642317 C15.0505653,9.2372916 15.3056914,11.0989329 14.314823,12.4045153 C14.2557747,12.4823182 14.1929214,12.5571585 14.1264927,12.628763 C13.9116629,12.8603314 13.6729504,13.0578167 13.4174081,13.2206049 C13.1079404,12.5556324 12.9375514,11.8266341 12.9375514,11.0616407 C12.9375514,10.0424322 13.2400005,9.08711675 13.768149,8.26511298 Z" jetway-hook-id="B2D0A5F1-DB7F-47D9-BB38-3DF6D0976FFF" id="Combined-Shape" stroke="#FFFFFF" stroke-width="1.5" stroke-linejoin="round"></path> </g> <circle jetway-hook-id="58BFB6F9-7511-4BC4-A5A1-8ECDCD5D974C" id="Oval" fill="#E8EAED" cx="166.5" cy="27.5" r="4.5"></circle> <circle jetway-hook-id="6ADB3157-9AC8-4359-AA74-4D110894049E" id="Oval-Copy-3" fill="#9AA0A6" cx="17.5" cy="11.5" r="2.5"></circle> </g> </g> </g>
       </g>
 
-      <g id="nearby-device-visibility" fill="none" fill-rule="evenodd">
-        <path d="M0 0h200v200H0z"></path><path d="M150.441 100.728c0 26.949-21.772 48.794-48.63 48.794-26.858 0-48.63-21.845-48.63-48.794 0-26.95 21.772-48.795 48.63-48.795 26.858 0 48.63 21.845 48.63 48.795" fill="#D2E3FC"></path><path d="M176.711 53.44l-12.39-3.317a1.021 1.021 0 0 1-.722-1.25l3.32-12.383a1.022 1.022 0 0 1 1.252-.722l12.39 3.317c.544.146.868.707.722 1.251l-3.32 12.383a1.022 1.022 0 0 1-1.252.722" fill="#34A853"></path><path d="M31.832 148.371l-9.514 5.538c-3.553 2.068-4.77 6.644-2.72 10.223 2.053 3.584 6.603 4.813 10.161 2.742l9.514-5.538c3.48-2.026 4.718-6.454 2.844-9.998l-.124-.225c-2.053-3.584-6.603-4.813-10.161-2.742zm8.425 3.736c1.505 2.627.612 5.986-1.99 7.5l-9.514 5.539c-2.597 1.511-5.918.614-7.42-2.008-1.504-2.627-.61-5.986 1.991-7.5l9.514-5.539c2.529-1.471 5.743-.66 7.297 1.804l.122.204z" fill="#EA4335" fill-rule="nonzero"></path><path d="M26.693 54.6l-5.899-5.896a2.743 2.743 0 0 1-.711-2.653l2.159-8.054a2.745 2.745 0 0 1 1.943-1.941l8.058-2.158a2.75 2.75 0 0 1 2.655.71l5.9 5.896c.693.694.965 1.705.71 2.653L39.35 51.21a2.746 2.746 0 0 1-1.943 1.942l-8.058 2.158a2.751 2.751 0 0 1-2.655-.71" fill="#FBBC05"></path><path d="M26.536 141.312l-5.553-4.145a.552.552 0 0 1-.113-.773l4.149-5.55a.552.552 0 0 1 .773-.112l5.554 4.145a.552.552 0 0 1 .112.773l-4.149 5.55a.552.552 0 0 1-.773.112" fill="#F882FF"></path><path d="M102.004 29.332c-39.453 0-71.437 31.965-71.437 71.396 0 39.43 31.984 71.395 71.437 71.395 39.453 0 71.437-31.965 71.437-71.395 0-39.431-31.983-71.396-71.437-71.396zm0 2c38.35 0 69.437 31.07 69.437 69.396s-31.088 69.395-69.437 69.395-69.437-31.07-69.437-69.395c0-38.326 31.088-69.396 69.437-69.396z" fill="#4285F4" fill-rule="nonzero"></path><path d="M104.18 73.085a8.864 8.864 0 0 0-4.738 0l-19.099 7.12c-1.232.342-2.075 1.387-2.075 2.572v14.13c0 11.668 5.686 22.805 15.688 29.978 3.332 2.39 6.297 3.737 7.855 3.737 1.558 0 4.523-1.348 7.855-3.737 10.003-7.173 15.688-18.31 15.688-29.977V82.777c0-1.185-.842-2.23-2.075-2.573l-19.099-7.12z" fill="#4285F4"></path><path d="M101.768 94.59c-3.19 0-5.789 2.668-5.789 5.945 0 3.276 2.599 5.945 5.79 5.945 3.19 0 5.789-2.669 5.789-5.945 0-3.277-2.6-5.945-5.79-5.945zm-.193 9.115c-1.81 0-3.28-1.51-3.28-3.368 0-1.86 1.47-3.37 3.28-3.37 1.81 0 3.281 1.51 3.281 3.37 0 1.859-1.47 3.368-3.28 3.368zm.193-12.682c-6.14 0-11.384 3.944-13.508 9.512 2.124 5.567 7.368 9.512 13.508 9.512 6.14 0 11.384-3.945 13.509-9.512-2.125-5.568-7.368-9.512-13.509-9.512zm-.193 16.646c-4.726 0-8.942-2.763-11-7.134 2.058-4.371 6.274-7.134 11-7.134 4.727 0 8.942 2.763 11 7.134-2.058 4.37-6.273 7.134-11 7.134z" fill="#FFF" fill-rule="nonzero"></path>
+      <g id="nearby-device-visibility-light" fill="none" fill-rule="evenodd">
+        <path d="M102.293 143.27C126.19 143.27 145.563 123.897 145.563 100C145.563 76.1028 126.19 56.7302 102.293 56.7302C78.3955 56.7302 59.023 76.1028 59.023 100C59.023 123.897 78.3955 143.27 102.293 143.27Z" fill="#D2E3FC"/><path d="M172.025 45.479L161.088 42.5486C160.606 42.4194 160.111 42.7055 159.982 43.1876L157.055 54.1088C156.926 54.5909 157.212 55.0864 157.694 55.2156L168.631 58.146C169.113 58.2752 169.608 57.9891 169.738 57.507L172.664 46.5858C172.793 46.1037 172.507 45.6082 172.025 45.479Z" fill="#34A853"/><path d="M48.3131 145.305L48.2866 145.259C46.7159 142.539 43.2373 141.607 40.5169 143.177L32.028 148.078C29.3076 149.649 28.3755 153.128 29.9461 155.848L29.9727 155.894C31.5433 158.615 35.0219 159.547 37.7424 157.976L46.2313 153.075C48.9517 151.504 49.8838 148.026 48.3131 145.305Z" stroke="#EA4335" stroke-width="2" stroke-linejoin="round"/><path d="M35.4213 59.1755L30.2119 53.9661C29.9161 53.6629 29.7061 53.2866 29.6034 52.8757C29.5007 52.4647 29.5089 52.0339 29.6273 51.6272L31.4878 44.5041C31.6155 44.0911 31.8419 43.7155 32.1476 43.4098C32.4532 43.1041 32.8288 42.8776 33.2418 42.75L40.365 40.8895C40.7717 40.7711 41.2025 40.7629 41.6134 40.8656C42.0244 40.9683 42.4006 41.1784 42.7038 41.4742L47.9132 46.6836C48.2182 46.9925 48.4374 47.3756 48.5493 47.795C48.6611 48.2145 48.6617 48.6559 48.5511 49.0756L46.6375 56.1987C46.52 56.6024 46.3024 56.97 46.0051 57.2674C45.7077 57.5647 45.3402 57.7822 44.9364 57.8997L37.8134 59.8133C37.3936 59.924 36.9522 59.9234 36.5327 59.8115C36.1133 59.6997 35.7303 59.4804 35.4213 59.1755Z" fill="#FBBC04"/><path d="M38.9875 130.96L34.0926 127.298C33.881 127.14 33.5812 127.183 33.423 127.395L29.7738 132.273C29.6156 132.484 29.6587 132.784 29.8703 132.942L34.7652 136.604C34.9768 136.762 35.2765 136.719 35.4348 136.508L39.0839 131.63C39.2422 131.418 39.1991 131.118 38.9875 130.96Z" fill="#EE5FFA"/><path d="M102.293 162.566C136.847 162.566 164.859 134.554 164.859 100C164.859 65.4459 136.847 37.4342 102.293 37.4342C67.7386 37.4342 39.727 65.4459 39.727 100C39.727 134.554 67.7386 162.566 102.293 162.566Z" stroke="#4285F4" stroke-width="2" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M104.419 75.654L121.429 81.9797C121.95 82.0983 122.416 82.3877 122.753 82.802C123.091 83.2162 123.279 83.7314 123.29 84.2654V96.8105C123.29 107.123 118.187 117.01 109.31 123.389C106.333 125.515 103.675 126.685 102.293 126.685C100.911 126.685 98.2529 125.515 95.2761 123.389C86.3989 117.01 81.2958 107.123 81.2958 96.8105V84.2654C81.3062 83.7314 81.495 83.2162 81.8322 82.802C82.1694 82.3877 82.6355 82.0983 83.1563 81.9797L100.167 75.654C101.562 75.3007 103.024 75.3007 104.419 75.654ZM113.403 99.9999C113.403 106.136 108.429 111.11 102.293 111.11C96.157 111.11 91.183 106.136 91.183 99.9999C91.183 93.8642 96.157 88.8901 102.293 88.8901C108.429 88.8901 113.403 93.8642 113.403 99.9999Z" fill="#4285F4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M105.287 100.037C105.287 101.69 103.946 103.031 102.293 103.031C100.639 103.031 99.2989 101.69 99.2989 100.037C99.2989 98.3834 100.639 97.0429 102.293 97.0429C103.946 97.0429 105.287 98.3834 105.287 100.037ZM103.291 100.037C103.291 100.588 102.844 101.035 102.293 101.035C101.742 101.035 101.295 100.588 101.295 100.037C101.295 99.4857 101.742 99.0389 102.293 99.0389C102.844 99.0389 103.291 99.4857 103.291 100.037ZM102.293 106.025C106.617 106.025 109.611 104.029 111.275 100.037C109.279 96.0449 106.285 94.049 102.293 94.049C98.3009 94.049 95.3069 96.0449 93.3109 100.037C94.9742 104.029 97.9682 106.025 102.293 106.025ZM102.293 96.0449C105.224 96.0449 107.414 97.3364 109.043 100.106C107.66 102.778 105.494 104.029 102.293 104.029C99.0915 104.029 96.9261 102.778 95.5423 100.106C97.1716 97.3364 99.3614 96.0449 102.293 96.0449Z" fill="#4285F4"/>
       </g>
 
-      <g id="nearby-onboarding-splash" fill="none" fill-rule="evenodd">
-        <path d="M0 0h200v200H0z"/><path d="M110.893 164.142l-6.065 12.062c1.606.235 2.96.506 4.06.814 4.544 1.27 10.262 2.852 15.561 5.64 7.226 3.802 10.566 4.087 10.02.856-3.964-3.923-4.913-5.674-2.848-5.254 2.065.42 5.403 1.107 10.015 2.062.624-.243.804-.791.539-1.644-.208-.67-3.266-2.054-4.064-3.237-.146-.216.396-.215 1.624.003 2.632.41 4.12.547 4.465.41 1.163-.466-.097-2.017-.003-2.827.054-.468.801-.549 1.216-.806.288-.179.267-.554.36-.741.42-.842-3.068-1.44-2.8-2.494.274-1.075 4.274-2.606 1.607-3.406-5.282-1.583-10.813.808-16.629.56-3.877-.166-9.563-.832-17.058-1.998z" fill="#D2E3FC"/><path d="M141.354 171.58l.57.095 1.311.246c1.522.274 1.905.19 2.129-.434.02-.056-.109-.25-.638-.581-.664-.415-1.721-.839-3.074-1.237a.805.805 0 1 1 .454-1.543l.57.174c3.14.992 4.78 2.126 4.204 3.732-.561 1.563-1.636 1.851-3.696 1.512l-1.341-.249c-.275-.05-.504-.09-.735-.126a12.992 12.992 0 0 0-2.067-.174 32.862 32.862 0 0 0-4.908.396.806.806 0 0 1-.92-.672.803.803 0 0 1 .673-.918 34.47 34.47 0 0 1 5.148-.414c.753-.002 1.497.064 2.32.193z" fill="#4682F4" fill-rule="nonzero"/><path d="M134.892 176.05a.803.803 0 1 1 .003-1.609l1.163.008c.546.006.966.015 1.232.028l.092.005a18.507 18.507 0 0 1 2.379.322l.654.138c.519.115 1.48.336 1.707.384l.395.079c1.162.217 1.48.119 1.591-.306.206-.791-.878-1.532-3.807-2.045a.804.804 0 1 1 .276-1.585c3.753.658 5.634 1.944 5.09 4.037-.428 1.64-1.63 1.868-3.876 1.394l-1.942-.436a18.28 18.28 0 0 0-2.16-.345l-.401-.031-.424-.016a88.28 88.28 0 0 0-1.972-.022z" fill="#4682F4" fill-rule="nonzero"/><path d="M141.644 179.567c.18-.31.013-.618-.823-1.159-1.14-.736-3.19-1.51-6.125-2.293a.806.806 0 0 1-.571-.986.803.803 0 0 1 .984-.57c3.084.825 5.27 1.649 6.583 2.498 1.565 1.01 2.102 2.273 1.225 3.504-.514.722-1.262.731-2.752.368l-.552-.143c-.57-.153-1.557-.428-1.585-.435a32.331 32.331 0 0 0-2.211-.532 19.356 19.356 0 0 0-1.642-.258c-1.193-.132-2.08-.185-2.641-.16l-.234.016-.035.06a.798.798 0 0 1-.223.222l-.095.054a.805.805 0 0 1-1.075-.374c-.503-1.04.296-1.495 1.408-1.576.672-.05 1.687.005 3.07.158.58.065 1.169.158 1.778.28.61.12 1.21.262 1.896.443l2.295.625c.494.126.85.198 1.108.22l.186.012c.018.002.028.006.031.013v.013zm-13.848-1.352a.806.806 0 0 1-1.006-.534c-.452-1.475-.264-2.833.571-3.995.9-1.253 2.656-2.153 5.813-3.27l3.54-1.22.187-.068c.695-.257 1.397-.438 2.698-.713l1.718-.36c1.35-.292 2.061-.494 2.677-.773.748-.34.941-.604.836-.965-.172-.587-3.21-.75-7.838-.247l-.935.106c-.32.038-.647.079-.985.122l-5.142.7c-.596.077-1.065.135-1.254.15-2.193.181-7.982-.704-17.529-2.658a.804.804 0 1 1 .323-1.576l2.02.409c8.168 1.631 13.228 2.373 15.054 2.223l.305-.033c1.269-.15 5.264-.712 5.497-.742l1.029-.132c.332-.04.656-.08.973-.116l1.221-.13c5.403-.544 8.286-.313 8.807 1.474.376 1.29-.324 2.248-1.715 2.88l-.285.122c-.624.255-1.323.45-2.45.7l-2.466.52c-.771.17-1.286.304-1.735.454l-1.52.534c-1.005.347-2.173.743-2.13.728-3.045 1.058-4.745 1.9-5.405 2.818-.533.743-.649 1.579-.34 2.588a.804.804 0 0 1-.534 1.004z" fill="#4682F4" fill-rule="nonzero"/><path d="M135.161 182.503c.791 1.153.728 2.38-.312 3.488-1.426 1.52-4.087.752-10.188-2.074l-3.96-1.853a66.2 66.2 0 0 0-2.227-.987c-3.772-1.591-8.276-2.854-13.51-3.787a.806.806 0 0 1-.652-.933.803.803 0 0 1 .932-.652c5.064.903 9.474 2.113 13.233 3.632l.62.257c.83.349 1.486.641 2.657 1.185l3.215 1.507 1.046.481c4.608 2.09 7.048 2.774 7.66 2.122.511-.545.531-.935.16-1.477-.356-.519-.985-1.053-2.102-1.825l-.786-.532c-1.524-1.024-2.835-2.028-3.934-3.013a.805.805 0 1 1 1.072-1.198 33.243 33.243 0 0 0 3.277 2.548l1.027.695c1.343.913 2.13 1.548 2.662 2.262l.11.154z" fill="#4682F4" fill-rule="nonzero"/><path d="M92.163 196.078c.982.182 2.643.273 3.633.406.83.112 1.619-.175 2.423-.405.803-.232.747-.847.919-1.664.695-.113 1.406-.232 2.02-.574.616-.342 1.125-.96 1.137-1.661.007-.395-.558-.19-.444-.568.073-.236.66-1.04.785-1.255.527-.906.161-2.213-.76-2.716.363-.226.476-.726.358-1.135-.118-.409-.42-.74-.742-1.018-2.532-2.183-6.36-1.812-9.443-3.116.583-.446 1.347-.564 2.022-.851.675-.287 1.338-.898 1.241-1.624-.073-.554-.585-.969-1.125-1.117-.542-.148-1.115-.088-1.674-.049-3.745.265-7.532-.417-11.249.108-.252.037-.515.083-.717.238-.27.21-3.883-1.106-3.963-.774-.482 1.974-7.031-4.966-7.839-4.154-.807.812-11.512 9.186-11.706 10.15-.164.811 14.052 7.893 15.264 8.424 2.096.917 12.76 2.606 14.612 2.948 1.548.287 3.7.12 5.248.407z" fill="#D2E3FC"/><path d="M87.628 192.91a.806.806 0 0 1 .445-1.548c4.335 1.25 7.827 1.874 10.84 1.8.923-.021 1.458-.12 1.76-.356.22-.172.26-.694.048-.846a.806.806 0 0 1-.184-1.124.803.803 0 0 1 1.122-.185c1.153.829 1.014 2.634.003 3.425-.67.523-1.447.667-2.71.697-3.209.078-6.845-.572-11.324-1.863zm-.619-10.486a.806.806 0 0 1 .433-1.551l.341.091c1.706.442 6.23 1.446 7.773 1.731.713.132 1.388.288 2.361.538l.836.219c1.116.292 1.938.623 2.638 1.14.524.388.923.874 1.114 1.442.183.543.153 1.141-.125 1.632-.527.932-1.542 1.258-2.914 1.245a10.974 10.974 0 0 1-1.039-.064l-1.324-.156c-.403-.053-.82-.12-1.435-.226l-1.496-.259-1.511-.258a35.12 35.12 0 0 1-3.64-.82.806.806 0 0 1 .433-1.552c1.282.359 2.228.567 3.841.848l3.05.523c.51.085.867.137 1.248.183l.719.084c.47.055.826.083 1.169.086.843.008 1.344-.153 1.5-.428.038-.067.044-.192 0-.324-.074-.22-.266-.454-.545-.66-.445-.328-1.011-.573-1.789-.795l-.8-.214-.913-.233c-.55-.136-1-.238-1.446-.324l-.639-.122c-2.01-.396-6.554-1.415-7.84-1.776z" fill="#4285F4" fill-rule="nonzero"/><path d="M88.364 189.969a.806.806 0 0 1 .423-1.554c2.262.617 6.487 1.543 8.684 1.896 1.54.248 2.447.295 3.257.092.322-.081.51-.183.722-.395.12-.119.2-.406.171-.674-.037-.348-.215-.568-.462-.665l-.096-.03a.806.806 0 0 1 .39-1.563c.924.232 1.649.99 1.767 2.084.078.723-.14 1.497-.636 1.99-.425.423-.87.666-1.466.815-1.087.273-2.155.217-3.902-.064-2.255-.362-6.536-1.3-8.852-1.932zm-20.049-15.742a.806.806 0 0 1-.207-1.12.803.803 0 0 1 1.118-.207l.719.491c5.425 3.677 8.916 5.295 10.089 4.886 1.98-.69 3.677-.83 6.624-.68l4.398.28.608.03.294-.001.671-.012c.994-.007 1.669.11 2.315.521.71.453 1.16 1.257 1.056 2.078-.074.587-.414 1.102-.902 1.477-.446.344-1.076.6-1.943.84l-.503.13c-.52.126-1.46.338-1.569.365a.805.805 0 0 1-.394-1.562l1.556-.361.211-.052c.82-.212 1.391-.428 1.662-.637.172-.132.272-.284.287-.401.02-.154-.107-.38-.325-.518-.287-.183-.648-.259-1.235-.268l-.204-.001-.804.013c-.117 0-.213 0-.312-.004l-1.364-.076-2.767-.185c-3.14-.198-4.788-.125-6.595.465l-.237.08c-1.954.681-5.89-1.188-12.247-5.571zm-11.4 11.051a.806.806 0 0 1 .89-1.342c5.989 3.979 11.392 6.766 16.202 8.364l.532.172c3.514 1.113 6.104 1.57 11.318 2.09l4.4.419c1.719.173 2.897.325 4.1.538l.242.044c1.209.22 1.785.266 2.39.132.619-.137 1.118-.537 1.264-.985l.028-.113a.804.804 0 1 1 1.581.295c-.221 1.193-1.273 2.098-2.527 2.376-.756.167-1.398.149-2.457-.022l-1.265-.22c-1.168-.191-2.397-.337-4.238-.513l-2.742-.256c-5.96-.571-8.723-1.028-12.579-2.25-5.1-1.614-10.81-4.525-17.139-8.73z" fill="#4285F4" fill-rule="nonzero"/><g fill-rule="nonzero"><path d="M78.868 136.46l-.531.008c-.323.008-.621.021-.894.039l-.49.038-.12.016-9.915.101-.382-.018c-3.068-.115-6.78.197-10.366 1.302-2.21.682-4.172 1.626-5.815 2.868-3.822 2.89-5.187 7.466-6.244 17.638-.966 9.309 1.07 16.723 5.068 22.384a24.107 24.107 0 0 0 3.667 4.132c.76.675 1.36 1.117 1.72 1.34.266.167.602.16.861-.005l.093-.07 14.23-12.368c.335-.292.37-.8.078-1.135a.806.806 0 0 0-1.049-.144l-.087.066-13.753 11.953-.117-.088c-.21-.16-.432-.341-.667-.542l-.24-.209a22.505 22.505 0 0 1-3.42-3.857c-3.777-5.348-5.707-12.376-4.781-21.291l.161-1.49c.988-8.676 2.303-12.65 5.453-15.032 1.481-1.12 3.276-1.983 5.318-2.613 3.194-.985 6.534-1.306 9.34-1.247l.704.024.18.009 10.07-.106.264-.026.102-.008c.311-.025.67-.044 1.071-.054a25.64 25.64 0 0 1 3.7.18c3.7.447 7.071 1.653 9.76 3.825 1.895 1.531 3.246 3.777 4.756 7.685l.373.991c.454 1.273 3.058 8.852 4.112 11.6a.805.805 0 0 0 .544.49l.109.02 8.336 1.035-7.493 14.353-.253-.054c-2.408-.554-5.444-2.118-9.083-4.702l-.422-.302c-4.065-2.937-5.343-7.106-3.845-12.686a.806.806 0 0 0-1.556-.416c-1.663 6.198-.174 11.06 4.457 14.405 4.444 3.21 8.108 5.03 11.03 5.445a.81.81 0 0 0 .77-.329l.058-.096 8.3-15.901a.804.804 0 0 0-.513-1.15l-.101-.02-9.004-1.117-.494-1.347a368.1 368.1 0 0 1-.94-2.636l-2.547-7.277c-1.739-4.697-3.268-7.372-5.58-9.24-2.953-2.386-6.604-3.692-10.58-4.173a27.422 27.422 0 0 0-3.403-.198z" fill="#4285F4"/><path d="M61.551 153.314l-.1.002a.805.805 0 0 0-.742.764l.002.1 1.185 15.019a.802.802 0 0 0 .285.552l.087.064 6.522 4.123a.803.803 0 1 0 .95-1.294l-.088-.065-6.18-3.908-1.156-14.617a.805.805 0 0 0-.657-.728l-.108-.012z" fill="#4682F4"/><path d="M63.276 165.48a.805.805 0 0 0-.101 1.601l.101.007h22.233a.805.805 0 0 0 .101-1.602l-.1-.006H63.275z" fill="#4682F4"/></g><path d="M69.765 131.356h5.865l1.533 6.908c-.569 1.266-2.293 2.186-4.332 2.186-2.094 0-3.855-.97-4.376-2.287l1.31-6.807z" fill="#CFE3FF"/><path d="M75.63 130.552h-5.865a.805.805 0 0 0-.791.652l-1.31 6.807a.803.803 0 0 0 .042.447c.666 1.684 2.762 2.796 5.125 2.796 2.296 0 4.343-1.05 5.067-2.661a.803.803 0 0 0 .051-.503l-1.533-6.908a.805.805 0 0 0-.786-.63zm-.647 1.608l1.329 5.987-.027.046c-.557.839-1.897 1.453-3.454 1.453l-.228-.004c-1.506-.058-2.771-.69-3.272-1.52l-.036-.065 1.135-5.897h4.553z" fill="#4285F4" fill-rule="nonzero"/><path d="M76.445 122.877a6.147 6.147 0 0 1 .694 8.688 6.202 6.202 0 0 1-8.72.692 6.147 6.147 0 0 1-.694-8.689 6.202 6.202 0 0 1 8.72-.69z" fill="#CFE3FF"/><path d="M67.112 123.046a6.95 6.95 0 0 0 .785 9.823 7.008 7.008 0 0 0 9.855-.781 6.95 6.95 0 0 0-.785-9.823 7.008 7.008 0 0 0-9.855.781zm8.811.444a5.344 5.344 0 0 1 .604 7.553 5.396 5.396 0 0 1-7.587.601 5.344 5.344 0 0 1-.603-7.553 5.396 5.396 0 0 1 7.586-.601z" fill="#4285F4" fill-rule="nonzero"/><path fill="#4285F4" d="M66.246 124.853h11.057l-.299-2.25-4.155-1.117-2.297.041-2.571 1.65z"/><path d="M81.62 121.472c-.335.523-.8 1.009-1.21 1.469l-1.697 1.912h-6.757l2.306-2.545c1.127-1.244 1.971-2.238 3.384-3.065 1.483-.869 3.377-1.116 4.163.034l.024.037c.355.55.274 1.401-.212 2.158" fill="#0F3EC1"/><path d="M69.625 127.974c.4-.082.79.147.921.52l.03.106c.083.405.424.766.824.886l.121.03a.804.804 0 1 1-.275 1.584 2.827 2.827 0 0 1-2.249-2.178.804.804 0 0 1 .628-.948z" fill="#4285F4" fill-rule="nonzero"/><g transform="translate(87.766 169.167)"><path d="M0 12.79L2.687 1.536A2 2 0 0 1 4.632 0h11.823a2 2 0 0 1 1.928 2.533l-3.88 14.02L0 12.79z" fill="#4682F4"/><ellipse fill="#FFF" cx="6.285" cy="2.818" rx="1.007" ry="1.001"/></g><path d="M89.666 149.902c.488.11.795.595.685 1.082l-.412 1.874a39.22 39.22 0 0 0-.172.87 23.414 23.414 0 0 0-.372 2.834c-.129 2.02-.374 3.896-.757 5.674-.484 2.245-1.087 3.591-2.423 4.63a.907.907 0 0 1-1.271-.159.904.904 0 0 1 .158-1.27c.909-.706 1.363-1.72 1.764-3.582.318-1.475.537-3.028.67-4.69l.05-.72c.053-.81.153-1.625.303-2.51l.154-.84c.123-.641.252-1.23.54-2.509a.906.906 0 0 1 .97-.702l.113.018zM159.996 35.664h-5.559a.805.805 0 0 0-.737.48l-1.71 3.862a.804.804 0 0 0 .734 1.13l9.034.036a.804.804 0 0 0 .737-1.135l-1.765-3.9a.805.805 0 0 0-.734-.473zm-.522 1.608l1.036 2.286-6.55-.027 1.001-2.26h4.513z" fill="#4285F4" fill-rule="nonzero"/><path d="M161.948 41.21l-.376-.071-1.578.03c-2.899.047-5.226.04-6.982-.021l-.323-.012c-12.927-.517-20.131 5.42-29.147 22.158a.804.804 0 0 1-.397.36l-.105.036-19.632 5.21 5.93 13.082.087.008c7.582.697 14.44-1.076 20.608-5.325l.439-.308c6.424-4.572 10.44-10.685 12.07-18.37a.805.805 0 0 1 1.576.333c-1.714 8.08-5.959 14.541-12.71 19.347-6.75 4.804-14.327 6.763-22.696 5.868a.806.806 0 0 1-.599-.374l-.05-.094-6.515-14.37a.803.803 0 0 1 .427-1.074l.1-.034 20.214-5.364.112-.206c8.97-16.498 16.507-22.78 29.546-22.514l1.744.054c1.767.045 4.052.043 6.855-.007l1.075-.021.147.01.31.056.39.08c.139.028.286.06.443.096.888.203 1.871.466 2.924.799 3.008.95 5.976 2.264 8.694 4.002 7.825 5.004 12.045 12.458 10.865 22.73-1.18 10.273-7.632 17.093-17.468 21.09-3.416 1.388-7.007 2.33-10.556 2.913a49.07 49.07 0 0 1-3.42.443l-.511.043-.742.049a.806.806 0 0 1-.826-.478l-.037-.104-5.588-19.616a.806.806 0 1 1 1.512-.542l.038.103 5.41 18.992.344-.026.251-.023a47.465 47.465 0 0 0 3.307-.428c3.438-.564 6.915-1.477 10.21-2.816 9.339-3.794 15.371-10.171 16.475-19.784 1.105-9.613-2.793-16.499-10.132-21.192-2.588-1.655-5.43-2.913-8.311-3.823a36.183 36.183 0 0 0-2.365-.662l-.431-.102a25.57 25.57 0 0 0-.606-.13z" fill="#4285F4" fill-rule="nonzero"/><g fill="#4285F4" fill-rule="nonzero"><path d="M152.34 90.536c.23.38.11.875-.27 1.106l-3.443 2.127-.68.406-.49.283c-1.488.848-3.158 1.685-5.746 2.87l-.569.254c-1.158.505-1.873.71-2.765.739-1.447.046-2.845-.649-3.411-1.88a.804.804 0 1 1 1.408-.77l.053.096c.268.583 1.048.97 1.899.944.696-.022 1.31-.216 2.46-.732l.256-.116c2.689-1.231 4.354-2.072 5.857-2.94l.451-.265.52-.312c.554-.34 2.592-1.611 3.366-2.081a.803.803 0 0 1 1.104.27z"/><path d="M145.072 91.074a.806.806 0 0 1-.333 1.09l-3.63 1.972c-.836.448-1.504.79-2.17 1.108-1.928.919-3.64 1.517-5.47 1.857-1.122.208-2.188.11-3.06-.383-1.26-.711-1.826-2.492-.811-3.658a.803.803 0 0 1 1.134-.078c.335.292.37.8.078 1.136-.266.306-.063.942.388 1.197.502.283 1.196.347 1.977.202 1.68-.312 3.263-.865 5.073-1.727l.484-.236a59.293 59.293 0 0 0 1.936-1.01l2.845-1.551.471-.253a.804.804 0 0 1 1.088.334z"/><path d="M143.99 88.052a.806.806 0 0 1-.31 1.095l-.713.41-1.405.829c-.92.536-1.538.866-2.245 1.187-1.85.84-3.59 1.482-5.303 1.933l-.75.186-.715.166c-.634.14-1.054.204-1.551.231-1.406.08-2.565-.275-3.268-1.278-.648-.92-.53-2.234.165-3.135 1.224-1.586 3.911-2.467 7.583-2.904a.805.805 0 0 1 .19 1.6c-3.254.387-5.635 1.168-6.501 2.289-.288.373-.336.919-.122 1.224.318.453.954.647 1.863.596.446-.025.84-.09 1.529-.249l.633-.15c1.79-.428 3.615-1.083 5.583-1.976l.35-.164c.58-.278 1.156-.598 2.01-1.1l.97-.575c.368-.217.627-.366.912-.526a.803.803 0 0 1 1.094.31zm4.263-12.866a.805.805 0 0 1-.813.795c-3.483-.04-7.396.654-12.402 2.014l-.606.167c-1.284.355-1.901.552-2.54.843l-.138.064c-.477.225-.785.44-.974.692-.176.233-.227.516-.15.683.127.274.612.423 1.446.41l.718-.03 6.73-.366a.805.805 0 0 1 .068 1.609l-2.754.145-3.532.2c-.362.018-.663.033-.963.046-1.563.066-2.662-.23-3.172-1.338-.347-.75-.185-1.651.324-2.328.377-.501.881-.854 1.572-1.18.695-.329 1.291-.536 2.39-.85l.546-.153c5.433-1.507 9.646-2.283 13.456-2.238.444.005.8.37.794.815z"/><path d="M142.915 84.726c.21.392.062.88-.33 1.09-4.438 2.373-7.59 3.063-12.93 2.921-.825-.022-1.339-.085-1.886-.289-.766-.285-1.391-.839-1.654-1.57-.431-1.202.238-2.558 1.377-3.236.584-.347 1.188-.525 2.052-.654l.856-.11c4.22-.512 6.293-1.111 10.039-2.917a.806.806 0 0 1 .698 1.451c-3.594 1.733-5.781 2.42-9.528 2.935l-1.56.197c-.827.107-1.321.237-1.736.483-.531.317-.826.913-.685 1.306.088.243.348.474.7.605.337.125.71.171 1.37.189 5.07.134 7.946-.495 12.13-2.732a.804.804 0 0 1 1.087.33z"/></g><path d="M142.765 48.928a.806.806 0 0 1 1.475.646c-.578 1.314-.63 2.915-.27 4.932l.073.382c.063.317.123.59.218 1.007l.38 1.656c.312 1.414.436 2.243.471 3.256l.007.314c.002.16 0 .333-.002.54l-.016 1.037c-.001.648.026 1.024.106 1.448.173.915.67 1.642 1.244 1.851l.059.017 7.962.085c7.285.062 11.603.047 12.686-.037l.063-.006.01-.03c.035-.143.06-.348.067-.61l.003-.166c.003-.9-.166-2.256-.508-4.05a.804.804 0 0 1 1.582-.301l.12.645c.697 3.868.621 5.743-.748 6.057l-.131.023c-1.028.134-5.758.155-14.565.071l-6.666-.073-.17-.02c-1.35-.31-2.299-1.612-2.59-3.158l-.054-.314c-.067-.462-.086-.912-.08-1.618l.017-1.052c.002-.173.001-.319-.002-.46l-.004-.138c-.035-1.026-.18-1.875-.58-3.608l-.273-1.183c-.063-.279-.11-.498-.157-.728l-.028-.14c-.498-2.492-.473-4.516.301-6.275z" fill="#4285F4" fill-rule="nonzero"/><g transform="translate(161.459 2.303)"><mask id="b" fill="#fff"><path id="a" d="M.008.144h30.71v26.652H.007z"/></mask><path d="M.031 21.66c.255-2.568 2.554-4.442 5.135-4.182a4.682 4.682 0 0 1 3.421 2.037 4.695 4.695 0 0 1-.024-1.107c.255-2.568 2.554-4.442 5.13-4.181l.028.003c.964.097 1.783-.638 1.842-1.6.008-.125.02-.251.038-.378.31-2.172 2.166-3.863 4.365-4a4.6 4.6 0 0 1 1.472.143c.975.258 1.933-.483 1.994-1.484l.21-3.452c.163-2.651 3.1-4.178 5.379-2.795 2.277 1.383 2.258 4.683-.036 6.04l-3.811 2.254a1.61 1.61 0 0 0-.644 2.053c.325.718.47 1.527.384 2.366-.256 2.563-2.555 4.436-5.13 4.181l-.03-.003c-.942-.095-1.791.605-1.839 1.546a4.692 4.692 0 0 1-5.151 4.419 4.692 4.692 0 0 1-3.423-2.037c.05.36.064.73.026 1.107-.256 2.563-2.556 4.436-5.135 4.183-2.575-.26-4.457-2.55-4.201-5.113" fill="#4285F4" mask="url(#b)"/></g><path d="M161.475 26.911a6.484 6.484 0 0 1 .733 9.17c-2.341 2.733-6.464 3.06-9.21.73a6.486 6.486 0 0 1-.733-9.17 6.554 6.554 0 0 1 9.21-.73" fill="#FFF"/><path d="M151.653 27.118a7.289 7.289 0 0 0 .823 10.305c3.084 2.618 7.715 2.25 10.344-.82a7.288 7.288 0 0 0-.823-10.305c-3.084-2.617-7.714-2.25-10.344.82zm9.3.406a5.681 5.681 0 0 1 .643 8.034 5.747 5.747 0 0 1-8.076.64 5.683 5.683 0 0 1-.643-8.035 5.748 5.748 0 0 1 7.884-.796l.193.157z" fill="#4285F4" fill-rule="nonzero"/><path d="M163.92 32.616c.85-1.668-2.037-5.655-4.051-6.672-2.014-1.018-6.642-.056-7.493 1.612 1.71 1.768 8.243 4.389 10.677 4.884l.866.176z" fill="#4285F4"/><path d="M150.526 32.93a.806.806 0 0 1 1.043.18l.063.09c.277.454.758.755 1.199.755.442 0 .862-.225 1.05-.542l.05-.098a.806.806 0 0 1 1.485.623c-.418.994-1.478 1.625-2.585 1.625-1.034 0-2.02-.616-2.575-1.529a.803.803 0 0 1 .27-1.104z" fill="#4285F4" fill-rule="nonzero"/><path d="M167.507 66.135a.805.805 0 0 1 .433 1.546l-.106.029-20.582 4.257a.805.805 0 0 1-.432-1.546l.105-.029 20.582-4.257z" fill="#4682F4" fill-rule="nonzero"/><g fill="#4285F4" fill-rule="nonzero"><path d="M95.347 77.103a.806.806 0 0 1 .962-.61.803.803 0 0 1 .609.96c-.48 2.136-1.868 4.347-3.66 5.503l-.812.482c-.59.355-.932.637-1.146.966-.101.156-.136.288-.122.348.017.073.188.191.419.21.282.025.594-.046 1.156-.249l.903-.328c5.416-1.995 8.043-3.418 9.986-5.892.551-.702.944-1.426 1.083-2.05a.806.806 0 0 1 .961-.61.803.803 0 0 1 .61.959c-.199.893-.7 1.818-1.388 2.693-2.248 2.863-5.135 4.386-11.143 6.572l-.469.17c-.768.277-1.258.389-1.84.339-.864-.074-1.65-.615-1.845-1.443-.129-.545.019-1.102.34-1.595.335-.515.773-.902 1.414-1.312l.474-.287.375-.218c1.483-.863 2.725-2.788 3.133-4.608z"/><path d="M83.987 77.326c1.354-2.038 3.087-3.135 6.81-4.776l.392-.172c4.907-2.135 8.03-3.214 11.302-3.63a.803.803 0 1 1 .201 1.596c-3.076.39-6.09 1.432-10.862 3.509l-.714.315c-3.208 1.434-4.7 2.408-5.788 4.047-.354.533-.485 1.327-.337 2.025l.664 3.258c.478 2.406.985 5.058 1.1 5.804l.012.086c.109.792.274 1.145.438 1.154.259.015.718-.6 1.018-1.502.282-.847.3-1.733.109-3.212l-.21-1.433-.089-.5c-.05-.3-.087-.59-.11-.867-.137-1.667.196-2.735.589-3.205.616-.928 1.614-1.338 3.586-1.714l1.785-.313c.724-.13 1.088-.217 1.48-.347a.804.804 0 1 1 .505 1.527l-.233.074c-.464.14-.93.237-1.847.396l-.827.142-.537.098c-1.44.277-2.2.563-2.56 1.01l-.06.081c-.175.213-.379.866-.276 2.117.013.154.03.314.054.48l.143.835.16 1.09c.265 1.893.265 3.047-.135 4.247-.517 1.553-1.354 2.675-2.64 2.602-1.18-.067-1.645-.843-1.877-2.15l-.11-.699c-.251-1.478-1.239-6.519-1.707-8.723-.234-1.107-.032-2.343.57-3.25z"/><path d="M83.462 78.295a.803.803 0 1 1 1.388.814l-1.39 2.38c-1.383 2.392-2.463 4.338-3.33 6.014l-.114.229c-.108.233-.136.355-.118.421.018.067.257.263.373.279.19.026.441-.035.728-.184.611-.317 1.142-.857 1.777-1.744.438-.611.923-1.447 1.451-2.462a.803.803 0 1 1 1.428.74c-.56 1.078-1.077 1.97-1.57 2.658-.77 1.075-1.46 1.776-2.346 2.236-.558.29-1.125.427-1.689.35-.734-.1-1.514-.737-1.707-1.45-.165-.611-.026-1.073.357-1.811l.34-.65c1.108-2.1 2.53-4.606 4.422-7.82z"/></g><path d="M57.963 76.556a1.512 1.512 0 0 1 2.027-.102l.108.098 17.27 17.198 24.354-7.42a1.51 1.51 0 0 1 1.835.866l.049.136a1.51 1.51 0 0 1-.869 1.834l-.137.049-25.22 7.683a1.51 1.51 0 0 1-1.394-.273l-.112-.101-17.91-17.836a1.506 1.506 0 0 1-.001-2.132z" fill="#4285F4" fill-rule="nonzero"/><g><path d="M73.735 27.798a.957.957 0 0 1-.899-1.087 9.21 9.21 0 0 1 9.562-7.95c4.828.22 8.699 4.061 9.082 8.793a.922.922 0 0 1-.96 1.004l-16.785-.76z" fill="#F882FF"/><path d="M46.537 44.15l-7.78 3.522c-1.1.499-1.249 1.981-.268 2.67l6.939 4.87c.98.69 2.354.068 2.473-1.118l.842-8.396c.12-1.187-1.107-2.047-2.206-1.549" fill="#D2E3FC"/><path d="M45.335 46.642c-2.101-2.484-1.676-6.184.948-8.262l11.107-8.82c2.625-2.08 6.456-1.752 8.557.732s1.677 6.184-.948 8.263l-11.106 8.82c-2.625 2.08-6.456 1.75-8.558-.733" fill="#FABD04"/><g transform="rotate(-102 42.988 6.811)"><mask id="d" fill="#fff"><path id="c" d="M3.798.549A5.982 5.982 0 0 0 .812 8.458l5.764 12.741a5.97 5.97 0 0 0 7.9 2.99 5.982 5.982 0 0 0 2.987-7.909L11.697 3.54A5.96 5.96 0 0 0 3.798.55"/></mask><path d="M3.01-6.275c-.34 0-.687.118-.977.375L-4.024-.53c-.856.758-.57 2.16.514 2.523L4.162 4.56c.16.053.32.078.476.078.896 0 1.644-.83 1.45-1.785L4.472-5.084a1.484 1.484 0 0 0-1.461-1.19M2.817-4.19l1.398 6.865-6.638-2.22 5.24-4.645" fill="#FFF" mask="url(#d)"/></g><path d="M43.26 66.655l-3.847-6.7a2.573 2.573 0 0 0-2.228-1.28l-7.868-.026a2.63 2.63 0 0 0-2.261 1.264l-4.022 6.673a2.504 2.504 0 0 0-.032 2.543l3.847 6.7a2.572 2.572 0 0 0 2.228 1.28l7.868.026a2.632 2.632 0 0 0 2.262-1.264l4.02-6.672a2.503 2.503 0 0 0 .033-2.544" fill="#38A953"/><path d="M42.107 102.465h0v-.002a8.461 8.461 0 0 0-1.253-1.538l-1.343-1.65a6.942 6.942 0 0 1-1.515-5.197l.28-2.386.122-1.045-.055-.007a5.94 5.94 0 0 0-.06-.752c-.492-3.26-3.588-5.485-6.915-4.972-3.328.513-5.628 3.571-5.135 6.83.037.252.097.496.165.735l-.05.024.424.96.97 2.194a6.96 6.96 0 0 1 .088 5.417l-.795 1.98a8.491 8.491 0 0 0-.741 1.845l-.001.002h0a8.374 8.374 0 0 0-.038 4.236c1.006 4.032 4.942 6.764 9.169 6.373 5.048-.468 8.615-4.991 7.886-9.824a8.323 8.323 0 0 0-1.203-3.223z" stroke="#D2E3FC" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/><path d="M40.532 135.356c-7.25-.375-12.761-6.448-12.311-13.564l.013-.21c.449-7.116 6.69-12.581 13.939-12.206 7.25.375 12.761 6.448 12.311 13.564l-.013.21c-.45 7.117-6.69 12.581-13.939 12.206" fill="#EA4335"/><g transform="rotate(-103 70.313 56.882)"><mask id="f" fill="#fff"><path id="e" d="M1.258 10.212c-1.955 7.205 1.886 14.751 8.58 16.855l.196.063c6.694 2.104 13.705-2.03 15.66-9.234C27.65 10.691 23.81 3.145 17.117 1.04L16.92.978a11.78 11.78 0 0 0-3.546-.549C7.907.43 2.868 4.28 1.258 10.212z"/></mask><path d="M28.924.89c-4.53.083-8.37 3.754-8.984 8.531-.727 5.66 3.137 10.797 8.463 11.23a8.667 8.667 0 0 0 3.378-.392l.274-.097.373-.145c.485-.2.925-.425 1.339-.683l.258-.17 1.826-.942a5.58 5.58 0 0 1 4.559-.274l3.188 1.201.11.034c.11.026.223.031.331.016l.02-.004.258.04c.092.013.183.022.275.03 3.737.304 6.968-2.686 7.245-6.64.278-3.947-2.488-7.413-6.216-7.717l-.31-.016h-.227l-.028-.01a.899.899 0 0 0-.324-.035l-.156.024-3.276.663-.275.048c-1.467.221-2.962-.153-4.2-1.061l-1.68-1.235-.225-.203a9.26 9.26 0 0 0-1.183-.869l-.317-.186A8.772 8.772 0 0 0 29.265.889h-.341zm.35 1.81a6.957 6.957 0 0 1 2.96.745l.296.157c.515.29.993.642 1.427 1.049l.083.068 1.714 1.26c1.723 1.265 3.848 1.744 5.905 1.328l3.01-.61.078.011.055.002.056-.001a4.46 4.46 0 0 1 .615.002c2.71.22 4.77 2.8 4.56 5.787-.21 2.979-2.592 5.184-5.294 4.964a4.622 4.622 0 0 1-.611-.097l-.111-.017-.079-.003-2.89-1.09a7.39 7.39 0 0 0-6.029.36l-1.87.968-.095.056a7.217 7.217 0 0 1-1.55.802l-.298.103a6.838 6.838 0 0 1-2.657.304c-4.266-.347-7.413-4.532-6.814-9.196.502-3.911 3.616-6.887 7.222-6.954l.316.001z" fill="#FFF" fill-rule="nonzero" mask="url(#f)"/></g></g><g><g transform="rotate(9 44.073 633.419)"><mask id="h" fill="#fff"><path id="g" d="M0 .13h36.463v36.73H0z"/></mask><path d="M35.644 27.522l-24.76 9.258a1.253 1.253 0 0 1-1.614-.745L.079 11.095a1.268 1.268 0 0 1 .74-1.627L25.58.21c.65-.243 1.372.09 1.614.745l9.191 24.94a1.268 1.268 0 0 1-.74 1.627" fill="#4285F4" mask="url(#h)"/></g><path d="M121.048 11.073a4.033 4.033 0 0 0-1.246.577l-.217.161c-.247.196-.47.42-.664.668l-.548.544a2.164 2.164 0 0 1-1.531.64h-1.374l-.094.007a.686.686 0 0 0-.177.052l-.072.014-.12.03a3.055 3.055 0 0 0-2.149 3.73 3.024 3.024 0 0 0 3.71 2.157l.2-.064.06-.007a.65.65 0 0 0 .13-.042l.178-.099 1.076-.625a2.152 2.152 0 0 1 1.64-.217l.815.22c.218.091.522.173.835.22.667.097 1.35.027 2-.215 1.854-.691 2.95-2.67 2.562-4.618-.461-2.313-2.759-3.742-5.014-3.133zm3.732 3.388c.263 1.322-.485 2.672-1.737 3.139a2.723 2.723 0 0 1-1.965-.019l-.888-.244a3.459 3.459 0 0 0-2.636.35l-1.052.609-.072.024a1.717 1.717 0 0 1-2.31-1.157 1.748 1.748 0 0 1 1.224-2.136l.065-.016c.045-.01.094-.018.15-.025l.069-.016 1.215-.001a3.47 3.47 0 0 0 2.456-1.024l.598-.601.106-.127a3.04 3.04 0 0 1 .4-.388l.16-.117a2.734 2.734 0 0 1 4.217 1.749zm-21.012-1.449a3.139 3.139 0 0 0-2.443 3.69 3.11 3.11 0 0 0 3.669 2.451 3.139 3.139 0 0 0 2.442-3.689 3.111 3.111 0 0 0-3.668-2.452zm2.387 2.706a1.832 1.832 0 0 1-1.422 2.155 1.803 1.803 0 0 1-2.126-1.426 1.833 1.833 0 0 1 1.422-2.155 1.803 1.803 0 0 1 2.09 1.281l.036.145z" fill="#FFF" fill-rule="nonzero"/><g transform="rotate(9 43.883 633.603)"><mask id="j" fill="#fff"><path id="i" d="M25.094.245L.89 9.568c-.687.265-1.037 1.056-.782 1.769l8.985 25.114c.255.712 1.018 1.075 1.704.811L35 27.939c.687-.265 1.037-1.056.782-1.769L26.798 1.056A1.329 1.329 0 0 0 25.555.16c-.153 0-.31.028-.461.086"/></mask><path d="M13.402 18.342a.654.654 0 0 1 .782-.355l.09.035 25.268 11.894a.653.653 0 0 1-.467 1.217l-.09-.035-24.67-11.613-6.724 14.77a.654.654 0 0 1-.775.357l-.09-.033a.653.653 0 0 1-.358-.775l.034-.09 7-15.372z" fill="#FFF" fill-rule="nonzero" mask="url(#j)"/></g></g>
+      <g id="nearby-device-visibility-dark" fill="none" fill-rule="evenodd">
+        <path d="M102.293 143.77C126.19 143.77 145.563 124.397 145.563 100.5C145.563 76.6028 126.19 57.2302 102.293 57.2302C78.3955 57.2302 59.023 76.6028 59.023 100.5C59.023 124.397 78.3955 143.77 102.293 143.77Z" fill="#8AB4F8" fill-opacity="0.4"/><path d="M172.025 45.979L161.088 43.0486C160.606 42.9194 160.111 43.2055 159.982 43.6876L157.055 54.6088C156.926 55.0909 157.212 55.5864 157.694 55.7156L168.631 58.646C169.113 58.7752 169.608 58.4891 169.738 58.007L172.664 47.0858C172.793 46.6037 172.507 46.1082 172.025 45.979Z" fill="#5BB974"/><path d="M48.3131 145.805L48.2866 145.759C46.7159 143.039 43.2373 142.107 40.5169 143.677L32.028 148.578C29.3076 150.149 28.3755 153.628 29.9461 156.348L29.9727 156.394C31.5433 159.115 35.0219 160.047 37.7424 158.476L46.2313 153.575C48.9517 152.004 49.8838 148.526 48.3131 145.805Z" stroke="#EA4335" stroke-width="2" stroke-linejoin="round"/><path d="M35.4213 59.6755L30.2119 54.4661C29.9161 54.1629 29.7061 53.7866 29.6034 53.3757C29.5007 52.9647 29.5089 52.5339 29.6273 52.1272L31.4878 45.0041C31.6155 44.5911 31.8419 44.2155 32.1476 43.9098C32.4532 43.6041 32.8288 43.3776 33.2418 43.25L40.365 41.3895C40.7717 41.2711 41.2025 41.2629 41.6134 41.3656C42.0244 41.4683 42.4006 41.6784 42.7038 41.9742L47.9132 47.1836C48.2182 47.4925 48.4374 47.8756 48.5493 48.295C48.6611 48.7145 48.6617 49.1559 48.5511 49.5756L46.6375 56.6987C46.52 57.1024 46.3024 57.47 46.0051 57.7674C45.7077 58.0647 45.3402 58.2822 44.9364 58.3997L37.8134 60.3133C37.3936 60.424 36.9522 60.4234 36.5327 60.3115C36.1133 60.1997 35.7303 59.9804 35.4213 59.6755Z" fill="#FCC934"/><path d="M38.9875 131.46L34.0926 127.798C33.881 127.64 33.5812 127.683 33.423 127.895L29.7738 132.773C29.6156 132.984 29.6587 133.284 29.8703 133.442L34.7652 137.104C34.9768 137.262 35.2765 137.219 35.4348 137.008L39.0839 132.13C39.2422 131.918 39.1991 131.618 38.9875 131.46Z" fill="#F882FE"/><path d="M102.293 163.066C136.847 163.066 164.859 135.054 164.859 100.5C164.859 65.9459 136.847 37.9342 102.293 37.9342C67.7386 37.9342 39.727 65.9459 39.727 100.5C39.727 135.054 67.7386 163.066 102.293 163.066Z" stroke="#669DF6" stroke-width="2" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M104.419 76.154L121.429 82.4797C121.95 82.5983 122.416 82.8877 122.753 83.302C123.091 83.7162 123.279 84.2314 123.29 84.7654V97.3105C123.29 107.623 118.187 117.51 109.31 123.889C106.333 126.015 103.675 127.185 102.293 127.185C100.911 127.185 98.2529 126.015 95.2761 123.889C86.3989 117.51 81.2958 107.623 81.2958 97.3105V84.7654C81.3062 84.2314 81.495 83.7162 81.8322 83.302C82.1694 82.8877 82.6355 82.5983 83.1563 82.4797L100.167 76.154C101.562 75.8007 103.024 75.8007 104.419 76.154ZM113.403 100.5C113.403 106.636 108.429 111.61 102.293 111.61C96.157 111.61 91.183 106.636 91.183 100.5C91.183 94.3642 96.157 89.3901 102.293 89.3901C108.429 89.3901 113.403 94.3642 113.403 100.5Z" fill="#669DF6"/><path fill-rule="evenodd" clip-rule="evenodd" d="M105.287 100.537C105.287 102.19 103.946 103.531 102.293 103.531C100.639 103.531 99.2989 102.19 99.2989 100.537C99.2989 98.8834 100.639 97.5429 102.293 97.5429C103.946 97.5429 105.287 98.8834 105.287 100.537ZM103.291 100.537C103.291 101.088 102.844 101.535 102.293 101.535C101.742 101.535 101.295 101.088 101.295 100.537C101.295 99.9857 101.742 99.5389 102.293 99.5389C102.844 99.5389 103.291 99.9857 103.291 100.537ZM102.293 106.525C106.617 106.525 109.611 104.529 111.275 100.537C109.279 96.5449 106.285 94.549 102.293 94.549C98.3009 94.549 95.3069 96.5449 93.3109 100.537C94.9742 104.529 97.9682 106.525 102.293 106.525ZM102.293 96.5449C105.224 96.5449 107.414 97.8364 109.043 100.606C107.66 103.278 105.494 104.529 102.293 104.529C99.0915 104.529 96.9261 103.278 95.5423 100.606C97.1716 97.8364 99.3614 96.5449 102.293 96.5449Z" fill="#669DF6"/>
+      </g>
+
+      <g id="nearby-onboarding-splash-light" fill="none" fill-rule="evenodd">
+        <path d="M82.2416 172.591C77.6105 172.855 75.2555 172.231 71.1615 173.316C71.1615 173.316 67.1422 174.346 63.1412 170.832L52.9482 180.75C52.9482 180.75 62.2832 186.902 66.7224 187.683C71.1615 188.463 81.5526 190.208 83.4351 189.749C85.3175 189.29 89.3122 187.086 89.3122 187.086L91.0273 184.147C91.4573 184.102 90.684 183.204 91.0273 182.971C91.3044 182.686 91.8834 182.971 91.9079 182C91.9338 180.977 89.5052 180.27 88.6829 180.134C85.1388 179.276 82.0028 178.554 78.418 177.96C80.3135 177.62 82.1723 177.12 83.9656 176.469C84.3587 176.328 86.2726 175.494 86.3524 175.171C86.4137 174.922 86.0455 173.316 86.0455 173.316C85.6512 172.725 83.0897 172.536 82.2416 172.591Z" fill="#D2E3FC"/><path d="M71.9973 173.059L71.8701 172.32L71.8585 172.322L71.9973 173.059ZM85.3093 172.631L85.4866 171.903C85.4409 171.892 85.3944 171.885 85.3475 171.882L85.3093 172.631ZM86.7248 174.68L85.9966 174.501L86.7248 174.68ZM86.3143 175.352L86.7972 175.926C86.8058 175.919 86.8142 175.911 86.8225 175.904L86.3143 175.352ZM84.8013 176.211L84.5494 175.505L84.5451 175.506L84.8013 176.211ZM79.2538 177.703L79.1213 176.965C78.762 177.029 78.5013 177.343 78.5038 177.708C78.5062 178.073 78.7711 178.383 79.1311 178.443L79.2538 177.703ZM89.5187 179.877L89.3421 180.606C89.3601 180.61 89.3783 180.614 89.3966 180.617L89.5187 179.877ZM91.748 180.791L92.2038 180.196C92.1999 180.193 92.196 180.19 92.1921 180.187L91.748 180.791ZM91.863 182.714L92.2839 183.335C92.3262 183.306 92.3655 183.273 92.4012 183.236L91.863 182.714ZM90.678 183.139L90.6003 182.393C90.5776 182.395 90.555 182.399 90.5326 182.403L90.678 183.139ZM88.201 183.229L88.2942 182.485C88.272 182.482 88.2496 182.48 88.2272 182.48L88.201 183.229ZM77.3458 180.526C76.9533 180.393 76.5277 180.604 76.3952 180.996C76.2626 181.389 76.4733 181.814 76.8657 181.947L77.3458 180.526ZM63.7774 169.869C63.4662 169.596 62.9923 169.626 62.719 169.938C62.4457 170.249 62.4764 170.723 62.7876 170.996L63.7774 169.869ZM72.1244 173.798C76.1875 173.099 80.903 173.158 85.2712 173.38L85.3475 171.882C80.9625 171.659 76.1069 171.591 71.8701 172.32L72.1244 173.798ZM85.9966 174.501C85.9741 174.592 85.9162 174.699 85.8061 174.801L86.8225 175.904C87.1265 175.624 87.3529 175.265 87.453 174.86L85.9966 174.501ZM85.8313 174.778C85.4684 175.084 85.0328 175.333 84.5494 175.505L85.0532 176.918C85.6963 176.688 86.2902 176.353 86.7972 175.926L85.8313 174.778ZM84.5451 175.506C82.7924 176.143 80.975 176.632 79.1213 176.965L79.3863 178.441C81.3234 178.094 83.2236 177.583 85.0574 176.916L84.5451 175.506ZM79.1311 178.443C82.688 179.032 85.8023 179.749 89.3421 180.606L89.6952 179.148C86.1467 178.289 82.9891 177.562 79.3764 176.963L79.1311 178.443ZM89.3966 180.617C90.1234 180.737 90.7781 181.009 91.3039 181.396L92.1921 180.187C91.4605 179.649 90.581 179.292 89.6408 179.137L89.3966 180.617ZM91.2923 181.387C91.4442 181.503 91.5052 181.639 91.5124 181.759L93.0097 181.669C92.9741 181.075 92.6684 180.551 92.2038 180.196L91.2923 181.387ZM91.5124 181.759C91.5197 181.881 91.4736 182.038 91.3249 182.191L92.4012 183.236C92.8066 182.818 93.0451 182.261 93.0097 181.669L91.5124 181.759ZM91.4422 182.093C91.2055 182.253 90.9128 182.36 90.6003 182.393L90.7557 183.885C91.3033 183.828 91.8338 183.64 92.2839 183.335L91.4422 182.093ZM90.5326 182.403C89.7907 182.55 89.0304 182.577 88.2942 182.485L88.1077 183.973C89.0052 184.086 89.9266 184.052 90.8234 183.875L90.5326 182.403ZM88.2272 182.48C84.4596 182.348 80.7815 181.687 77.3458 180.526L76.8657 181.947C80.4445 183.156 84.2671 183.842 88.1747 183.979L88.2272 182.48ZM62.7876 170.996C64.927 172.875 67.2576 173.576 69.044 173.807C69.9369 173.923 70.6982 173.922 71.2402 173.891C71.5116 173.876 71.729 173.854 71.8816 173.834C71.958 173.824 72.0182 173.815 72.0611 173.809C72.0825 173.805 72.0995 173.802 72.1121 173.8C72.1184 173.799 72.1235 173.798 72.1275 173.797C72.1295 173.797 72.1312 173.797 72.1326 173.797C72.1333 173.796 72.134 173.796 72.1345 173.796C72.1348 173.796 72.1352 173.796 72.1353 173.796C72.1357 173.796 72.136 173.796 71.9973 173.059C71.8585 172.322 71.8588 172.322 71.8591 172.322C71.8592 172.322 71.8594 172.322 71.8596 172.322C71.8598 172.322 71.86 172.321 71.8602 172.321C71.8605 172.321 71.8604 172.321 71.8602 172.321C71.8596 172.322 71.8579 172.322 71.8552 172.322C71.8496 172.323 71.8397 172.325 71.8256 172.327C71.7975 172.332 71.7525 172.338 71.6922 172.346C71.5714 172.361 71.3893 172.381 71.1562 172.394C70.6894 172.42 70.0222 172.421 69.2366 172.32C67.6658 172.116 65.639 171.504 63.7774 169.869L62.7876 170.996ZM85.1321 173.36C85.4637 173.441 85.7285 173.592 85.8773 173.768C85.9986 173.913 86.0896 174.124 85.9966 174.501L87.453 174.86C87.6552 174.04 87.4698 173.332 87.0252 172.803C86.6082 172.307 86.0177 172.032 85.4866 171.903L85.1321 173.36Z" fill="#4285F4"/><path d="M52.8409 181.025C57.4686 184.992 66.9244 188.308 72.1966 188.729C75.6516 188.954 82.8093 191.355 85.3963 188.729" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M90.6779 183.139C90.8798 183.18 91.063 183.264 91.2102 183.383C91.3573 183.503 91.4633 183.653 91.5181 183.821C91.5729 183.988 91.5746 184.167 91.5231 184.339C91.4716 184.512 91.3685 184.673 91.2239 184.807C90.758 185.243 90.1496 185.554 89.482 185.698C84.8371 186.417 80.53 185.666 75.9722 184.239" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M75.0054 186.767C77.2665 187.353 80.9811 188.317 82.933 188.365C84.8849 188.413 86.8953 188.324 88.646 187.496C89.085 187.248 89.4406 186.907 89.6745 186.511L89.7557 185.983" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M103.988 160.782L97.9815 173.049C104.503 174.353 105.834 174.641 112.836 176.369C119.736 180.011 123.826 179.803 122.567 176.933C121.309 174.064 117.785 173.895 119.661 173.049H131.12C131.695 172.858 131.407 172.206 131.12 171.343C130.833 170.481 126.901 171.266 126.134 170.117C125.368 168.967 131.338 169.88 132.097 168.302C132.856 166.724 129.798 166.96 129.798 165.796C129.798 164.704 134.2 164.642 133.26 162.486C132.32 160.329 133.633 160.253 133.509 159.638C133.429 159.243 133.109 159.081 132.097 158.781C127.482 158.035 120.654 160.495 117.647 161.241C112.45 162.109 111.175 161.836 103.988 160.782Z" fill="#D2E3FC"/><path d="M48.8831 183.916L48.4112 184.499C48.7023 184.735 49.1227 184.719 49.396 184.463L48.8831 183.916ZM83.9541 137.646L83.5252 138.262L83.9541 137.646ZM96.9112 159.205L96.3023 159.643C96.4185 159.804 96.5941 159.913 96.7904 159.945L96.9112 159.205ZM103.787 160.327L104.472 160.632C104.567 160.419 104.557 160.175 104.447 159.971C104.336 159.766 104.137 159.625 103.908 159.587L103.787 160.327ZM91.2659 148.614L90.5797 148.917L91.2659 148.614ZM97.0456 173.672C96.8776 174.051 97.0483 174.494 97.427 174.662C97.8056 174.83 98.2487 174.659 98.4167 174.28L97.0456 173.672ZM64.6936 170.123C64.9958 169.84 65.0111 169.365 64.7279 169.063C64.4446 168.761 63.9699 168.746 63.6677 169.029L64.6936 170.123ZM48.8831 183.916C49.355 183.333 49.3551 183.333 49.3552 183.333C49.3552 183.333 49.3553 183.333 49.3553 183.333C49.3553 183.333 49.3552 183.333 49.355 183.333C49.3545 183.333 49.3535 183.332 49.352 183.331C49.3492 183.328 49.3444 183.325 49.3378 183.319C49.3246 183.308 49.304 183.291 49.2766 183.268C49.2217 183.222 49.1392 183.151 49.0326 183.057C48.8193 182.869 48.5098 182.587 48.1314 182.219C47.3741 181.481 46.3438 180.396 45.259 179.017C43.0841 176.252 40.7201 172.34 39.863 167.686L38.3878 167.958C39.3048 172.936 41.8196 177.07 44.08 179.944C45.2129 181.385 46.2894 182.518 47.0845 183.293C47.4823 183.681 47.8103 183.979 48.0406 184.182C48.1557 184.284 48.2465 184.361 48.3094 184.414C48.3409 184.441 48.3654 184.461 48.3825 184.476C48.391 184.483 48.3978 184.488 48.4026 184.492C48.405 184.494 48.4069 184.496 48.4083 184.497C48.409 184.497 48.4096 184.498 48.4101 184.498C48.4104 184.498 48.4106 184.499 48.4107 184.499C48.411 184.499 48.4112 184.499 48.8831 183.916ZM39.863 167.686C38.0933 158.079 37.9257 147.087 46.6874 140.151L45.7564 138.975C36.27 146.485 36.6093 158.303 38.3878 167.958L39.863 167.686ZM46.6874 140.151C51.0741 136.678 58.2344 134.761 65.4047 134.459C72.584 134.157 79.54 135.484 83.5252 138.262L84.3829 137.031C80.0044 133.979 72.6563 132.653 65.3416 132.961C58.0177 133.269 50.4938 135.224 45.7564 138.975L46.6874 140.151ZM96.7904 159.945L103.666 161.068L103.908 159.587L97.0321 158.465L96.7904 159.945ZM83.5252 138.262C86.6442 140.436 88.6404 144.521 90.5797 148.917L91.9521 148.311C90.0451 143.989 87.9039 139.485 84.3829 137.031L83.5252 138.262ZM90.5797 148.917C92.1554 152.488 93.5793 155.161 94.6127 156.945C95.1293 157.836 95.5484 158.506 95.8399 158.956C95.9857 159.18 96.0996 159.35 96.1779 159.464C96.2171 159.521 96.2473 159.565 96.2682 159.595C96.2787 159.61 96.2868 159.621 96.2925 159.629C96.2953 159.633 96.2976 159.636 96.2992 159.639C96.3001 159.64 96.3007 159.641 96.3012 159.641C96.3015 159.642 96.3017 159.642 96.3019 159.642C96.302 159.642 96.3021 159.643 96.3021 159.643C96.3022 159.643 96.3023 159.643 96.9112 159.205C97.5201 158.767 97.5202 158.767 97.5203 158.767C97.5203 158.767 97.5203 158.767 97.5203 158.767C97.5204 158.768 97.5204 158.768 97.5203 158.767C97.5202 158.767 97.52 158.767 97.5196 158.766C97.5188 158.765 97.5174 158.763 97.5154 158.76C97.5114 158.755 97.5049 158.746 97.4962 158.733C97.4787 158.708 97.4518 158.67 97.416 158.617C97.3444 158.513 97.2373 158.353 97.0982 158.139C96.82 157.71 96.4143 157.062 95.9106 156.193C94.9033 154.454 93.5046 151.83 91.9521 148.311L90.5797 148.917ZM103.101 160.023L97.0456 173.672L98.4167 174.28L104.472 160.632L103.101 160.023ZM49.396 184.463L64.6936 170.123L63.6677 169.029L48.3702 183.369L49.396 184.463Z" fill="#4285F4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M64.1597 129.792H69.8135L71.2509 136.404C70.827 137.103 70.2172 137.671 69.4895 138.043C68.7619 138.415 67.9451 138.578 67.1303 138.513C65.118 138.513 63.3931 137.554 62.9139 136.309L64.1597 129.792Z" fill="#D2E3FC"/><path d="M69.8134 129.026H64.1596C63.819 129.044 63.5062 129.279 63.393 129.601L62.1473 136.117C62.1324 136.283 62.1656 136.449 62.2431 136.596C62.8181 138.225 64.8304 139.279 67.1303 139.279C69.4301 139.279 71.2508 138.225 71.9216 136.692C72.0126 136.55 72.0468 136.379 72.0174 136.213L70.58 129.601C70.4931 129.263 70.1616 129.015 69.8134 129.026ZM69.1426 130.559L70.3884 136.309C70.0077 136.8 69.5104 137.189 68.9415 137.44C67.8714 137.912 66.2537 137.879 65.19 137.396C64.6417 137.147 64.158 136.775 63.7763 136.309L64.8304 130.655L69.1426 130.559Z" fill="#4285F4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M70.5801 121.647C71.4802 122.406 72.1345 123.415 72.4599 124.547C72.7853 125.678 72.7672 126.881 72.4079 128.002C72.0486 129.123 71.3642 130.113 70.4417 130.844C69.5192 131.576 68.4002 132.017 67.2266 132.111C66.053 132.206 64.8778 131.949 63.8502 131.375C62.8226 130.8 61.9889 129.933 61.455 128.884C60.921 127.834 60.7109 126.65 60.8512 125.481C60.9915 124.312 61.476 123.211 62.2432 122.318C63.2638 121.13 64.7123 120.393 66.2736 120.267C67.8349 120.141 69.3826 120.637 70.5801 121.647V121.647Z" fill="#D2E3FC"/><path fill-rule="evenodd" clip-rule="evenodd" d="M60.8057 123.564H71.4424C71.4424 123.564 70.6449 120.653 66.5572 120.406C62.4695 120.159 60.8057 123.564 60.8057 123.564Z" fill="#4285F4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M79.6141 177.465L81.9769 167.576C82.1425 166.806 82.852 166.246 83.6395 166.264H94.0531C95.2145 166.264 96.0009 167.365 95.7157 168.451L92.3029 180.703L79.6141 177.465Z" fill="#4285F4"/><path d="M84.9732 170.961C85.5024 170.961 85.9314 170.532 85.9314 170.003C85.9314 169.474 85.5024 169.045 84.9732 169.045C84.4439 169.045 84.0149 169.474 84.0149 170.003C84.0149 170.532 84.4439 170.961 84.9732 170.961Z" fill="white"/><circle cx="66.4885" cy="126.103" r="6.027" stroke="#4285F4" stroke-width="1.5"/><path fill-rule="evenodd" clip-rule="evenodd" d="M72.7414 123.564H65.8635C67.7955 121.631 69.2652 119.374 71.6288 117.899C73.1459 116.989 75.0677 116.787 75.8768 117.899C76.0423 118.255 76.1108 118.648 76.0752 119.039C75.9145 120.807 73.7522 122.226 72.7414 123.564Z" fill="#8AB4F8"/><path d="M150.595 38.0862H145.325C145.179 38.0939 145.038 38.143 144.92 38.2279C144.801 38.3128 144.709 38.4299 144.654 38.5653L142.929 42.2067C142.884 42.3332 142.869 42.4683 142.886 42.6015C142.902 42.7347 142.95 42.8622 143.024 42.9738C143.099 43.0855 143.198 43.1782 143.315 43.2447C143.431 43.3112 143.562 43.3495 143.696 43.3566H152.32C152.453 43.3827 152.59 43.3681 152.714 43.3149C152.838 43.2618 152.943 43.1724 153.015 43.0585C153.088 42.9447 153.124 42.8117 153.12 42.6768C153.116 42.5419 153.071 42.4115 152.991 42.3025L151.362 38.5653C151.291 38.4223 151.182 38.3018 151.046 38.2173C150.911 38.1327 150.755 38.0873 150.595 38.0862V38.0862ZM150.116 39.6194L151.17 41.8234H144.846L145.804 39.6194H150.116Z" fill="#4285F4"/><path d="M152.512 43.3566H143.6C131.238 42.7816 124.339 48.5312 115.714 64.5342C115.638 64.7044 115.501 64.8408 115.331 64.9176H115.235L96.4532 69.9006L102.107 82.4538H102.203C109.179 83.176 116.182 81.3741 121.943 77.375L122.326 77.0876C128.33 72.9344 132.487 66.6131 133.921 59.4554C133.96 59.2521 134.077 59.0723 134.248 58.9555C134.418 58.8387 134.628 58.7944 134.832 58.8326C135.035 58.8707 135.215 58.988 135.332 59.1587C135.449 59.3295 135.493 59.5396 135.455 59.7429C133.956 67.2807 129.593 73.9441 123.285 78.3333C117.002 82.8855 109.236 84.9041 101.532 83.987C101.415 83.9662 101.303 83.9215 101.204 83.8555C101.106 83.7895 101.021 83.7039 100.957 83.6038H100.861L94.6325 69.7089C94.5855 69.6223 94.5582 69.5264 94.5524 69.4281C94.5467 69.3297 94.5627 69.2313 94.5993 69.1398C94.6359 69.0483 94.6921 68.966 94.7641 68.8987C94.8361 68.8315 94.9221 68.7809 95.0158 68.7506H95.1116L114.469 63.6718L114.66 63.3843C123.189 47.5729 130.472 41.6317 142.929 41.8233H153.47L156.249 42.59C159.186 43.4907 161.99 44.7798 164.586 46.4231C172.06 51.2144 176.085 58.4013 174.935 68.1756C173.785 77.95 167.652 84.562 158.261 88.3951C155.005 89.7432 151.593 90.6768 148.104 91.174L144.846 91.6532H143.6C143.443 91.6426 143.29 91.5933 143.157 91.5097C143.023 91.4261 142.912 91.3108 142.833 91.174L137.467 72.392C137.438 72.2913 137.431 72.1858 137.445 72.082C137.458 71.9782 137.493 71.8783 137.547 71.7885C137.601 71.6987 137.673 71.621 137.758 71.5599C137.843 71.4989 137.94 71.456 138.042 71.4338C138.208 71.3923 138.383 71.4075 138.539 71.477C138.695 71.5465 138.824 71.6662 138.904 71.8171L144.175 90.0242H144.75L147.912 89.545C151.27 89.0671 154.555 88.1655 157.686 86.8618C166.598 83.2204 172.348 77.1834 173.402 67.8882C174.456 58.593 170.815 52.0768 163.724 47.6688C161.259 46.06 158.582 44.8022 155.77 43.9315C155.015 43.6948 154.247 43.5029 153.47 43.3566H153.087H152.512Z" fill="#4285F4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M152.522 25.2622C153.338 23.18 156.681 22.2024 158.842 23.4732C159.402 23.8027 159.889 24.2426 160.274 24.7663C159.647 22.5736 161.413 20.5127 163.434 19.9281C163.995 19.7661 164.581 19.7169 165.161 19.7833C165.603 19.8106 166.039 19.6666 166.378 19.3811C166.717 19.0956 166.933 18.6907 166.982 18.2501V17.8668C167.135 16.8398 167.638 15.8972 168.407 15.1987C169.175 14.5002 170.161 14.0887 171.198 14.0337C172.405 14.0337 174.402 14.3641 174.456 12.5963L174.744 9.33827C174.777 8.76132 174.959 8.20276 175.271 7.71678C175.584 7.23079 176.017 6.83385 176.528 6.56445C177.04 6.29504 177.612 6.16233 178.19 6.17916C178.767 6.19598 179.331 6.36178 179.825 6.66048C180.32 6.95918 180.729 7.38066 181.013 7.88402C181.297 8.38739 181.446 8.95556 181.446 9.53347C181.446 10.1114 181.296 10.6794 181.011 11.1824C180.727 11.6855 180.317 12.1066 179.822 12.4047L176.181 14.6087C175.514 14.9819 175.222 15.8178 175.51 16.5253C175.868 17.2354 176.001 18.0373 175.893 18.8251C175.846 19.4137 175.68 19.9867 175.407 20.5102C175.134 21.0336 174.758 21.4968 174.302 21.8722C173.846 22.2476 173.32 22.5276 172.753 22.6955C172.187 22.8634 171.593 22.9159 171.006 22.8498C169.95 22.7181 169.186 23.5758 169.186 24.5747C169.041 25.7437 168.454 26.8128 167.545 27.5616C166.635 28.3105 165.473 28.6819 164.298 28.5994C163.641 28.524 163.008 28.3045 162.445 27.9567C161.882 27.6089 161.402 27.1413 161.04 26.5871C161.04 27.5631 161 28.447 160.521 29.3329C160.237 29.8569 159.853 30.3195 159.389 30.6938C158.926 31.0681 158.393 31.3468 157.821 31.5136C157.249 31.6805 156.649 31.7322 156.057 31.6659C154.888 31.5215 153.819 30.9342 153.07 30.0249C152.322 29.1157 151.707 27.3445 152.522 25.2622Z" fill="#4285F4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M152.033 29.6536C152.665 30.1799 153.187 30.8262 153.568 31.5554C153.95 32.2846 154.183 33.0821 154.254 33.9018C154.325 34.7215 154.233 35.5472 153.984 36.3312C153.734 37.1152 153.331 37.842 152.799 38.4696C151.706 39.7391 150.153 40.5228 148.482 40.6486C146.811 40.7744 145.159 40.2319 143.887 39.1404C142.629 38.0602 141.852 36.5246 141.726 34.8713C141.6 33.2179 142.137 31.5823 143.217 30.3243C144.297 29.0663 145.832 28.2888 147.486 28.1631C149.139 28.0373 150.775 28.5734 152.033 29.6536" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M154.428 35.1157C155.195 33.5825 153.342 29.9508 150.499 28.7912C148.583 27.8329 144.175 28.6953 143.312 30.3244C145.774 32.9313 150.891 34.7227 154.428 35.1157Z" fill="#4285F4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M67.9927 30.5162C67.4391 30.53 67.007 30.002 67.1303 29.4621C67.4375 27.2955 68.5396 25.3205 70.2221 23.9214C71.9047 22.5222 74.0475 21.7987 76.2338 21.8918C78.4629 22.0005 80.5765 22.9158 82.1808 24.4672C83.7851 26.0186 84.7707 28.1003 84.954 30.3245C85.0106 30.8302 84.6004 31.2859 84.0916 31.2828L67.9927 30.5162Z" fill="#EE5FFA"/><path fill-rule="evenodd" clip-rule="evenodd" d="M42.0133 45.8812L34.5388 49.2351C33.5326 49.7164 33.3753 51.132 34.2513 51.8225L40.9592 56.4221C41.8839 57.066 43.2048 56.4847 43.3549 55.368L44.1215 47.3186C44.2579 46.1845 43.0192 45.34 42.0133 45.8812Z" fill="#D2E3FC"/><path fill-rule="evenodd" clip-rule="evenodd" d="M40.778 48.6273C40.2996 48.0539 39.9417 47.3901 39.7255 46.6754C39.5094 45.9606 39.4394 45.2096 39.5199 44.4673C39.6004 43.7249 39.8297 43.0064 40.194 42.3546C40.5584 41.7028 41.0503 41.1311 41.6405 40.6737L52.2772 32.2409C53.469 31.2605 54.9955 30.7823 56.5336 30.9075C58.0717 31.0327 59.5008 31.7515 60.5183 32.9117C61.0047 33.4853 61.3674 34.1532 61.5837 34.8735C61.8 35.5938 61.8652 36.351 61.7752 37.0977C61.6853 37.8443 61.4421 38.5644 61.0609 39.2127C60.6797 39.861 60.1688 40.4236 59.56 40.8653L48.9233 49.2981C47.7471 50.2726 46.2362 50.7481 44.7139 50.6227C43.1916 50.4973 41.7789 49.7811 40.778 48.6273" fill="#FBBC04"/><path d="M40.5713 48.3637L42.407 47.573L42.1536 49.7896C42.6552 50.095 43.2013 50.3239 43.7739 50.4673L44.1318 47.2855V46.8064C44.0813 46.599 43.9852 46.4055 43.8505 46.24C43.7159 46.0744 43.546 45.9408 43.3533 45.8491C43.1607 45.7573 42.95 45.7096 42.7365 45.7095C42.5231 45.7093 42.3123 45.7566 42.1195 45.8481L39.7842 46.858C39.9679 47.3975 40.2335 47.9053 40.5713 48.3637Z" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M38.7656 67.7925L35.1242 61.3721C34.9016 60.9865 34.5798 60.6675 34.1922 60.4484C33.8046 60.2294 33.3653 60.1182 32.9202 60.1264H25.4457C25.0128 60.1261 24.5862 60.2305 24.2025 60.4307C23.8187 60.631 23.489 60.9211 23.2417 61.2763L19.4086 67.6967C19.1693 68.0681 19.042 68.5006 19.042 68.9425C19.042 69.3843 19.1693 69.8168 19.4086 70.1882L23.05 76.6086C23.2823 76.9564 23.5954 77.2427 23.9626 77.4429C24.3298 77.6432 24.74 77.7515 25.1582 77.7585H32.7285C33.17 77.7482 33.6022 77.6292 33.9867 77.4119C34.3711 77.1946 34.696 76.8857 34.9325 76.5127L38.7656 70.0923C38.9966 69.7355 39.1195 69.3196 39.1195 68.8945C39.1195 68.4695 38.9966 68.0535 38.7656 67.6967" fill="#34A853"/><path d="M37.8563 102.728C37.4952 102.177 37.0786 101.664 36.6131 101.198L35.3699 99.6676C34.8004 98.98 34.3721 98.1868 34.1096 97.3335C33.847 96.4802 33.7553 95.5835 33.8397 94.6947L34.1266 92.3995V91.4431C34.1422 91.1844 34.1097 90.925 34.031 90.6781C33.9147 89.9294 33.6513 89.2112 33.256 88.5649C32.8608 87.9186 32.3414 87.357 31.7279 86.9124C31.1144 86.4679 30.419 86.1493 29.6817 85.9749C28.9445 85.8005 28.18 85.7738 27.4323 85.8964C25.9143 86.1325 24.5506 86.9579 23.6374 88.1933C22.7243 89.4288 22.3353 90.9746 22.5551 92.4951C22.5551 92.6864 22.6507 92.9733 22.6507 93.1646L23.0332 94.1209L23.9896 96.2248C24.3574 97.0334 24.5556 97.9088 24.5721 98.797C24.5885 99.6852 24.4228 100.567 24.0852 101.389L23.3201 103.302C23.0256 103.857 22.7699 104.432 22.5551 105.023C22.219 106.373 22.219 107.785 22.5551 109.135C23.0669 111.021 24.2333 112.663 25.8455 113.767C27.4576 114.871 29.4101 115.365 31.3533 115.16C32.4747 115.066 33.5654 114.746 34.5594 114.218C35.5533 113.691 36.43 112.967 37.1362 112.091C37.8425 111.215 38.3637 110.204 38.6682 109.121C38.9728 108.038 39.0545 106.904 38.9083 105.788C38.7742 104.706 38.4159 103.664 37.8563 102.728V102.728Z" stroke="#D2E3FC" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M36.1783 133.625C34.5416 133.565 32.9337 133.177 31.4494 132.485C29.965 131.793 28.6343 130.81 27.5358 129.595C26.4372 128.381 25.593 126.958 25.053 125.412C24.513 123.866 24.2881 122.227 24.3916 120.593V120.401C24.6375 117.096 26.1709 114.019 28.6618 111.833C31.1528 109.647 34.4023 108.525 37.7115 108.71C39.3481 108.771 40.956 109.159 42.4404 109.851C43.9247 110.543 45.2554 111.526 46.354 112.74C47.4526 113.955 48.2967 115.377 48.8367 116.923C49.3767 118.47 49.6016 120.108 49.4982 121.743V121.934C49.2522 125.24 47.7189 128.316 45.2279 130.503C42.737 132.689 39.4874 133.81 36.1783 133.625Z" fill="#EA4335"/><path d="M39.585 108.925C39.0441 108.821 38.4957 108.752 37.9435 108.721C37.0703 111.497 34.4578 113.72 31.0994 114.077C29.516 114.245 28.1458 114.059 27.0013 113.6C26.7044 113.983 26.4304 114.383 26.1804 114.797C27.7192 115.519 29.4829 115.857 31.291 115.706C34.7854 115.415 38.3903 112.524 39.585 108.925Z" fill="white"/><path fill-rule="evenodd" clip-rule="evenodd" d="M122.422 36.1698L97.6031 41.2486C97.2861 41.3057 96.9593 41.2378 96.6913 41.0591C96.4233 40.8804 96.2349 40.6049 96.1657 40.2903L91.1827 15.2796C91.1256 14.9626 91.1935 14.6358 91.3722 14.3678C91.5509 14.0998 91.8264 13.9114 92.141 13.8422L116.96 8.76338C117.277 8.70629 117.604 8.77421 117.872 8.95288C118.14 9.13154 118.328 9.40704 118.397 9.72161L123.38 34.7324C123.438 35.0494 123.37 35.3762 123.191 35.6442C123.012 35.9122 122.737 36.1006 122.422 36.1698" fill="#4285F4"/><path d="M97.1411 34.7775C96.9544 35.1473 97.1027 35.5984 97.4724 35.7851C97.8422 35.9718 98.2933 35.8235 98.48 35.4537L97.1411 34.7775ZM102.224 26.377L102.499 25.679C102.138 25.5372 101.729 25.6931 101.555 26.0388L102.224 26.377ZM121.016 34.5778C121.401 34.7295 121.836 34.54 121.988 34.1545C122.14 33.7691 121.95 33.3337 121.565 33.182L121.016 34.5778ZM98.48 35.4537L102.893 26.7151L101.555 26.0388L97.1411 34.7775L98.48 35.4537ZM101.949 27.0749L121.016 34.5778L121.565 33.182L102.499 25.679L101.949 27.0749Z" fill="white"/><path d="M111.752 14.1154C111.307 14.3889 110.953 14.8494 110.569 15.2032C110.037 15.6946 109.306 15.9554 108.583 15.9127C107.402 15.9127 106.244 15.7921 105.515 16.9287C105.182 17.4476 105.07 18.0774 105.201 18.6795C105.333 19.2815 105.699 19.8067 106.217 20.1393C107.031 20.6609 107.812 20.5201 108.63 20.1693L109.482 19.7436C110.113 19.4016 110.879 19.3319 111.563 19.5544C112.637 19.8903 113.598 20.2495 114.731 19.9328C115.479 19.6768 116.114 19.1688 116.529 18.4957C117.451 16.9975 117.021 14.9934 115.58 14.0098C115.204 13.7532 114.78 13.5758 114.333 13.4883C113.415 13.3083 112.483 13.5291 111.752 14.1154Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><circle cx="97.8106" cy="19.5801" r="2.75364" stroke="white" stroke-width="1.5"/><path d="M143.04 35.6692C142.662 35.4991 142.218 35.6674 142.048 36.0451C141.878 36.4228 142.046 36.8668 142.424 37.0369L143.04 35.6692ZM144.569 36.8487L144.565 37.5986L144.569 36.8487ZM146.756 37.0377C147.134 36.8686 147.304 36.425 147.135 36.0469C146.966 35.6688 146.522 35.4993 146.144 35.6684L146.756 37.0377ZM142.732 36.353C142.424 37.0369 142.424 37.0369 142.424 37.037C142.424 37.037 142.424 37.037 142.424 37.0371C142.424 37.0371 142.425 37.0372 142.425 37.0373C142.425 37.0375 142.426 37.0376 142.426 37.0379C142.427 37.0383 142.428 37.0389 142.43 37.0395C142.433 37.0409 142.437 37.0427 142.442 37.0449C142.452 37.0494 142.466 37.0556 142.484 37.0633C142.52 37.0786 142.57 37.0998 142.633 37.1251C142.757 37.1753 142.931 37.2424 143.131 37.3099C143.51 37.4376 144.065 37.5957 144.565 37.5986L144.573 36.0987C144.327 36.0972 143.964 36.0076 143.61 35.8885C143.444 35.8326 143.299 35.7766 143.195 35.7347C143.144 35.7138 143.103 35.6966 143.076 35.685C143.063 35.6793 143.053 35.6749 143.047 35.6722C143.043 35.6708 143.041 35.6698 143.04 35.6693C143.04 35.6691 143.039 35.6689 143.039 35.6689C143.039 35.6689 143.039 35.6689 143.039 35.6689C143.039 35.669 143.039 35.669 143.039 35.669C143.039 35.669 143.04 35.6691 143.04 35.6691C143.04 35.6691 143.04 35.6692 142.732 36.353ZM144.565 37.5986C145.076 37.6016 145.644 37.443 146.032 37.3143C146.237 37.2462 146.415 37.1783 146.542 37.1272C146.606 37.1016 146.658 37.08 146.694 37.0645C146.713 37.0567 146.727 37.0504 146.738 37.0459C146.743 37.0436 146.747 37.0418 146.75 37.0404C146.752 37.0397 146.753 37.0391 146.754 37.0387C146.754 37.0385 146.755 37.0383 146.755 37.0381C146.755 37.038 146.756 37.0379 146.756 37.0379C146.756 37.0378 146.756 37.0378 146.756 37.0378C146.756 37.0377 146.756 37.0377 146.45 36.353C146.144 35.6684 146.144 35.6683 146.144 35.6683C146.144 35.6683 146.144 35.6682 146.144 35.6682C146.144 35.6682 146.144 35.6682 146.144 35.6681C146.144 35.6681 146.145 35.6681 146.144 35.6681C146.144 35.6681 146.144 35.6683 146.143 35.6685C146.142 35.6691 146.14 35.67 146.137 35.6714C146.131 35.6742 146.12 35.6786 146.107 35.6845C146.079 35.6963 146.037 35.7137 145.984 35.735C145.878 35.7776 145.729 35.8343 145.559 35.8907C145.197 36.0109 144.825 36.1001 144.573 36.0987L144.565 37.5986Z" fill="#4285F4"/><circle cx="148.15" cy="34.2726" r="6.12759" stroke="#4285F4" stroke-width="1.5"/><path d="M135.707 52.0342C135.777 51.6259 135.502 51.2385 135.094 51.1691C134.685 51.0996 134.298 51.3743 134.229 51.7827L135.707 52.0342ZM157.997 68.6226C158.412 68.6226 158.747 68.2869 158.747 67.8726C158.747 67.4584 158.412 67.1226 157.997 67.1226V68.6226ZM134.968 51.9084C134.229 51.7827 134.229 51.7829 134.229 51.7831C134.229 51.7832 134.228 51.7835 134.228 51.7836C134.228 51.784 134.228 51.7844 134.228 51.7848C134.228 51.7856 134.228 51.7865 134.228 51.7875C134.227 51.7895 134.227 51.7919 134.227 51.7948C134.226 51.8005 134.225 51.8078 134.223 51.8169C134.22 51.8351 134.217 51.86 134.213 51.8922C134.204 51.9564 134.193 52.0493 134.181 52.1733C134.157 52.4213 134.129 52.7941 134.111 53.312C134.074 54.3474 134.074 55.9647 134.219 58.3255L135.717 58.2335C135.574 55.9135 135.575 54.3453 135.61 53.3654C135.627 52.8756 135.653 52.5333 135.674 52.3181C135.684 52.2105 135.694 52.1347 135.7 52.0883C135.703 52.065 135.705 52.0491 135.706 52.0402C135.707 52.0358 135.708 52.0331 135.708 52.0321C135.708 52.0316 135.708 52.0315 135.708 52.0319C135.708 52.032 135.708 52.0323 135.708 52.0327C135.708 52.0329 135.708 52.0331 135.708 52.0334C135.707 52.0335 135.707 52.0337 135.707 52.0338C135.707 52.034 135.707 52.0342 134.968 51.9084ZM134.219 58.3255C134.367 60.7201 134.721 62.2799 135.098 63.367C135.286 63.9106 135.477 64.326 135.641 64.6567C135.819 65.0157 135.918 65.1892 135.989 65.3654L137.38 64.8022C137.281 64.5576 137.116 64.2552 136.985 63.9908C136.84 63.6981 136.677 63.3427 136.515 62.8755C136.191 61.941 135.857 60.5195 135.717 58.2335L134.219 58.3255ZM135.989 65.3654C136.025 65.4543 136.061 65.6209 136.077 65.8708C136.092 66.1098 136.087 66.3787 136.071 66.6442L137.568 66.7368C137.587 66.4343 137.594 66.0981 137.574 65.7749C137.554 65.4627 137.504 65.11 137.38 64.8022L135.989 65.3654ZM137.875 68.6226H157.997V67.1226H137.875V68.6226ZM136.071 66.6442C136.009 67.644 136.771 68.6226 137.875 68.6226V67.1226C137.8 67.1226 137.726 67.091 137.664 67.0199C137.599 66.946 137.561 66.8433 137.568 66.7368L136.071 66.6442Z" fill="#4285F4"/><line x1="159.28" y1="59.2826" x2="158.202" y2="67.695" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round"/><line x1="158.045" y1="68.0168" x2="138.272" y2="72.0241" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round"/><path d="M91.5512 90.6327C92.3514 90.4183 92.8262 89.5958 92.6118 88.7956C92.3974 87.9954 91.5749 87.5205 90.7747 87.735L91.5512 90.6327ZM68.6902 95.2054L67.5442 96.1732C67.9192 96.6173 68.517 96.8047 69.0784 96.6543L68.6902 95.2054ZM53.2679 74.6177C52.7334 73.9847 51.787 73.9049 51.154 74.4394C50.5211 74.9739 50.4413 75.9203 50.9758 76.5532L53.2679 74.6177ZM90.7747 87.735L68.302 93.7565L69.0784 96.6543L91.5512 90.6327L90.7747 87.735ZM69.8362 94.2376L53.2679 74.6177L50.9758 76.5532L67.5442 96.1732L69.8362 94.2376Z" fill="#4285F4"/><path d="M143.953 90.7429C138.582 93.1174 138.504 93.5421 132.288 95.5999C131.387 95.9621 130.423 96.1439 129.451 96.1347C128.48 96.0934 127.537 95.8901 127.13 95.0125" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M136.315 91.2656C132.592 92.9685 129.732 94.6203 126.066 95.0914C125.291 95.2434 124.486 95.1076 123.805 94.7098C123.105 94.2792 122.678 93.1531 123.38 92.4589" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M135.515 88.5316C134.166 89.1703 132.871 89.9163 131.468 90.4477C129.758 91.1215 127.989 91.6362 126.183 91.9852C125.49 92.125 124.788 92.2124 124.081 92.2467C123.219 92.2441 122.25 92.027 121.767 91.2757C121.604 90.9698 121.538 90.6219 121.577 90.2778C121.617 89.9338 121.76 89.6097 121.989 89.3482C123.178 88.0128 125.981 87.4855 128.568 87.3326" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M132.464 81.881C130.74 81.8223 127.668 81.8668 125.89 81.8615C125.028 81.8589 124.059 81.6953 123.738 80.9445C123.59 80.4893 123.697 79.9682 124.011 79.6063C124.348 79.2622 124.753 78.9901 125.199 78.8065C129.555 77.2276 134.846 76.3763 139.43 76.7065" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M133.65 81.4025C130.642 82.7378 127.4 83.4742 124.107 83.5701C123.292 83.5614 122.484 83.7232 121.735 84.045C121.033 84.4179 120.438 85.2731 120.705 86.0237C120.781 86.2689 120.912 86.4935 121.089 86.6799C121.266 86.8663 121.484 87.0093 121.726 87.0979C122.197 87.2498 122.686 87.3412 123.18 87.3701C127.759 87.7586 130.561 87.3921 134.716 85.4763" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M89.8261 77.9328C89.3593 79.5933 88.0517 81.6189 86.2805 82.4635C85.5754 82.7995 84.8016 83.1285 84.3382 83.7525C84.1399 84.005 84.0424 84.3242 84.0646 84.6485C84.142 85.1131 84.608 85.4563 85.0734 85.5577C85.5507 85.6041 86.031 85.5547 86.4866 85.4124C90.1254 84.4638 94.6359 83.2875 97.2845 80.3411C97.809 79.7502 98.3361 79.0037 98.5628 78.2211" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M89.4111 78.487C87.4971 78.9462 84.2803 78.6327 83.2772 79.8998C83.2772 79.8998 82.488 80.7214 82.6911 83.1436C82.7252 83.3674 82.7426 83.6001 82.76 83.8329C82.8666 85.5146 83.0077 86.9795 82.4516 88.3139C82.1228 89.1075 81.4288 90.186 80.596 90.0846C79.7631 89.9831 79.6817 89.1904 79.6214 88.2763C79.561 87.3623 78.9086 81.66 78.6348 79.6282C78.5251 78.7654 78.746 77.898 79.2521 77.2041C80.8661 75.1455 83.5824 74.2098 85.9622 73.4114C89.0903 72.3415 92.6929 71.201 96.1045 70.9816" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M78.7289 78.2785C76.8666 80.9994 75.1275 83.5878 73.8006 85.778C73.6002 86.1281 73.3755 86.5134 73.4589 86.9087C73.5423 87.304 73.9856 87.7255 74.3656 87.8289C74.7504 87.8965 75.1448 87.8452 75.4967 87.6816C76.3299 87.3426 76.9624 86.6714 77.5264 85.9932C78.103 85.2765 78.6255 84.5166 79.0895 83.7199" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M64.6461 127.545C64.5815 127.136 64.1975 126.857 63.7883 126.922C63.3792 126.986 63.0999 127.37 63.1644 127.779L64.6461 127.545ZM65.4042 129.936C65.8184 129.936 66.1542 129.601 66.1542 129.186C66.1542 128.772 65.8184 128.436 65.4042 128.436V129.936ZM63.9053 127.662C63.1644 127.779 63.1645 127.78 63.1646 127.78C63.1646 127.78 63.1646 127.78 63.1647 127.781C63.1648 127.781 63.1648 127.782 63.1649 127.782C63.1651 127.783 63.1652 127.784 63.1654 127.785C63.1658 127.787 63.1661 127.79 63.1665 127.792C63.1674 127.797 63.1683 127.802 63.1694 127.807C63.1715 127.819 63.1742 127.832 63.1775 127.847C63.1842 127.877 63.1936 127.914 63.2065 127.958C63.2323 128.045 63.2723 128.157 63.3339 128.287C63.4577 128.548 63.6661 128.874 64.0119 129.204L65.0477 128.119C64.8439 127.925 64.7401 127.751 64.689 127.644C64.6632 127.589 64.6501 127.55 64.6447 127.532C64.642 127.522 64.6411 127.519 64.6416 127.521C64.6418 127.522 64.6424 127.524 64.6431 127.528C64.6435 127.53 64.644 127.533 64.6445 127.536C64.6447 127.537 64.645 127.539 64.6453 127.54C64.6454 127.541 64.6455 127.542 64.6457 127.543C64.6457 127.543 64.6458 127.544 64.6459 127.544C64.6459 127.544 64.646 127.545 64.646 127.545C64.646 127.545 64.6461 127.545 63.9053 127.662ZM64.0119 129.204C64.3401 129.517 64.6305 129.702 64.8725 129.808C64.9933 129.861 65.1001 129.893 65.1907 129.912C65.2359 129.922 65.2765 129.928 65.3123 129.931C65.3302 129.933 65.3469 129.934 65.3622 129.935C65.3699 129.936 65.3772 129.936 65.3842 129.936C65.3877 129.936 65.3911 129.936 65.3944 129.936C65.3961 129.936 65.3977 129.936 65.3994 129.936C65.4002 129.936 65.401 129.936 65.4018 129.936C65.4022 129.936 65.4028 129.936 65.403 129.936C65.4036 129.936 65.4042 129.936 65.4042 129.186C65.4042 128.436 65.4048 128.436 65.4053 128.436C65.4055 128.436 65.4061 128.436 65.4065 128.436C65.4073 128.436 65.4081 128.436 65.4088 128.436C65.4104 128.436 65.4119 128.436 65.4134 128.436C65.4164 128.436 65.4194 128.436 65.4222 128.437C65.428 128.437 65.4334 128.437 65.4386 128.437C65.4489 128.438 65.458 128.438 65.4659 128.439C65.4819 128.441 65.4928 128.443 65.499 128.444C65.5115 128.447 65.5027 128.446 65.4737 128.434C65.4159 128.408 65.2691 128.331 65.0477 128.119L64.0119 129.204Z" fill="#4285F4"/><path d="M55.7583 150.423L57.3571 163.719L64.1736 169.526" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M58.5609 164.731H79.6141" stroke="#4285F4" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M83.7419 155.142C83.9313 154.774 83.7862 154.322 83.4178 154.132C83.0494 153.943 82.5972 154.088 82.4079 154.456L83.7419 155.142ZM78.8643 164.715C78.8556 165.129 79.1843 165.472 79.5984 165.481C80.0126 165.489 80.3553 165.161 80.364 164.747L78.8643 164.715ZM83.0749 154.799C82.4079 154.456 82.4078 154.457 82.4078 154.457C82.4078 154.457 82.4078 154.457 82.4077 154.457C82.4077 154.457 82.4076 154.457 82.4075 154.457C82.4073 154.457 82.4071 154.458 82.4068 154.458C82.4062 154.46 82.4054 154.461 82.4043 154.463C82.4022 154.467 82.3992 154.473 82.3952 154.481C82.3872 154.497 82.3755 154.52 82.3604 154.55C82.3301 154.61 82.2859 154.698 82.2291 154.813C82.1157 155.043 81.9522 155.379 81.7508 155.806C81.3479 156.661 80.7926 157.884 80.1804 159.36L81.5659 159.934C82.1676 158.484 82.7131 157.283 83.1077 156.446C83.3049 156.027 83.4643 155.7 83.574 155.477C83.6288 155.366 83.6712 155.282 83.6997 155.225C83.714 155.197 83.7247 155.176 83.7318 155.162C83.7354 155.155 83.738 155.15 83.7397 155.147C83.7405 155.145 83.7411 155.144 83.7415 155.143C83.7417 155.143 83.7418 155.142 83.7419 155.142C83.7419 155.142 83.7419 155.142 83.742 155.142C83.742 155.142 83.7419 155.142 83.7419 155.142C83.7419 155.142 83.7419 155.142 83.0749 154.799ZM80.1804 159.36C79.5499 160.88 79.2214 162.203 79.0503 163.153C78.9648 163.628 78.9184 164.011 78.8934 164.278C78.8809 164.412 78.8737 164.517 78.8696 164.591C78.8676 164.628 78.8663 164.657 78.8655 164.678C78.8651 164.688 78.8648 164.696 78.8646 164.703C78.8645 164.706 78.8645 164.708 78.8644 164.711C78.8644 164.712 78.8644 164.713 78.8643 164.713C78.8643 164.714 78.8643 164.714 78.8643 164.714C78.8643 164.715 78.8643 164.715 78.8643 164.715C78.8643 164.715 78.8643 164.715 79.6141 164.731C80.364 164.747 80.364 164.747 80.364 164.747C80.364 164.747 80.364 164.747 80.364 164.747C80.364 164.748 80.3639 164.748 80.3639 164.748C80.3639 164.748 80.3639 164.748 80.3639 164.748C80.3639 164.748 80.3639 164.748 80.364 164.747C80.364 164.745 80.3642 164.741 80.3644 164.734C80.3649 164.722 80.3657 164.702 80.3673 164.674C80.3704 164.619 80.3762 164.532 80.3869 164.418C80.4083 164.189 80.4491 163.849 80.5266 163.419C80.6816 162.559 80.9826 161.34 81.5659 159.934L80.1804 159.36Z" fill="#4285F4"/><path d="M83.044 157.064C83.1075 156.654 82.8272 156.271 82.4179 156.207C82.0086 156.144 81.6253 156.424 81.5617 156.833L83.044 157.064ZM97.4442 174.609C97.8552 174.66 98.2303 174.369 98.2822 173.958C98.334 173.547 98.0429 173.172 97.632 173.12L97.4442 174.609ZM82.3029 156.948C81.5617 156.833 81.5617 156.834 81.5616 156.834C81.5616 156.834 81.5616 156.835 81.5615 156.835C81.5614 156.836 81.5613 156.836 81.5612 156.837C81.561 156.838 81.5607 156.84 81.5604 156.843C81.5597 156.847 81.5589 156.853 81.5578 156.86C81.5558 156.874 81.5531 156.894 81.55 156.919C81.5436 156.969 81.5354 157.04 81.5267 157.13C81.5094 157.31 81.4902 157.568 81.4811 157.892C81.463 158.539 81.4851 159.451 81.6436 160.529C81.9606 162.686 82.8259 165.521 85.018 168.219L86.1822 167.273C84.1986 164.832 83.4153 162.268 83.1276 160.311C82.9838 159.332 82.9644 158.509 82.9805 157.934C82.9886 157.647 83.0054 157.423 83.0198 157.274C83.027 157.199 83.0335 157.143 83.0381 157.108C83.0403 157.09 83.042 157.077 83.0431 157.07C83.0436 157.066 83.044 157.064 83.0441 157.063C83.0442 157.062 83.0442 157.062 83.0442 157.062C83.0442 157.062 83.0442 157.062 83.0441 157.063C83.0441 157.063 83.0441 157.063 83.0441 157.063C83.044 157.063 83.044 157.064 82.3029 156.948ZM85.018 168.219C87.2283 170.939 90.3577 172.529 92.8808 173.438C94.1494 173.895 95.283 174.187 96.1009 174.364C96.5103 174.453 96.8417 174.514 97.0728 174.552C97.1884 174.571 97.279 174.585 97.3418 174.594C97.3732 174.599 97.3977 174.602 97.4149 174.605C97.4234 174.606 97.4302 174.607 97.4351 174.607C97.4376 174.608 97.4396 174.608 97.4411 174.608C97.4418 174.608 97.4425 174.608 97.443 174.608C97.4433 174.609 97.4436 174.609 97.4437 174.609C97.444 174.609 97.4442 174.609 97.5381 173.865C97.632 173.12 97.6321 173.12 97.6323 173.12C97.6323 173.12 97.6324 173.121 97.6325 173.121C97.6325 173.121 97.6324 173.121 97.6323 173.12C97.6319 173.12 97.6311 173.12 97.6298 173.12C97.6272 173.12 97.6227 173.119 97.6165 173.118C97.6041 173.117 97.5844 173.114 97.558 173.11C97.505 173.102 97.4248 173.09 97.32 173.073C97.1103 173.038 96.8027 172.982 96.4191 172.898C95.6511 172.732 94.5831 172.457 93.3892 172.027C90.9872 171.161 88.1477 169.692 86.1822 167.273L85.018 168.219Z" fill="#4285F4"/><path d="M98.7305 172.338C98.3266 172.246 97.9246 172.499 97.8325 172.903C97.7404 173.306 97.9932 173.709 98.397 173.801L98.7305 172.338ZM103.9 160.586C103.492 160.515 103.104 160.788 103.032 161.196C102.961 161.604 103.234 161.993 103.642 162.064L103.9 160.586ZM98.5638 173.069C98.397 173.801 98.397 173.801 98.3971 173.801C98.3971 173.801 98.3972 173.801 98.3973 173.801C98.3975 173.801 98.3979 173.801 98.3983 173.801C98.3993 173.801 98.4007 173.801 98.4026 173.802C98.4063 173.803 98.412 173.804 98.4196 173.806C98.4347 173.809 98.4573 173.814 98.487 173.821C98.5465 173.835 98.6343 173.855 98.7477 173.881C98.9744 173.934 99.3031 174.011 99.7104 174.107C100.525 174.299 101.653 174.57 102.908 174.882C105.425 175.51 108.424 176.3 110.424 176.967L110.898 175.544C108.837 174.857 105.787 174.054 103.271 173.427C102.009 173.112 100.874 172.84 100.055 172.647C99.6456 172.55 99.3148 172.473 99.0863 172.42C98.972 172.394 98.8832 172.373 98.8229 172.359C98.7928 172.352 98.7698 172.347 98.7543 172.344C98.7465 172.342 98.7406 172.34 98.7366 172.34C98.7346 172.339 98.7331 172.339 98.7321 172.339C98.7316 172.338 98.7312 172.338 98.7309 172.338C98.7308 172.338 98.7307 172.338 98.7306 172.338C98.7305 172.338 98.7305 172.338 98.5638 173.069ZM110.424 176.967C114.516 178.33 119.053 179.343 119.92 179.47L120.138 177.986C119.38 177.875 114.931 176.887 110.898 175.544L110.424 176.967ZM119.92 179.47C120.364 179.535 121.324 179.6 122.112 179.266C122.53 179.089 122.96 178.773 123.184 178.234C123.404 177.703 123.367 177.091 123.142 176.435L121.724 176.922C121.877 177.37 121.831 177.58 121.798 177.659C121.769 177.73 121.703 177.811 121.527 177.885C121.127 178.054 120.507 178.04 120.138 177.986L119.92 179.47ZM123.142 176.435C122.861 175.615 122.16 175.084 121.498 174.694C120.853 174.314 119.981 173.931 119.319 173.589C118.597 173.215 117.989 172.83 117.569 172.353C117.173 171.903 116.929 171.355 116.963 170.583L115.465 170.517C115.412 171.703 115.809 172.624 116.443 173.345C117.055 174.039 117.87 174.528 118.63 174.921C119.45 175.346 120.118 175.623 120.737 175.987C121.339 176.341 121.626 176.639 121.724 176.922L123.142 176.435ZM132.723 161.769C133.11 161.576 133.467 161.309 133.75 161.003C134.026 160.703 134.27 160.321 134.357 159.89C134.45 159.427 134.353 158.926 133.974 158.524C133.625 158.154 133.111 157.945 132.517 157.841L132.258 159.318C132.692 159.394 132.845 159.513 132.882 159.552C132.889 159.56 132.895 159.55 132.886 159.594C132.871 159.67 132.807 159.812 132.647 159.986C132.492 160.154 132.283 160.312 132.052 160.427L132.723 161.769ZM111.801 161.038C109.79 161.149 107.813 161.036 106.333 160.895C105.594 160.824 104.982 160.746 104.557 160.686C104.344 160.657 104.178 160.631 104.066 160.613C104.01 160.605 103.968 160.598 103.94 160.593C103.926 160.591 103.916 160.589 103.909 160.588C103.906 160.587 103.903 160.587 103.902 160.586C103.901 160.586 103.9 160.586 103.9 160.586C103.9 160.586 103.9 160.586 103.9 160.586C103.9 160.586 103.9 160.586 103.9 160.586C103.9 160.586 103.9 160.586 103.771 161.325C103.642 162.064 103.642 162.064 103.642 162.064C103.643 162.064 103.643 162.064 103.643 162.064C103.643 162.064 103.643 162.064 103.644 162.064C103.644 162.064 103.645 162.064 103.646 162.065C103.649 162.065 103.652 162.066 103.656 162.066C103.665 162.068 103.677 162.07 103.693 162.072C103.725 162.078 103.771 162.085 103.831 162.095C103.952 162.114 104.126 162.141 104.348 162.172C104.792 162.234 105.426 162.315 106.19 162.388C107.714 162.534 109.772 162.652 111.883 162.536L111.801 161.038ZM116.963 170.583C117.033 168.997 118.143 167.728 119.817 166.644C121.483 165.564 123.502 164.796 125.093 164.127L124.511 162.744C122.998 163.381 120.81 164.213 119.001 165.385C117.2 166.552 115.567 168.189 115.465 170.517L116.963 170.583ZM125.093 164.127C126.59 163.497 128.131 163.079 129.48 162.736C130.145 162.567 130.78 162.412 131.318 162.263C131.848 162.116 132.344 161.959 132.723 161.769L132.052 160.427C131.813 160.547 131.439 160.673 130.917 160.818C130.401 160.961 129.799 161.107 129.11 161.282C127.752 161.627 126.118 162.068 124.511 162.744L125.093 164.127ZM132.517 157.841C131.383 157.642 129.801 157.695 128.217 157.856C126.614 158.019 124.937 158.299 123.581 158.591L123.896 160.057C125.205 159.776 126.826 159.505 128.368 159.348C129.928 159.19 131.338 159.157 132.258 159.318L132.517 157.841ZM123.581 158.591C122.248 158.877 120.227 159.455 118.16 159.956C116.044 160.469 113.79 160.928 111.801 161.038L111.883 162.536C114.015 162.418 116.378 161.932 118.513 161.414C120.698 160.884 122.565 160.343 123.896 160.057L123.581 158.591Z" fill="#4285F4"/><path d="M132.93 161.653L133.272 160.986C133.24 160.969 133.207 160.955 133.173 160.944L132.93 161.653ZM122.277 167.241C121.885 167.377 121.678 167.804 121.813 168.195C121.948 168.587 122.375 168.794 122.767 168.659L122.277 167.241ZM131.695 160.648C131.281 160.648 130.945 160.984 130.945 161.398C130.945 161.812 131.281 162.148 131.695 162.148L131.695 160.648ZM132.588 162.321C132.599 162.327 132.718 162.42 132.724 162.711C132.729 162.978 132.624 163.238 132.441 163.396L133.419 164.533C133.995 164.037 134.236 163.319 134.224 162.682C134.212 162.07 133.951 161.334 133.272 160.986L132.588 162.321ZM132.441 163.396C132.46 163.379 132.44 163.398 132.334 163.456C132.241 163.505 132.114 163.567 131.954 163.641C131.633 163.787 131.206 163.966 130.705 164.166C129.705 164.566 128.436 165.041 127.184 165.497C125.934 165.954 124.707 166.39 123.792 166.712C123.335 166.873 122.956 167.005 122.691 167.098C122.559 167.144 122.455 167.18 122.385 167.204C122.349 167.216 122.322 167.226 122.304 167.232C122.295 167.235 122.288 167.238 122.284 167.239C122.281 167.24 122.28 167.24 122.279 167.241C122.278 167.241 122.278 167.241 122.277 167.241C122.277 167.241 122.277 167.241 122.277 167.241C122.277 167.241 122.277 167.241 122.522 167.95C122.767 168.659 122.767 168.659 122.767 168.659C122.767 168.659 122.767 168.659 122.767 168.659C122.768 168.659 122.768 168.659 122.769 168.659C122.77 168.658 122.772 168.658 122.774 168.657C122.779 168.655 122.786 168.653 122.795 168.649C122.813 168.643 122.841 168.634 122.876 168.621C122.947 168.597 123.052 168.56 123.185 168.514C123.451 168.421 123.831 168.288 124.291 168.127C125.209 167.803 126.441 167.365 127.699 166.907C128.954 166.448 130.24 165.967 131.262 165.559C131.772 165.355 132.224 165.166 132.576 165.005C132.752 164.925 132.911 164.848 133.043 164.777C133.161 164.714 133.305 164.631 133.419 164.533L132.441 163.396ZM131.695 162.148C132.012 162.148 132.322 162.238 132.688 162.363L133.173 160.944C132.798 160.816 132.282 160.648 131.695 160.648L131.695 162.148Z" fill="#4285F4"/><path d="M126.353 165.87C125.945 165.94 125.671 166.329 125.742 166.737C125.812 167.145 126.2 167.418 126.608 167.348L126.353 165.87ZM122.423 169.721C122.014 169.788 121.737 170.173 121.803 170.582C121.87 170.991 122.255 171.268 122.664 171.202L122.423 169.721ZM126.481 166.609C126.608 167.348 126.608 167.348 126.608 167.348C126.608 167.348 126.608 167.348 126.608 167.348C126.608 167.348 126.608 167.348 126.609 167.348C126.609 167.348 126.61 167.348 126.611 167.348C126.613 167.347 126.616 167.347 126.62 167.346C126.628 167.345 126.641 167.342 126.658 167.339C126.692 167.334 126.743 167.325 126.809 167.315C126.94 167.294 127.129 167.265 127.359 167.233C127.82 167.169 128.44 167.092 129.085 167.041C129.735 166.99 130.386 166.966 130.915 167.002C131.18 167.02 131.393 167.052 131.55 167.093C131.721 167.138 131.754 167.176 131.734 167.157L132.758 166.061C132.513 165.831 132.198 165.712 131.931 165.642C131.649 165.568 131.334 165.527 131.016 165.506C130.38 165.463 129.646 165.492 128.967 165.546C128.283 165.6 127.631 165.681 127.151 165.748C126.911 165.781 126.713 165.812 126.574 165.834C126.505 165.845 126.45 165.854 126.413 165.86C126.394 165.863 126.379 165.865 126.369 165.867C126.364 165.868 126.36 165.869 126.357 165.869C126.356 165.869 126.355 165.869 126.354 165.87C126.354 165.87 126.354 165.87 126.353 165.87C126.353 165.87 126.353 165.87 126.353 165.87C126.353 165.87 126.353 165.87 126.481 166.609ZM131.734 167.157C132.017 167.422 132.035 167.637 132.018 167.762C132.007 167.839 131.979 167.908 131.943 167.963C131.905 168.021 131.874 168.04 131.877 168.039L132.615 169.345C133.074 169.085 133.421 168.559 133.503 167.969C133.593 167.33 133.375 166.637 132.758 166.061L131.734 167.157ZM131.877 168.039C131.942 168.002 131.971 168.002 131.861 168.032C131.784 168.053 131.674 168.08 131.53 168.112C131.243 168.176 130.853 168.255 130.39 168.344C129.465 168.521 128.272 168.733 127.09 168.938C125.909 169.142 124.742 169.338 123.87 169.483C123.434 169.555 123.072 169.615 122.819 169.656C122.693 169.677 122.594 169.693 122.526 169.704C122.492 169.71 122.466 169.714 122.449 169.717C122.44 169.718 122.434 169.719 122.429 169.72C122.427 169.72 122.426 169.721 122.424 169.721C122.424 169.721 122.423 169.721 122.423 169.721C122.423 169.721 122.423 169.721 122.423 169.721C122.423 169.721 122.423 169.721 122.543 170.461C122.664 171.202 122.664 171.202 122.664 171.202C122.664 171.202 122.664 171.202 122.664 171.202C122.665 171.202 122.665 171.202 122.666 171.201C122.667 171.201 122.668 171.201 122.671 171.201C122.675 171.2 122.682 171.199 122.691 171.197C122.708 171.194 122.734 171.19 122.768 171.185C122.836 171.174 122.936 171.157 123.062 171.136C123.316 171.095 123.679 171.035 124.116 170.962C124.99 170.817 126.16 170.621 127.345 170.416C128.53 170.211 129.733 169.997 130.672 169.817C131.14 169.728 131.548 169.645 131.857 169.576C132.011 169.542 132.148 169.509 132.258 169.479C132.335 169.458 132.491 169.415 132.615 169.345L131.877 168.039Z" fill="#4285F4"/><path d="M122.921 169.817C122.507 169.836 122.187 170.186 122.206 170.6C122.225 171.014 122.575 171.334 122.989 171.316L122.921 169.817ZM118.664 173.268C118.26 173.361 118.009 173.764 118.103 174.168C118.196 174.571 118.599 174.823 119.003 174.729L118.664 173.268ZM122.955 170.566C122.989 171.316 122.989 171.316 122.989 171.316C122.989 171.316 122.989 171.316 122.989 171.316C122.989 171.316 122.989 171.316 122.99 171.315C122.99 171.315 122.991 171.315 122.993 171.315C122.996 171.315 123 171.315 123.006 171.315C123.017 171.314 123.035 171.314 123.058 171.313C123.103 171.311 123.171 171.308 123.258 171.305C123.432 171.299 123.683 171.291 123.989 171.283C124.6 171.268 125.427 171.257 126.293 171.269C127.161 171.281 128.054 171.317 128.803 171.395C129.177 171.435 129.503 171.483 129.765 171.541C130.041 171.602 130.19 171.662 130.251 171.697L131.014 170.407C130.747 170.249 130.412 170.148 130.089 170.077C129.752 170.002 129.365 169.946 128.959 169.904C128.146 169.818 127.201 169.781 126.314 169.769C125.423 169.756 124.576 169.768 123.953 169.784C123.64 169.791 123.384 169.799 123.204 169.806C123.115 169.809 123.044 169.812 122.996 169.814C122.972 169.815 122.954 169.816 122.941 169.816C122.935 169.816 122.93 169.817 122.927 169.817C122.925 169.817 122.924 169.817 122.923 169.817C122.922 169.817 122.922 169.817 122.922 169.817C122.922 169.817 122.921 169.817 122.921 169.817C122.921 169.817 122.921 169.817 122.955 170.566ZM130.251 171.697C130.49 171.839 130.591 171.965 130.633 172.04C130.673 172.11 130.678 172.167 130.673 172.218C130.666 172.277 130.641 172.341 130.601 172.398C130.556 172.463 130.526 172.471 130.556 172.457L131.196 173.814C131.675 173.588 132.091 173.027 132.163 172.387C132.248 171.641 131.871 170.913 131.014 170.407L130.251 171.697ZM130.556 172.457C130.624 172.425 130.666 172.423 130.632 172.428C130.611 172.431 130.57 172.436 130.505 172.44C130.374 172.447 130.192 172.448 129.959 172.444C129.493 172.436 128.888 172.408 128.2 172.379C126.848 172.323 125.186 172.265 123.904 172.389L124.049 173.882C125.209 173.77 126.765 173.821 128.137 173.878C128.81 173.906 129.443 173.936 129.933 173.944C130.178 173.948 130.403 173.948 130.589 173.937C130.681 173.932 130.776 173.924 130.866 173.91C130.942 173.898 131.069 173.874 131.196 173.814L130.556 172.457ZM123.904 172.389C122.652 172.511 121.341 172.731 120.35 172.919C119.853 173.013 119.433 173.1 119.137 173.164C118.989 173.195 118.871 173.221 118.791 173.239C118.75 173.248 118.719 173.255 118.698 173.26C118.687 173.263 118.679 173.264 118.673 173.266C118.67 173.266 118.668 173.267 118.667 173.267C118.666 173.267 118.665 173.268 118.665 173.268C118.665 173.268 118.664 173.268 118.664 173.268C118.664 173.268 118.664 173.268 118.664 173.268C118.664 173.268 118.664 173.268 118.833 173.999C119.003 174.729 119.003 174.729 119.003 174.729C119.003 174.729 119.003 174.729 119.003 174.729C119.003 174.729 119.003 174.729 119.003 174.729C119.003 174.729 119.003 174.729 119.004 174.729C119.005 174.729 119.007 174.728 119.009 174.728C119.014 174.727 119.021 174.725 119.031 174.723C119.05 174.718 119.079 174.712 119.118 174.703C119.194 174.686 119.307 174.661 119.451 174.63C119.737 174.569 120.146 174.484 120.629 174.393C121.6 174.209 122.861 173.997 124.049 173.882L123.904 172.389Z" fill="#4285F4"/>
+      </g>
+
+      <g id="nearby-onboarding-splash-dark" fill="none" fill-rule="evenodd">
+        <path d="M82.2421 173.089C77.6111 173.353 75.2561 172.729 71.1623 173.814C71.1623 173.814 67.143 174.844 63.1421 171.33L52.9493 181.247C52.9493 181.247 62.2841 187.4 66.7232 188.18C71.1623 188.961 81.5531 190.705 83.4355 190.246C85.3179 189.787 89.3125 187.583 89.3125 187.583L91.0275 184.645C91.4576 184.6 90.6842 183.702 91.0275 183.469C91.3046 183.183 91.8836 183.469 91.9081 182.497C91.934 181.475 89.5055 180.768 88.6833 180.632C85.1392 179.774 82.0033 179.052 78.4186 178.458C80.314 178.118 82.1727 177.618 83.966 176.967C84.3591 176.826 86.273 175.992 86.3528 175.669C86.414 175.42 86.0459 173.814 86.0459 173.814C85.6516 173.223 83.0902 173.034 82.2421 173.089Z" fill="#8AB4F8" fill-opacity="0.4"/><path d="M71.9978 173.557L71.8707 172.818L71.8591 172.82L71.9978 173.557ZM85.3096 173.13L85.4868 172.401C85.4412 172.39 85.3946 172.383 85.3477 172.381L85.3096 173.13ZM86.725 175.179L85.9968 174.999L86.725 175.179ZM86.3145 175.85L86.7974 176.424C86.806 176.417 86.8145 176.41 86.8227 176.402L86.3145 175.85ZM84.8016 176.71L84.5497 176.003L84.5454 176.005L84.8016 176.71ZM79.2542 178.201L79.1217 177.463C78.7624 177.528 78.5017 177.841 78.5042 178.206C78.5066 178.571 78.7715 178.881 79.1316 178.941L79.2542 178.201ZM89.5188 180.375L89.3423 181.104C89.3603 181.109 89.3785 181.112 89.3967 181.115L89.5188 180.375ZM91.7482 181.289L92.2039 180.694C92.2 180.691 92.1962 180.688 92.1923 180.685L91.7482 181.289ZM91.8631 183.212L92.284 183.833C92.3263 183.804 92.3656 183.771 92.4013 183.734L91.8631 183.212ZM90.6782 183.637L90.6005 182.891C90.5778 182.894 90.5552 182.897 90.5328 182.901L90.6782 183.637ZM88.2012 183.727L88.2944 182.983C88.2722 182.98 88.2498 182.979 88.2274 182.978L88.2012 183.727ZM77.3462 181.024C76.9538 180.892 76.5282 181.102 76.3956 181.495C76.2631 181.887 76.4737 182.313 76.8662 182.445L77.3462 181.024ZM63.7782 170.368C63.467 170.094 62.9931 170.125 62.7198 170.436C62.4465 170.747 62.4772 171.221 62.7884 171.495L63.7782 170.368ZM72.125 174.296C76.188 173.598 80.9034 173.656 85.2715 173.879L85.3477 172.381C80.9629 172.158 76.1074 172.089 71.8707 172.818L72.125 174.296ZM85.9968 174.999C85.9743 175.09 85.9164 175.197 85.8063 175.299L86.8227 176.402C87.1267 176.122 87.3532 175.764 87.4532 175.358L85.9968 174.999ZM85.8316 175.277C85.4686 175.582 85.0331 175.831 84.5497 176.003L85.0535 177.416C85.6966 177.187 86.2905 176.851 86.7974 176.424L85.8316 175.277ZM84.5454 176.005C82.7927 176.642 80.9754 177.13 79.1217 177.463L79.3867 178.939C81.3237 178.592 83.2239 178.081 85.0577 177.415L84.5454 176.005ZM79.1316 178.941C82.6883 179.531 85.8026 180.247 89.3423 181.104L89.6954 179.646C86.1469 178.787 82.9894 178.06 79.3768 177.461L79.1316 178.941ZM89.3967 181.115C90.1236 181.235 90.7782 181.507 91.3041 181.894L92.1923 180.685C91.4607 180.147 90.5811 179.79 89.6409 179.635L89.3967 181.115ZM91.2924 181.885C91.4443 182.001 91.5053 182.137 91.5125 182.257L93.0098 182.167C92.9742 181.573 92.6685 181.049 92.2039 180.694L91.2924 181.885ZM91.5125 182.257C91.5198 182.379 91.4737 182.536 91.325 182.689L92.4013 183.734C92.8067 183.317 93.0452 182.759 93.0098 182.167L91.5125 182.257ZM91.4423 182.591C91.2057 182.751 90.9129 182.859 90.6005 182.891L90.7559 184.383C91.3035 184.326 91.834 184.138 92.284 183.833L91.4423 182.591ZM90.5328 182.901C89.7909 183.048 89.0306 183.075 88.2944 182.983L88.1079 184.471C89.0054 184.584 89.9268 184.55 90.8236 184.373L90.5328 182.901ZM88.2274 182.978C84.4599 182.846 80.7818 182.185 77.3462 181.024L76.8662 182.445C80.4449 183.654 84.2674 184.34 88.1749 184.477L88.2274 182.978ZM62.7884 171.495C64.9278 173.373 67.2583 174.074 69.0446 174.305C69.9375 174.421 70.6988 174.42 71.2408 174.39C71.5122 174.375 71.7296 174.352 71.8822 174.332C71.9586 174.323 72.0188 174.314 72.0616 174.307C72.0831 174.304 72.1001 174.301 72.1127 174.299C72.1189 174.297 72.1241 174.297 72.1281 174.296C72.1301 174.295 72.1318 174.295 72.1332 174.295C72.1339 174.295 72.1346 174.295 72.1351 174.295C72.1354 174.294 72.1358 174.294 72.1359 174.294C72.1363 174.294 72.1366 174.294 71.9978 173.557C71.8591 172.82 71.8594 172.82 71.8597 172.82C71.8597 172.82 71.86 172.82 71.8601 172.82C71.8604 172.82 71.8606 172.82 71.8608 172.82C71.861 172.82 71.861 172.82 71.8607 172.82C71.8602 172.82 71.8585 172.82 71.8557 172.821C71.8502 172.822 71.8403 172.823 71.8262 172.826C71.798 172.83 71.7531 172.837 71.6928 172.844C71.572 172.86 71.3899 172.879 71.1568 172.892C70.69 172.918 70.0228 172.92 69.2372 172.818C67.6665 172.615 65.6398 172.002 63.7782 170.368L62.7884 171.495ZM85.1324 173.859C85.4639 173.939 85.7287 174.09 85.8775 174.267C85.9988 174.411 86.0898 174.622 85.9968 174.999L87.4532 175.358C87.6554 174.538 87.47 173.83 87.0255 173.301C86.6084 172.806 86.0179 172.53 85.4868 172.401L85.1324 173.859Z" fill="#669DF6"/><path d="M52.842 181.523C57.4695 185.49 66.9251 188.806 72.1971 189.227C75.652 189.452 82.8096 191.853 85.3965 189.227" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M90.6782 183.637C90.8801 183.678 91.0633 183.762 91.2104 183.881C91.3575 184 91.4635 184.151 91.5183 184.319C91.5731 184.486 91.5749 184.664 91.5233 184.837C91.4718 185.01 91.3688 185.171 91.2241 185.305C90.7582 185.741 90.1498 186.052 89.4823 186.196C84.8375 186.914 80.5305 186.164 75.9728 184.737" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M75.0059 187.265C77.2669 187.851 80.9814 188.815 82.9333 188.863C84.8852 188.911 86.8955 188.822 88.6462 187.994C89.0851 187.746 89.4407 187.405 89.6746 187.009L89.7559 186.481" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M103.988 161.281L97.9816 173.548C104.503 174.852 105.834 175.139 112.836 176.868C119.735 180.509 123.825 180.301 122.567 177.432C121.309 174.562 117.785 174.393 119.661 173.548H131.119C131.694 173.356 131.407 172.704 131.119 171.842C130.832 170.979 126.9 171.765 126.134 170.615C125.367 169.465 131.338 170.379 132.097 168.801C132.856 167.223 129.797 167.458 129.797 166.295C129.797 165.203 134.199 165.141 133.259 162.984C132.319 160.828 133.633 160.752 133.508 160.137C133.428 159.742 133.109 159.58 132.097 159.28C127.482 158.533 120.653 160.994 117.647 161.739C112.45 162.608 111.175 162.335 103.988 161.281Z" fill="#8AB4F8" fill-opacity="0.4"/><path d="M48.8842 184.414L48.4123 184.997C48.7034 185.233 49.1238 185.217 49.3971 184.961L48.8842 184.414ZM46.2231 140.062L45.7575 139.474L46.2231 140.062ZM83.9544 138.146L84.3832 137.53L84.3832 137.53L83.9544 138.146ZM96.9112 159.704L96.3023 160.142C96.4185 160.303 96.594 160.412 96.7904 160.444L96.9112 159.704ZM103.787 160.826L104.472 161.13C104.566 160.918 104.557 160.674 104.446 160.469C104.336 160.265 104.137 160.123 103.908 160.086L103.787 160.826ZM91.266 149.113L90.5798 149.416L91.266 149.113ZM97.0455 174.17C96.8775 174.549 97.0483 174.992 97.4269 175.16C97.8055 175.328 98.2486 175.157 98.4166 174.779L97.0455 174.17ZM64.6943 170.622C64.9965 170.338 65.0119 169.864 64.7286 169.561C64.4453 169.259 63.9707 169.244 63.6685 169.527L64.6943 170.622ZM63.2022 135.102C63.6148 135.066 63.9196 134.702 63.883 134.289C63.8465 133.876 63.4824 133.572 63.0698 133.608L63.2022 135.102ZM70.7246 133.532C70.3114 133.503 69.9528 133.814 69.9236 134.228C69.8944 134.641 70.2056 134.999 70.6188 135.029L70.7246 133.532ZM48.8842 184.414C49.3561 183.831 49.3562 183.831 49.3563 183.831C49.3563 183.831 49.3564 183.831 49.3564 183.831C49.3564 183.831 49.3563 183.831 49.356 183.831C49.3555 183.831 49.3546 183.83 49.3531 183.829C49.3502 183.826 49.3455 183.822 49.3389 183.817C49.3256 183.806 49.3051 183.789 49.2777 183.766C49.2228 183.72 49.1403 183.649 49.0337 183.555C48.8204 183.367 48.5109 183.085 48.1325 182.717C47.3753 181.979 46.345 180.894 45.2602 179.515C43.0854 176.75 40.7214 172.838 39.8643 168.185L38.3891 168.456C39.306 173.434 41.8208 177.569 44.0812 180.443C45.2141 181.883 46.2905 183.016 47.0856 183.791C47.4834 184.179 47.8114 184.477 48.0417 184.68C48.1568 184.782 48.2476 184.859 48.3105 184.912C48.342 184.939 48.3665 184.959 48.3836 184.974C48.3921 184.981 48.3988 184.986 48.4036 184.99C48.406 184.992 48.408 184.994 48.4094 184.995C48.4101 184.995 48.4107 184.996 48.4112 184.996C48.4115 184.996 48.4117 184.997 48.4118 184.997C48.4121 184.997 48.4123 184.997 48.8842 184.414ZM39.8643 168.185C38.0947 158.578 37.927 147.586 46.6886 140.65L45.7575 139.474C36.2714 146.984 36.6107 158.802 38.3891 168.456L39.8643 168.185ZM96.7904 160.444L103.666 161.566L103.908 160.086L97.032 158.963L96.7904 160.444ZM83.5255 138.761C86.6444 140.935 88.6405 145.02 90.5798 149.416L91.9522 148.81C90.0453 144.488 87.9041 139.984 84.3832 137.53L83.5255 138.761ZM90.5798 149.416C92.1555 152.987 93.5793 155.659 94.6127 157.443C95.1293 158.335 95.5484 159.005 95.8399 159.454C95.9857 159.679 96.0996 159.848 96.1779 159.963C96.2171 160.02 96.2473 160.064 96.2682 160.093C96.2786 160.108 96.2867 160.12 96.2925 160.128C96.2953 160.132 96.2976 160.135 96.2992 160.137C96.3 160.138 96.3007 160.139 96.3012 160.14C96.3015 160.14 96.3017 160.141 96.3019 160.141C96.302 160.141 96.3021 160.141 96.3021 160.141C96.3022 160.141 96.3023 160.142 96.9112 159.704C97.5201 159.266 97.5202 159.266 97.5202 159.266C97.5203 159.266 97.5203 159.266 97.5203 159.266C97.5203 159.266 97.5203 159.266 97.5203 159.266C97.5202 159.266 97.5199 159.266 97.5195 159.265C97.5187 159.264 97.5173 159.262 97.5153 159.259C97.5113 159.253 97.5049 159.244 97.4962 159.232C97.4786 159.207 97.4518 159.168 97.416 159.116C97.3444 159.011 97.2372 158.852 97.0982 158.638C96.82 158.209 96.4143 157.561 95.9106 156.691C94.9034 154.952 93.5046 152.329 91.9522 148.81L90.5798 149.416ZM103.101 160.522L97.0455 174.17L98.4166 174.779L104.472 161.13L103.101 160.522ZM49.3971 184.961L64.6943 170.622L63.6685 169.527L48.3713 183.867L49.3971 184.961ZM46.6886 140.65C50.6201 137.538 56.7844 135.671 63.2022 135.102L63.0698 133.608C56.5053 134.19 50.0107 136.107 45.7575 139.474L46.6886 140.65ZM70.6188 135.029C75.8493 135.398 80.5324 136.675 83.5255 138.761L84.3832 137.53C81.0741 135.224 76.0819 133.911 70.7246 133.532L70.6188 135.029Z" fill="#669DF6"/><path fill-rule="evenodd" clip-rule="evenodd" d="M63.8565 132.693L70.0623 132.693L71.2515 136.904C70.8277 137.602 70.2179 138.17 69.4902 138.542C68.7626 138.914 67.9458 139.077 67.1311 139.012C65.1188 139.012 63.3939 138.053 62.9148 136.808L63.8565 132.693Z" fill="#8AB4F8" fill-opacity="0.4"/><path d="M63.8565 132.053L62.9148 136.508C62.9148 136.508 63.5918 138.652 66.7511 138.99C69.9104 139.329 71.3019 137.147 71.3019 137.147L69.9118 131.79" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M70.5807 122.147C71.4808 122.906 72.135 123.915 72.4605 125.046C72.7859 126.178 72.7678 127.381 72.4085 128.502C72.0492 129.623 71.3648 130.612 70.4424 131.344C69.5199 132.075 68.4008 132.516 67.2273 132.611C66.0537 132.705 64.8786 132.449 63.851 131.874C62.8234 131.299 61.9898 130.432 61.4558 129.383C60.9219 128.334 60.7117 127.149 60.8521 125.98C60.9924 124.811 61.4769 123.711 62.244 122.817C63.2646 121.629 64.7131 120.892 66.2743 120.767C67.8356 120.641 69.3833 121.137 70.5807 122.147V122.147Z" fill="#8AB4F8" fill-opacity="0.4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M60.8066 124.063H71.4432C71.4432 124.063 70.6457 121.153 66.5581 120.906C62.4704 120.659 60.8066 124.063 60.8066 124.063Z" fill="#669DF6"/><path fill-rule="evenodd" clip-rule="evenodd" d="M79.6146 177.963L81.9773 168.075C82.1429 167.305 82.8524 166.744 83.6399 166.762H94.0532C95.2146 166.762 96.001 167.863 95.7158 168.95L92.3031 181.201L79.6146 177.963Z" fill="#669DF6"/><path d="M84.9736 171.46C85.5028 171.46 85.9319 171.031 85.9319 170.502C85.9319 169.972 85.5028 169.543 84.9736 169.543C84.4444 169.543 84.0154 169.972 84.0154 170.502C84.0154 171.031 84.4444 171.46 84.9736 171.46Z" fill="#323336"/><circle cx="66.4893" cy="126.603" r="6.02686" stroke="#669DF6" stroke-width="1.5"/><path fill-rule="evenodd" clip-rule="evenodd" d="M72.742 124.063H65.8644C67.7963 122.13 69.266 119.874 71.6295 118.399C73.1466 117.489 75.0683 117.286 75.8775 118.399C76.0429 118.755 76.1114 119.148 76.0759 119.539C75.9151 121.307 73.7529 122.725 72.742 124.063Z" fill="#8AB4F8"/><path d="M150.594 38.5876H145.324C145.178 38.5953 145.037 38.6445 144.918 38.7294C144.8 38.8142 144.707 38.9313 144.653 39.0668L142.928 42.7081C142.883 42.8345 142.868 42.9697 142.885 43.1029C142.901 43.236 142.949 43.3635 143.023 43.4752C143.098 43.5868 143.197 43.6796 143.314 43.746C143.43 43.8125 143.561 43.8508 143.695 43.858H152.319C152.451 43.884 152.588 43.8695 152.712 43.8163C152.836 43.7631 152.942 43.6737 153.014 43.5599C153.086 43.446 153.123 43.313 153.119 43.1781C153.114 43.0433 153.069 42.9128 152.99 42.8039L151.361 39.0668C151.29 38.9238 151.18 38.8033 151.045 38.7187C150.91 38.6341 150.754 38.5888 150.594 38.5876V38.5876ZM150.115 40.1208L151.169 42.3248H144.845L145.803 40.1208H150.115Z" fill="#669DF6"/><path d="M130.743 77.9838C136.194 76.8486 139.523 77.5436 139.523 77.5436L143.151 91.8978C143.151 91.8978 132.39 96.6737 129.591 96.8608C126.793 97.048 127.11 95.4428 127.11 95.4428C127.11 95.4428 124.002 96.0805 123.476 94.7338C123.249 94.1536 123.476 93.1386 123.476 93.1386C123.476 93.1386 121.792 92.577 121.792 91.3333C121.792 90.0897 122.734 88.5534 122.734 88.5534C122.734 88.5534 121.417 88.0414 120.906 86.7576C120.395 85.4739 121.792 84.6306 121.792 84.6306L131.807 82.3264H125.051C124.526 82.3264 124.053 82.0121 123.849 81.5288C123.628 81.0019 123.785 80.4035 124.286 80.129C125.28 79.5847 127.277 78.7057 130.743 77.9838Z" fill="#323336"/><path d="M152.511 43.858H143.599C131.238 43.2831 124.338 49.0325 115.714 65.0352C115.637 65.2054 115.501 65.3417 115.331 65.4185H115.235L96.4533 70.4014L102.107 82.9544H102.203C109.178 83.6765 116.182 81.8746 121.943 77.8757L122.326 77.5882C128.329 73.4351 132.486 67.1139 133.921 59.9565C133.959 59.7532 134.076 59.5734 134.247 59.4566C134.418 59.3397 134.628 59.2955 134.831 59.3336C135.034 59.3717 135.214 59.4891 135.331 59.6598C135.448 59.8305 135.492 60.0406 135.454 60.244C133.955 67.7815 129.593 74.4448 123.284 78.8339C117.002 83.386 109.236 85.4046 101.532 84.4875C101.415 84.4667 101.303 84.4219 101.204 84.356C101.106 84.29 101.021 84.2043 100.957 84.1043H100.861L94.6326 70.2097C94.5856 70.1231 94.5583 70.0272 94.5525 69.9289C94.5468 69.8305 94.5628 69.7321 94.5994 69.6406C94.636 69.5492 94.6923 69.4668 94.7643 69.3996C94.8362 69.3323 94.9222 69.2818 95.0159 69.2515H95.1118L114.468 64.1728L114.66 63.8853C123.188 48.0743 130.471 42.1331 142.928 42.3248H153.469L156.248 43.0914C159.185 43.9922 161.989 45.2812 164.584 46.9244C172.059 51.7156 176.083 58.9024 174.933 68.6765C173.784 78.4506 167.651 85.0625 158.26 88.8955C155.004 90.2436 151.591 91.1772 148.103 91.6744L144.845 92.1535H143.599C143.442 92.1429 143.289 92.0936 143.156 92.01C143.022 91.9264 142.911 91.8111 142.832 91.6744L137.466 72.8928C137.438 72.7921 137.43 72.6866 137.444 72.5828C137.458 72.479 137.492 72.3791 137.546 72.2893C137.6 72.1995 137.672 72.1217 137.757 72.0607C137.842 71.9997 137.939 71.9568 138.041 71.9346C138.207 71.8931 138.382 71.9083 138.538 71.9778C138.695 72.0472 138.823 72.1669 138.904 72.3179L144.174 90.5245H144.749L147.911 90.0454C151.269 89.5675 154.553 88.6659 157.685 87.3623C166.597 83.7209 172.346 77.684 173.4 68.389C174.454 59.0941 170.813 52.578 163.722 48.1701C161.257 46.5614 158.58 45.3036 155.769 44.4329C155.014 44.1963 154.246 44.0043 153.469 43.858H153.086H152.511Z" fill="#669DF6"/><path fill-rule="evenodd" clip-rule="evenodd" d="M152.521 25.764C153.336 23.6818 156.68 22.7042 158.84 23.975C159.4 24.3045 159.888 24.7444 160.272 25.2681C159.645 23.0754 161.411 21.0145 163.433 20.43C163.993 20.268 164.58 20.2188 165.159 20.2852C165.602 20.3125 166.037 20.1685 166.376 19.883C166.715 19.5975 166.932 19.1926 166.98 18.752V18.3687C167.133 17.3417 167.637 16.3992 168.405 15.7007C169.173 15.0022 170.159 14.5907 171.196 14.5357C172.403 14.5357 174.4 14.8661 174.454 13.0984L174.742 9.84039C174.775 9.26346 174.957 8.70491 175.27 8.21894C175.582 7.73296 176.015 7.33603 176.527 7.06663C177.038 6.79724 177.61 6.66453 178.188 6.68135C178.765 6.69818 179.329 6.86397 179.824 7.16267C180.318 7.46136 180.727 7.88283 181.011 8.38618C181.295 8.88953 181.444 9.4577 181.444 10.0356C181.444 10.6135 181.294 11.1815 181.01 11.6845C180.725 12.1876 180.315 12.6086 179.82 12.9068L176.179 15.1107C175.513 15.4839 175.22 16.3198 175.508 17.0272C175.866 17.7374 176 18.5392 175.892 19.327C175.844 19.9156 175.679 20.4886 175.405 21.012C175.132 21.5355 174.756 21.9986 174.3 22.374C173.844 22.7494 173.318 23.0294 172.752 23.1973C172.186 23.3653 171.591 23.4177 171.005 23.3516C169.948 23.2199 169.184 24.0776 169.184 25.0764C169.04 26.2454 168.452 27.3145 167.543 28.0633C166.634 28.8121 165.472 29.1836 164.297 29.1011C163.639 29.0257 163.006 28.8062 162.443 28.4584C161.88 28.1106 161.401 27.643 161.039 27.0888C161.039 28.0648 160.998 28.9487 160.519 29.8345C160.236 30.3585 159.851 30.8211 159.388 31.1954C158.924 31.5697 158.391 31.8484 157.819 32.0152C157.247 32.1821 156.648 32.2338 156.056 32.1675C154.887 32.0231 153.818 31.4358 153.069 30.5266C152.32 29.6173 151.705 27.8462 152.521 25.764Z" fill="#669DF6"/><path fill-rule="evenodd" clip-rule="evenodd" d="M152.031 30.1552C152.664 30.6815 153.186 31.3279 153.567 32.057C153.948 32.7862 154.181 33.5837 154.253 34.4033C154.324 35.223 154.232 36.0487 153.982 36.8327C153.733 37.6167 153.33 38.3435 152.798 38.971C151.705 40.2405 150.152 41.0242 148.481 41.15C146.81 41.2758 145.158 40.7333 143.886 39.6418C142.628 38.5617 141.851 37.0261 141.725 35.3728C141.599 33.7195 142.136 32.084 143.216 30.826C144.296 29.568 145.831 28.7906 147.485 28.6648C149.138 28.539 150.773 29.0751 152.031 30.1552" fill="#323336"/><path fill-rule="evenodd" clip-rule="evenodd" d="M154.427 35.6172C155.194 34.084 153.341 30.4524 150.498 29.2928C148.582 28.3345 144.174 29.1969 143.311 30.8259C145.773 33.4328 150.889 35.2242 154.427 35.6172Z" fill="#669DF6"/><path fill-rule="evenodd" clip-rule="evenodd" d="M67.9934 31.0178C67.4398 31.0317 67.0078 30.5037 67.131 29.9637C67.4382 27.7972 68.5403 25.8223 70.2228 24.4231C71.9053 23.024 74.048 22.3006 76.2343 22.3936C78.4634 22.5023 80.5769 23.4176 82.1812 24.969C83.7854 26.5204 84.771 28.602 84.9543 30.8261C85.0109 31.3318 84.6007 31.7875 84.0919 31.7844L67.9934 31.0178Z" fill="#F882FE"/><path fill-rule="evenodd" clip-rule="evenodd" d="M42.0147 46.3824L34.5404 49.7363C33.5342 50.2175 33.3769 51.6331 34.2529 52.3235L40.9606 56.9231C41.8853 57.5669 43.2062 56.9856 43.3562 55.869L44.1228 47.8198C44.2592 46.6857 43.0206 45.8412 42.0147 46.3824Z" fill="#8AB4F8" fill-opacity="0.4"/><path fill-rule="evenodd" clip-rule="evenodd" d="M40.7793 49.1284C40.301 48.5551 39.943 47.8913 39.7268 47.1766C39.5107 46.4619 39.4408 45.7109 39.5213 44.9685C39.6018 44.2262 39.831 43.5077 40.1954 42.8559C40.5597 42.2042 41.0516 41.6325 41.6418 41.175L52.2783 32.7424C53.47 31.7621 54.9965 31.2839 56.5345 31.4091C58.0726 31.5343 59.5016 32.2531 60.5192 33.4132C61.0055 33.9868 61.3682 34.6547 61.5845 35.375C61.8008 36.0953 61.866 36.8525 61.776 37.5991C61.6861 38.3458 61.4429 39.0658 61.0617 39.7141C60.6806 40.3624 60.1696 40.925 59.5609 41.3666L48.9244 49.7992C47.7483 50.7738 46.2374 51.2492 44.7152 51.1238C43.1929 50.9985 41.7802 50.2823 40.7793 49.1284" fill="#FCC934"/><path d="M40.5727 48.8649L42.4084 48.0741L42.155 50.2907C42.6565 50.5961 43.2027 50.825 43.7753 50.9684L44.1332 47.7867V47.3076C44.0827 47.1002 43.9866 46.9067 43.8519 46.7412C43.7173 46.5756 43.5474 46.4421 43.3547 46.3503C43.162 46.2585 42.9513 46.2109 42.7379 46.2107C42.5245 46.2105 42.3137 46.2579 42.1209 46.3493L39.7856 47.3591C39.9694 47.8987 40.2349 48.4065 40.5727 48.8649Z" fill="#323336"/><path fill-rule="evenodd" clip-rule="evenodd" d="M38.7671 68.2933L35.1257 61.8731C34.9032 61.4875 34.5814 61.1685 34.1938 60.9494C33.8062 60.7303 33.3669 60.6191 32.9218 60.6274H25.4475C25.0146 60.627 24.5881 60.7315 24.2043 60.9317C23.8205 61.1319 23.4909 61.422 23.2435 61.7773L19.4105 68.1975C19.1712 68.5689 19.0439 69.0014 19.0439 69.4432C19.0439 69.8851 19.1712 70.3175 19.4105 70.6889L23.0519 77.1092C23.2842 77.457 23.5973 77.7432 23.9644 77.9435C24.3316 78.1438 24.7418 78.252 25.16 78.259H32.7301C33.1716 78.2488 33.6038 78.1298 33.9883 77.9125C34.3727 77.6952 34.6976 77.3863 34.9341 77.0133L38.7671 70.5931C38.9981 70.2363 39.121 69.8203 39.121 69.3953C39.121 68.9702 38.9981 68.5543 38.7671 68.1975" fill="#5BB974"/><path d="M37.8577 103.228C37.4965 102.677 37.08 102.164 36.6145 101.698L35.3713 100.168C34.8018 99.4799 34.3736 98.6868 34.111 97.8335C33.8485 96.9802 33.7568 96.0835 33.8412 95.1947L34.1281 92.8996V91.9432C34.1436 91.6845 34.1112 91.4252 34.0324 91.1782C33.9162 90.4296 33.6528 89.7114 33.2575 89.0651C32.8622 88.4188 32.3429 87.8572 31.7294 87.4126C31.1159 86.9681 30.4205 86.6495 29.6833 86.4751C28.946 86.3008 28.1815 86.2741 27.4339 86.3967C25.9159 86.6327 24.5523 87.4581 23.6391 88.6935C22.726 89.929 22.337 91.4747 22.5568 92.9952C22.5568 93.1865 22.6524 93.4734 22.6524 93.6646L23.0349 94.621L23.9912 96.7248C24.359 97.5334 24.5573 98.4088 24.5737 99.297C24.5902 100.185 24.4245 101.067 24.0868 101.889L23.3218 103.801C23.0272 104.357 22.7716 104.932 22.5568 105.523C22.2207 106.873 22.2207 108.285 22.5568 109.635C23.0686 111.521 24.235 113.162 25.8471 114.266C27.4592 115.37 29.4117 115.864 31.3548 115.66C32.4761 115.566 33.5668 115.245 34.5608 114.718C35.5547 114.19 36.4314 113.466 37.1376 112.59C37.8438 111.714 38.365 110.704 38.6696 109.621C38.9741 108.537 39.0558 107.404 38.9096 106.288C38.7755 105.206 38.4173 104.164 37.8577 103.228V103.228Z" stroke="#8AB4F8" stroke-opacity="0.4" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/><path fill-rule="evenodd" clip-rule="evenodd" d="M36.1798 134.124C34.5432 134.064 32.9353 133.676 31.451 132.984C29.9667 132.292 28.6361 131.309 27.5375 130.095C26.439 128.88 25.5948 127.458 25.0548 125.912C24.5148 124.365 24.2899 122.727 24.3934 121.092V120.901C24.6393 117.596 26.1726 114.519 28.6635 112.333C31.1544 110.146 34.4039 109.025 37.713 109.21C39.3496 109.271 40.9575 109.659 42.4418 110.351C43.9261 111.043 45.2568 112.025 46.3553 113.24C47.4538 114.455 48.298 115.877 48.838 117.423C49.378 118.969 49.6029 120.608 49.4994 122.242V122.434C49.2535 125.739 47.7202 128.816 45.2293 131.002C42.7384 133.188 39.4889 134.309 36.1798 134.124Z" fill="#EA4335"/><path d="M39.5864 109.425C39.0455 109.32 38.4971 109.252 37.9449 109.221C37.0718 111.997 34.4594 114.219 31.101 114.577C29.5176 114.745 28.1475 114.558 27.003 114.099C26.7061 114.483 26.4321 114.883 26.1821 115.297C27.7209 116.018 29.4845 116.356 31.2926 116.206C34.7869 115.914 38.3917 113.024 39.5864 109.425Z" fill="#323336"/><path fill-rule="evenodd" clip-rule="evenodd" d="M122.422 36.6714L97.6032 41.75C97.2862 41.8071 96.9594 41.7392 96.6914 41.5605C96.4234 41.3819 96.235 41.1064 96.1658 40.7918L91.1829 15.7816C91.1259 15.4647 91.1938 15.1378 91.3724 14.8698C91.5511 14.6018 91.8266 14.4135 92.1412 14.3443L116.96 9.26557C117.277 9.20849 117.603 9.27641 117.871 9.45507C118.139 9.63373 118.328 9.90923 118.397 10.2238L123.38 35.234C123.437 35.551 123.369 35.8777 123.19 36.1457C123.012 36.4137 122.736 36.6021 122.422 36.6714" fill="#669DF6"/><path d="M79.977 77.4614C82.9353 74.1333 95.582 71.6928 95.582 71.6928L98.6882 79.1624C98.6882 79.1624 96.8392 81.9728 94.7684 83.304C93.1094 84.3705 88.0328 85.8167 86.0793 86.3498C85.6019 86.48 85.0971 86.321 84.7736 85.9464C84.2939 85.391 84.372 84.5526 84.9759 84.1355C85.5777 83.7198 86.3759 83.2108 87.2248 82.7863C88.9998 81.8989 89.6654 79.1624 89.6654 79.1624C89.6654 79.1624 83.8967 79.6802 82.9353 80.4936C81.9739 81.3071 82.9353 85.4488 82.9353 85.4488L81.7314 89.6307C81.6122 90.0448 81.2334 90.3299 80.8025 90.3299C80.3271 90.3299 79.9222 89.9842 79.8478 89.5147L79.0156 84.2655L75.186 87.831C74.9164 88.0819 74.5097 88.1149 74.2032 87.9106C73.8685 87.6874 73.7533 87.251 73.9405 86.8949C74.858 85.1501 77.565 80.1749 79.977 77.4614Z" fill="#323336"/><path d="M97.1412 35.2791C96.9545 35.6489 97.1028 36.1 97.4726 36.2867C97.8423 36.4735 98.2934 36.3251 98.4801 35.9554L97.1412 35.2791ZM102.224 26.8788L102.499 26.1809C102.138 26.0391 101.729 26.195 101.555 26.5407L102.224 26.8788ZM121.015 35.0794C121.401 35.2311 121.836 35.0416 121.988 34.6562C122.139 34.2707 121.95 33.8353 121.564 33.6836L121.015 35.0794ZM98.4801 35.9554L102.894 27.2169L101.555 26.5407L97.1412 35.2791L98.4801 35.9554ZM101.949 27.5767L121.015 35.0794L121.564 33.6836L102.499 26.1809L101.949 27.5767Z" fill="#323336"/><path d="M111.751 14.6175C111.307 14.8909 110.952 15.3514 110.569 15.7053C110.036 16.1967 109.306 16.4574 108.583 16.4147C107.402 16.4147 106.244 16.2941 105.515 17.4307C105.182 17.9496 105.069 18.5793 105.201 19.1814C105.333 19.7835 105.698 20.3086 106.217 20.6412C107.031 21.1628 107.812 21.022 108.63 20.6712L109.481 20.2455C110.113 19.9035 110.879 19.8339 111.562 20.0564C112.637 20.3923 113.598 20.7514 114.731 20.4347C115.479 20.1788 116.114 19.6707 116.528 18.9977C117.45 17.4995 117.021 15.4954 115.58 14.5119C115.204 14.2553 114.779 14.0779 114.333 13.9903C113.414 13.8104 112.483 14.0311 111.751 14.6175Z" stroke="#323336" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><circle cx="97.8106" cy="20.0818" r="2.75357" stroke="#323336" stroke-width="1.5"/><path d="M143.039 36.1706C142.661 36.0006 142.217 36.1689 142.047 36.5466C141.877 36.9242 142.045 37.3683 142.423 37.5384L143.039 36.1706ZM144.568 37.3501L144.564 38.1001L144.568 37.3501ZM146.755 37.5392C147.133 37.3701 147.303 36.9265 147.134 36.5484C146.965 36.1702 146.521 36.0007 146.143 36.1698L146.755 37.5392ZM142.731 36.8545C142.423 37.5384 142.423 37.5384 142.423 37.5384C142.423 37.5385 142.423 37.5385 142.423 37.5385C142.423 37.5386 142.424 37.5387 142.424 37.5388C142.424 37.5389 142.425 37.5391 142.425 37.5393C142.426 37.5398 142.427 37.5403 142.429 37.541C142.432 37.5424 142.436 37.5442 142.441 37.5464C142.451 37.5509 142.465 37.5571 142.483 37.5647C142.519 37.58 142.569 37.6013 142.632 37.6265C142.756 37.6768 142.93 37.7439 143.13 37.8114C143.509 37.939 144.064 38.0972 144.564 38.1001L144.572 36.6001C144.326 36.5987 143.963 36.5091 143.609 36.39C143.443 36.3341 143.298 36.2781 143.194 36.2361C143.143 36.2152 143.102 36.1981 143.075 36.1865C143.062 36.1807 143.052 36.1763 143.046 36.1736C143.042 36.1723 143.04 36.1713 143.039 36.1708C143.039 36.1705 143.038 36.1704 143.038 36.1704C143.038 36.1704 143.038 36.1704 143.038 36.1704C143.038 36.1704 143.038 36.1705 143.038 36.1705C143.039 36.1705 143.039 36.1705 143.039 36.1706C143.039 36.1706 143.039 36.1706 142.731 36.8545ZM144.564 38.1001C145.075 38.1031 145.643 37.9445 146.031 37.8158C146.236 37.7477 146.414 37.6797 146.541 37.6287C146.605 37.6031 146.657 37.5815 146.693 37.5659C146.712 37.5582 146.726 37.5519 146.737 37.5473C146.742 37.5451 146.746 37.5432 146.749 37.5419C146.751 37.5412 146.752 37.5406 146.753 37.5401C146.753 37.5399 146.754 37.5397 146.754 37.5396C146.754 37.5395 146.755 37.5394 146.755 37.5393C146.755 37.5393 146.755 37.5393 146.755 37.5392C146.755 37.5392 146.755 37.5392 146.449 36.8545C146.143 36.1698 146.143 36.1698 146.143 36.1697C146.143 36.1697 146.143 36.1697 146.143 36.1697C146.143 36.1697 146.143 36.1696 146.143 36.1696C146.143 36.1696 146.143 36.1695 146.143 36.1696C146.143 36.1696 146.143 36.1697 146.142 36.17C146.141 36.1705 146.139 36.1715 146.136 36.1729C146.13 36.1757 146.119 36.1801 146.105 36.186C146.078 36.1978 146.036 36.2152 145.983 36.2364C145.877 36.279 145.728 36.3358 145.558 36.3922C145.196 36.5124 144.824 36.6016 144.572 36.6001L144.564 38.1001Z" fill="#669DF6"/><circle cx="148.148" cy="34.7742" r="6.12744" stroke="#669DF6" stroke-width="1.5"/><path d="M135.707 52.5352C135.776 52.1268 135.501 51.7395 135.093 51.67C134.685 51.6006 134.297 51.8753 134.228 52.2836L135.707 52.5352ZM136.684 65.5845L135.989 65.8661L136.684 65.5845ZM157.996 69.1232C158.41 69.1232 158.746 68.7875 158.746 68.3732C158.746 67.959 158.41 67.6232 157.996 67.6232V69.1232ZM136.819 67.1911L136.07 67.1448L136.819 67.1911ZM134.967 52.4094C134.228 52.2836 134.228 52.2839 134.228 52.2841C134.228 52.2842 134.228 52.2844 134.228 52.2846C134.228 52.285 134.228 52.2853 134.228 52.2857C134.227 52.2866 134.227 52.2875 134.227 52.2885C134.227 52.2905 134.226 52.2929 134.226 52.2958C134.225 52.3015 134.224 52.3088 134.222 52.3179C134.22 52.336 134.216 52.361 134.212 52.3931C134.203 52.4574 134.192 52.5502 134.18 52.6743C134.156 52.9222 134.128 53.2951 134.11 53.8129C134.073 54.8483 134.074 56.4656 134.219 58.8263L135.716 58.7343C135.573 56.4144 135.574 54.8462 135.609 53.8664C135.626 53.3765 135.652 53.0343 135.673 52.8191C135.684 52.7115 135.693 52.6357 135.699 52.5892C135.702 52.566 135.704 52.5501 135.706 52.5412C135.706 52.5367 135.707 52.534 135.707 52.533C135.707 52.5326 135.707 52.5325 135.707 52.5328C135.707 52.533 135.707 52.5333 135.707 52.5337C135.707 52.5339 135.707 52.5341 135.707 52.5344C135.707 52.5345 135.707 52.5347 135.707 52.5348C135.707 52.535 135.707 52.5352 134.967 52.4094ZM134.219 58.8263C134.366 61.2209 134.72 62.7806 135.097 63.8677C135.285 64.4113 135.476 64.8267 135.64 65.1574C135.818 65.5164 135.917 65.6898 135.989 65.8661L137.379 65.3029C137.28 65.0583 137.115 64.7559 136.984 64.4915C136.839 64.1988 136.676 63.8434 136.514 63.3762C136.19 62.4418 135.856 61.0203 135.716 58.7343L134.219 58.8263ZM135.989 65.8661C136.025 65.9549 136.06 66.1215 136.076 66.3715C136.091 66.6105 136.086 66.8793 136.07 67.1448L137.567 67.2374C137.586 66.9349 137.594 66.5987 137.573 66.2756C137.553 65.9634 137.504 65.6107 137.379 65.3029L135.989 65.8661ZM137.874 69.1232H157.996V67.6232H137.874V69.1232ZM136.07 67.1448C136.008 68.1446 136.77 69.1232 137.874 69.1232V67.6232C137.799 67.6232 137.725 67.5916 137.663 67.5205C137.598 67.4466 137.56 67.3439 137.567 67.2374L136.07 67.1448Z" fill="#669DF6"/><line x1="159.279" y1="59.7836" x2="158.201" y2="68.1958" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round"/><line x1="158.044" y1="68.5176" x2="138.272" y2="72.5247" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round"/><path d="M91.5513 91.133C92.3515 90.9186 92.8264 90.0961 92.612 89.2959C92.3976 88.4957 91.5751 88.0208 90.7749 88.2353L91.5513 91.133ZM68.6909 95.7056L67.5449 96.6733C67.9199 97.1174 68.5177 97.3049 69.0791 97.1544L68.6909 95.7056ZM53.269 75.1183C52.7345 74.4853 51.7881 74.4055 51.1551 74.94C50.5222 75.4745 50.4424 76.4209 50.9769 77.0538L53.269 75.1183ZM90.7749 88.2353L68.3027 94.2567L69.0791 97.1544L91.5513 91.133L90.7749 88.2353ZM69.8369 94.7378L53.269 75.1183L50.9769 77.0538L67.5449 96.6733L69.8369 94.7378Z" fill="#669DF6"/><path d="M143.952 91.243C138.581 93.6175 138.503 94.0422 132.287 96.0999C131.386 96.4621 130.422 96.6439 129.45 96.6347C128.479 96.5934 127.536 96.3901 127.129 95.5125" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M136.314 91.7659C132.591 93.4687 129.731 95.1205 126.066 95.5916C125.29 95.7435 124.486 95.6077 123.804 95.2099C123.105 94.7794 122.677 93.6533 123.38 92.9592" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M135.514 89.0319C134.165 89.6706 132.87 90.4166 131.468 90.948C129.758 91.6218 127.988 92.1365 126.183 92.4854C125.49 92.6252 124.787 92.7127 124.081 92.747C123.219 92.7444 122.25 92.5273 121.767 91.776C121.604 91.4701 121.537 91.1222 121.577 90.7781C121.616 90.4341 121.76 90.11 121.988 89.8485C123.177 88.5131 125.981 87.9859 128.567 87.8329" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M132.463 82.3815C130.739 82.3228 127.668 82.3672 125.89 82.3619C125.028 82.3594 124.058 82.1958 123.737 81.445C123.59 80.9898 123.696 80.4687 124.011 80.1069C124.348 79.7628 124.752 79.4906 125.198 79.307C129.554 77.7282 134.845 76.8769 139.429 77.2071" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M133.65 81.903C130.642 83.2383 127.4 83.9747 124.107 84.0705C123.291 84.0619 122.483 84.2237 121.735 84.5455C121.033 84.9183 120.438 85.7735 120.705 86.5241C120.78 86.7693 120.911 86.9939 121.088 87.1802C121.265 87.3666 121.483 87.5097 121.725 87.5983C122.196 87.7501 122.685 87.8416 123.179 87.8704C127.758 88.259 130.561 87.8924 134.715 85.9767" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M89.8263 78.4334C89.3595 80.0939 88.052 82.1194 86.2808 82.964C85.5757 83.3 84.8019 83.629 84.3385 84.253C84.1402 84.5054 84.0427 84.8247 84.0649 85.1489C84.1424 85.6135 84.6083 85.9567 85.0737 86.0581C85.551 86.1045 86.0313 86.0551 86.4868 85.9128C90.1256 84.9642 94.636 83.788 97.2845 80.8416C97.809 80.2507 98.3361 79.5043 98.5628 78.7217" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M89.4113 78.9874C87.4974 79.4466 84.2807 79.1331 83.2776 80.4002C83.2776 80.4002 82.4884 81.2218 82.6915 83.6439C82.7257 83.8676 82.743 84.1004 82.7604 84.3332C82.867 86.0148 83.0081 87.4797 82.4521 88.8141C82.1233 89.6076 81.4293 90.6861 80.5964 90.5847C79.7636 90.4832 79.6822 89.6906 79.6219 88.7765C79.5615 87.8624 78.9091 82.1604 78.6353 80.1285C78.5256 79.2658 78.7465 78.3984 79.2526 77.7046C80.8665 75.6459 83.5828 74.7102 85.9625 73.9119C89.0906 72.842 92.6931 71.7015 96.1046 71.4821" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M78.7295 78.7791C76.8672 81.4999 75.1281 84.0883 73.8012 86.2784C73.6009 86.6285 73.3762 87.0137 73.4596 87.4091C73.543 87.8044 73.9863 88.2259 74.3663 88.3293C74.7511 88.3969 75.1454 88.3455 75.4973 88.182C76.3305 87.843 76.963 87.1718 77.527 86.4936C78.1036 85.7769 78.6261 85.017 79.09 84.2203" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M64.647 128.045C64.5824 127.636 64.1983 127.356 63.7892 127.421C63.38 127.485 63.1007 127.869 63.1653 128.279L64.647 128.045ZM65.405 130.436C65.8192 130.436 66.155 130.1 66.155 129.686C66.155 129.271 65.8192 128.936 65.405 128.936V130.436ZM63.9061 128.162C63.1653 128.279 63.1654 128.279 63.1654 128.279C63.1654 128.279 63.1655 128.28 63.1655 128.28C63.1656 128.28 63.1657 128.281 63.1658 128.281C63.1659 128.282 63.1661 128.283 63.1663 128.285C63.1666 128.287 63.167 128.289 63.1674 128.291C63.1682 128.296 63.1691 128.301 63.1702 128.307C63.1724 128.318 63.1751 128.331 63.1784 128.346C63.1851 128.376 63.1944 128.414 63.2073 128.457C63.2331 128.544 63.2731 128.656 63.3347 128.786C63.4585 129.047 63.667 129.373 64.0128 129.703L65.0485 128.618C64.8448 128.424 64.7409 128.251 64.6899 128.143C64.664 128.089 64.651 128.049 64.6455 128.031C64.6428 128.022 64.642 128.018 64.6424 128.02C64.6427 128.021 64.6432 128.023 64.644 128.027C64.6444 128.029 64.6448 128.032 64.6453 128.035C64.6456 128.036 64.6458 128.038 64.6461 128.039C64.6462 128.04 64.6464 128.041 64.6465 128.042C64.6466 128.042 64.6467 128.043 64.6467 128.043C64.6468 128.044 64.6468 128.044 64.6468 128.044C64.6469 128.044 64.647 128.045 63.9061 128.162ZM64.0128 129.703C64.341 130.017 64.6313 130.201 64.8733 130.307C64.9941 130.36 65.1009 130.392 65.1915 130.411C65.2367 130.421 65.2773 130.427 65.3132 130.431C65.3311 130.432 65.3477 130.434 65.363 130.434C65.3707 130.435 65.378 130.435 65.385 130.435C65.3885 130.435 65.3919 130.435 65.3953 130.435C65.3969 130.435 65.3986 130.435 65.4002 130.436C65.401 130.436 65.4018 130.436 65.4026 130.436C65.403 130.436 65.4036 130.436 65.4038 130.436C65.4044 130.436 65.405 130.436 65.405 129.686C65.405 128.936 65.4056 128.936 65.4062 128.936C65.4064 128.936 65.4069 128.936 65.4073 128.936C65.4081 128.936 65.4089 128.936 65.4097 128.936C65.4112 128.936 65.4127 128.936 65.4142 128.936C65.4172 128.936 65.4202 128.936 65.423 128.936C65.4288 128.936 65.4342 128.936 65.4394 128.936C65.4497 128.937 65.4588 128.938 65.4668 128.938C65.4827 128.94 65.4937 128.942 65.4998 128.943C65.5123 128.946 65.5036 128.946 65.4745 128.933C65.4167 128.908 65.2699 128.83 65.0485 128.618L64.0128 129.703Z" fill="#669DF6"/><path d="M55.7594 150.922L57.3582 164.218L64.1745 170.024" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M58.5619 165.229H79.6146" stroke="#669DF6" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/><path d="M83.7423 155.641C83.9317 155.273 83.7866 154.82 83.4182 154.631C83.0498 154.442 82.5976 154.587 82.4083 154.955L83.7423 155.641ZM78.8648 165.214C78.8561 165.628 79.1848 165.971 79.5989 165.979C80.013 165.988 80.3558 165.659 80.3645 165.245L78.8648 165.214ZM83.0753 155.298C82.4083 154.955 82.4082 154.955 82.4082 154.955C82.4082 154.955 82.4082 154.955 82.4081 154.955C82.4081 154.956 82.408 154.956 82.4079 154.956C82.4077 154.956 82.4075 154.957 82.4072 154.957C82.4066 154.958 82.4058 154.96 82.4047 154.962C82.4026 154.966 82.3996 154.972 82.3956 154.98C82.3876 154.996 82.376 155.019 82.3608 155.049C82.3305 155.109 82.2863 155.197 82.2295 155.312C82.1161 155.542 81.9526 155.877 81.7512 156.305C81.3484 157.16 80.793 158.383 80.1809 159.858L81.5664 160.433C82.1681 158.983 82.7136 157.782 83.1081 156.944C83.3053 156.526 83.4647 156.198 83.5744 155.976C83.6293 155.865 83.6717 155.781 83.7001 155.724C83.7144 155.696 83.7251 155.675 83.7322 155.661C83.7358 155.654 83.7384 155.649 83.7401 155.645C83.7409 155.644 83.7416 155.643 83.7419 155.642C83.7421 155.641 83.7422 155.641 83.7423 155.641C83.7423 155.641 83.7424 155.641 83.7424 155.641C83.7424 155.641 83.7424 155.641 83.7424 155.641C83.7423 155.641 83.7423 155.641 83.0753 155.298ZM80.1809 159.858C79.5504 161.378 79.2219 162.702 79.0508 163.652C78.9652 164.127 78.9189 164.509 78.8939 164.777C78.8814 164.911 78.8742 165.016 78.8701 165.089C78.868 165.126 78.8668 165.155 78.866 165.176C78.8656 165.187 78.8653 165.195 78.8651 165.201C78.865 165.204 78.865 165.207 78.8649 165.209C78.8649 165.21 78.8648 165.211 78.8648 165.212C78.8648 165.212 78.8648 165.213 78.8648 165.213C78.8648 165.213 78.8648 165.213 78.8648 165.213C78.8648 165.214 78.8648 165.214 79.6146 165.23C80.3645 165.245 80.3645 165.245 80.3645 165.246C80.3645 165.246 80.3644 165.246 80.3644 165.246C80.3644 165.246 80.3644 165.246 80.3644 165.246C80.3644 165.247 80.3644 165.247 80.3644 165.247C80.3644 165.247 80.3644 165.246 80.3645 165.245C80.3645 165.243 80.3647 165.239 80.3649 165.233C80.3654 165.221 80.3662 165.201 80.3678 165.173C80.3709 165.117 80.3767 165.031 80.3874 164.916C80.4088 164.688 80.4496 164.348 80.5271 163.918C80.682 163.057 80.9831 161.839 81.5664 160.433L80.1809 159.858Z" fill="#669DF6"/><path d="M83.0443 157.562C83.1079 157.153 82.8276 156.77 82.4183 156.706C82.009 156.642 81.6256 156.923 81.5621 157.332L83.0443 157.562ZM97.4442 175.107C97.8552 175.159 98.2303 174.868 98.2822 174.457C98.334 174.046 98.0429 173.671 97.632 173.619L97.4442 175.107ZM82.3032 157.447C81.5621 157.332 81.562 157.332 81.562 157.333C81.562 157.333 81.5619 157.333 81.5619 157.334C81.5618 157.334 81.5617 157.335 81.5616 157.336C81.5613 157.337 81.561 157.339 81.5607 157.341C81.5601 157.346 81.5592 157.351 81.5582 157.359C81.5562 157.373 81.5535 157.393 81.5503 157.418C81.544 157.467 81.5358 157.538 81.5271 157.628C81.5097 157.809 81.4906 158.067 81.4815 158.391C81.4634 159.037 81.4854 159.949 81.6439 161.028C81.9609 163.184 82.8262 166.019 85.0183 168.717L86.1825 167.771C84.199 165.33 83.4157 162.767 83.128 160.81C82.9841 159.831 82.9648 159.007 82.9809 158.433C82.989 158.145 83.0058 157.921 83.0202 157.772C83.0274 157.698 83.0339 157.642 83.0384 157.606C83.0407 157.589 83.0424 157.576 83.0435 157.568C83.044 157.565 83.0443 157.562 83.0445 157.561C83.0446 157.561 83.0446 157.561 83.0446 157.561C83.0446 157.561 83.0445 157.561 83.0445 157.561C83.0445 157.561 83.0444 157.562 83.0444 157.562C83.0444 157.562 83.0443 157.562 82.3032 157.447ZM85.0183 168.717C87.2285 171.438 90.3579 173.027 92.8809 173.936C94.1495 174.393 95.283 174.685 96.1009 174.862C96.5103 174.951 96.8417 175.012 97.0728 175.05C97.1884 175.07 97.279 175.084 97.3418 175.093C97.3732 175.097 97.3977 175.101 97.4149 175.103C97.4235 175.104 97.4302 175.105 97.4351 175.106C97.4376 175.106 97.4396 175.106 97.4411 175.107C97.4418 175.107 97.4425 175.107 97.443 175.107C97.4433 175.107 97.4436 175.107 97.4437 175.107C97.444 175.107 97.4442 175.107 97.5381 174.363C97.632 173.619 97.6322 173.619 97.6323 173.619C97.6323 173.619 97.6324 173.619 97.6325 173.619C97.6325 173.619 97.6324 173.619 97.6323 173.619C97.6319 173.619 97.6311 173.619 97.6298 173.618C97.6272 173.618 97.6227 173.617 97.6165 173.617C97.6041 173.615 97.5844 173.612 97.558 173.608C97.505 173.601 97.4248 173.588 97.32 173.571C97.1103 173.536 96.8027 173.48 96.4191 173.397C95.6511 173.23 94.5832 172.955 93.3893 172.525C90.9874 171.66 88.1479 170.19 86.1825 167.771L85.0183 168.717Z" fill="#669DF6"/><path d="M98.7305 172.836C98.3267 172.744 97.9247 172.997 97.8326 173.401C97.7405 173.805 97.9932 174.207 98.3971 174.299L98.7305 172.836ZM103.9 161.085C103.492 161.013 103.103 161.286 103.032 161.694C102.961 162.102 103.234 162.491 103.642 162.562L103.9 161.085ZM98.5638 173.567C98.3971 174.299 98.3971 174.299 98.3971 174.299C98.3972 174.299 98.3972 174.299 98.3973 174.299C98.3976 174.299 98.3979 174.299 98.3984 174.299C98.3993 174.299 98.4007 174.3 98.4026 174.3C98.4064 174.301 98.4121 174.302 98.4196 174.304C98.4348 174.307 98.4574 174.313 98.4871 174.319C98.5465 174.333 98.6344 174.353 98.7477 174.38C98.9744 174.432 99.3032 174.509 99.7104 174.605C100.525 174.797 101.653 175.068 102.908 175.381C105.425 176.008 108.424 176.798 110.424 177.465L110.898 176.042C108.837 175.355 105.787 174.552 103.271 173.925C102.009 173.611 100.874 173.338 100.055 173.145C99.6457 173.048 99.3149 172.971 99.0863 172.918C98.972 172.892 98.8832 172.871 98.823 172.857C98.7928 172.851 98.7698 172.845 98.7543 172.842C98.7465 172.84 98.7406 172.839 98.7367 172.838C98.7347 172.837 98.7332 172.837 98.7321 172.837C98.7316 172.837 98.7312 172.836 98.731 172.836C98.7308 172.836 98.7307 172.836 98.7307 172.836C98.7306 172.836 98.7305 172.836 98.5638 173.567ZM110.424 177.465C114.515 178.828 119.053 179.841 119.92 179.968L120.137 178.484C119.38 178.373 114.93 177.385 110.898 176.042L110.424 177.465ZM119.92 179.968C120.363 180.033 121.323 180.098 122.111 179.764C122.53 179.587 122.96 179.271 123.183 178.732C123.403 178.201 123.367 177.589 123.142 176.933L121.723 177.42C121.877 177.868 121.83 178.078 121.798 178.157C121.768 178.228 121.702 178.309 121.527 178.383C121.127 178.552 120.506 178.538 120.137 178.484L119.92 179.968ZM123.142 176.933C122.861 176.113 122.16 175.582 121.498 175.192C120.852 174.812 119.981 174.429 119.319 174.087C118.597 173.713 117.989 173.328 117.569 172.851C117.172 172.401 116.929 171.853 116.963 171.081L115.464 171.015C115.412 172.201 115.808 173.122 116.443 173.843C117.055 174.537 117.87 175.026 118.63 175.419C119.45 175.844 120.118 176.121 120.737 176.485C121.339 176.839 121.626 177.137 121.723 177.42L123.142 176.933ZM132.722 162.267C133.109 162.074 133.466 161.808 133.749 161.501C134.025 161.201 134.269 160.82 134.356 160.388C134.449 159.925 134.352 159.424 133.973 159.022C133.624 158.652 133.11 158.443 132.516 158.339L132.257 159.817C132.691 159.893 132.844 160.011 132.881 160.051C132.888 160.058 132.894 160.048 132.886 160.092C132.87 160.169 132.806 160.311 132.646 160.485C132.492 160.652 132.283 160.81 132.051 160.926L132.722 162.267ZM111.8 161.536C109.79 161.647 107.813 161.535 106.332 161.393C105.594 161.322 104.982 161.245 104.557 161.185C104.344 161.155 104.178 161.13 104.066 161.112C104.01 161.103 103.968 161.096 103.94 161.091C103.926 161.089 103.915 161.087 103.909 161.086C103.905 161.085 103.903 161.085 103.902 161.085C103.901 161.085 103.9 161.085 103.9 161.085C103.9 161.084 103.9 161.084 103.9 161.084C103.9 161.084 103.9 161.084 103.9 161.084C103.9 161.085 103.9 161.085 103.771 161.823C103.642 162.562 103.642 162.562 103.642 162.562C103.642 162.562 103.643 162.562 103.643 162.562C103.643 162.562 103.643 162.562 103.644 162.562C103.644 162.563 103.645 162.563 103.646 162.563C103.649 162.563 103.652 162.564 103.656 162.565C103.665 162.566 103.677 162.568 103.693 162.571C103.725 162.576 103.771 162.584 103.831 162.593C103.951 162.612 104.126 162.639 104.348 162.67C104.792 162.733 105.426 162.813 106.189 162.886C107.714 163.032 109.772 163.15 111.883 163.034L111.8 161.536ZM116.963 171.081C117.033 169.495 118.143 168.227 119.816 167.142C121.482 166.062 123.502 165.294 125.092 164.625L124.511 163.243C122.997 163.879 120.809 164.711 119 165.883C117.199 167.051 115.567 168.687 115.464 171.015L116.963 171.081ZM125.092 164.625C126.589 163.996 128.13 163.577 129.479 163.234C130.145 163.065 130.78 162.911 131.317 162.762C131.847 162.615 132.343 162.457 132.722 162.267L132.051 160.926C131.812 161.045 131.439 161.171 130.916 161.316C130.4 161.46 129.798 161.606 129.11 161.781C127.751 162.126 126.118 162.567 124.511 163.243L125.092 164.625ZM132.516 158.339C131.382 158.141 129.8 158.194 128.216 158.354C126.613 158.517 124.937 158.798 123.581 159.089L123.896 160.556C125.204 160.274 126.825 160.003 128.367 159.847C129.928 159.689 131.337 159.656 132.257 159.817L132.516 158.339ZM123.581 159.089C122.247 159.376 120.227 159.953 118.159 160.454C116.043 160.968 113.79 161.426 111.8 161.536L111.883 163.034C114.015 162.916 116.377 162.43 118.513 161.912C120.697 161.382 122.565 160.842 123.896 160.556L123.581 159.089Z" fill="#669DF6"/><path d="M132.929 162.152L133.271 161.484C133.239 161.468 133.206 161.454 133.172 161.442L132.929 162.152ZM122.276 167.74C121.885 167.875 121.677 168.302 121.812 168.694C121.948 169.085 122.375 169.293 122.766 169.158L122.276 167.74ZM131.694 161.147C131.28 161.147 130.944 161.482 130.944 161.897C130.944 162.311 131.28 162.647 131.694 162.647L131.694 161.147ZM132.587 162.819C132.599 162.825 132.718 162.918 132.723 163.209C132.728 163.476 132.623 163.737 132.44 163.894L133.418 165.031C133.995 164.536 134.235 163.818 134.223 163.181C134.211 162.568 133.951 161.832 133.271 161.484L132.587 162.819ZM132.44 163.894C132.459 163.878 132.44 163.897 132.333 163.954C132.24 164.004 132.113 164.066 131.953 164.139C131.632 164.285 131.206 164.464 130.705 164.664C129.704 165.064 128.435 165.539 127.184 165.996C125.934 166.452 124.707 166.888 123.792 167.21C123.334 167.371 122.955 167.504 122.691 167.596C122.558 167.642 122.455 167.678 122.384 167.702C122.349 167.715 122.322 167.724 122.304 167.73C122.295 167.733 122.288 167.736 122.283 167.737C122.281 167.738 122.279 167.739 122.278 167.739C122.277 167.739 122.277 167.74 122.277 167.74C122.277 167.74 122.277 167.74 122.276 167.74C122.276 167.74 122.276 167.74 122.521 168.449C122.766 169.158 122.766 169.158 122.766 169.157C122.766 169.157 122.767 169.157 122.767 169.157C122.767 169.157 122.767 169.157 122.768 169.157C122.769 169.156 122.771 169.156 122.773 169.155C122.778 169.153 122.785 169.151 122.794 169.148C122.813 169.141 122.84 169.132 122.876 169.12C122.947 169.095 123.051 169.059 123.184 169.012C123.45 168.92 123.831 168.787 124.29 168.625C125.208 168.302 126.441 167.864 127.698 167.405C128.954 166.947 130.239 166.466 131.261 166.057C131.771 165.853 132.223 165.664 132.576 165.504C132.751 165.423 132.91 165.347 133.042 165.276C133.16 165.213 133.304 165.129 133.418 165.031L132.44 163.894ZM131.694 162.647C132.011 162.647 132.321 162.737 132.687 162.862L133.172 161.442C132.797 161.314 132.281 161.147 131.694 161.147L131.694 162.647Z" fill="#669DF6"/><path d="M126.352 166.368C125.944 166.439 125.67 166.827 125.741 167.235C125.811 167.643 126.2 167.917 126.608 167.846L126.352 166.368ZM122.422 170.22C122.013 170.286 121.736 170.672 121.803 171.08C121.869 171.489 122.254 171.767 122.663 171.7L122.422 170.22ZM126.48 167.107C126.608 167.846 126.608 167.846 126.608 167.846C126.608 167.846 126.608 167.846 126.608 167.846C126.608 167.846 126.608 167.846 126.608 167.846C126.608 167.846 126.609 167.846 126.61 167.846C126.612 167.846 126.615 167.845 126.619 167.844C126.628 167.843 126.641 167.841 126.658 167.838C126.692 167.832 126.743 167.824 126.808 167.814C126.939 167.793 127.128 167.764 127.358 167.732C127.819 167.667 128.44 167.591 129.084 167.54C129.734 167.488 130.385 167.465 130.914 167.501C131.18 167.519 131.392 167.55 131.549 167.591C131.72 167.636 131.754 167.674 131.733 167.655L132.758 166.56C132.512 166.33 132.197 166.211 131.93 166.14C131.648 166.066 131.333 166.026 131.016 166.004C130.38 165.961 129.645 165.99 128.966 166.044C128.282 166.098 127.63 166.179 127.15 166.246C126.91 166.28 126.712 166.31 126.573 166.332C126.504 166.343 126.449 166.352 126.412 166.358C126.393 166.361 126.379 166.364 126.368 166.366C126.363 166.366 126.36 166.367 126.357 166.368C126.355 166.368 126.354 166.368 126.354 166.368C126.353 166.368 126.353 166.368 126.353 166.368C126.353 166.368 126.352 166.368 126.352 166.368C126.352 166.368 126.352 166.368 126.48 167.107ZM131.733 167.655C132.016 167.92 132.035 168.136 132.017 168.26C132.006 168.337 131.978 168.407 131.943 168.461C131.905 168.52 131.873 168.539 131.876 168.537L132.614 169.843C133.074 169.583 133.42 169.058 133.503 168.468C133.592 167.828 133.374 167.136 132.758 166.56L131.733 167.655ZM131.876 168.537C131.942 168.5 131.97 168.5 131.86 168.531C131.783 168.552 131.673 168.579 131.529 168.611C131.243 168.675 130.852 168.754 130.389 168.843C129.464 169.02 128.271 169.232 127.089 169.436C125.908 169.64 124.741 169.836 123.869 169.981C123.434 170.053 123.072 170.113 122.819 170.155C122.692 170.175 122.593 170.192 122.526 170.203C122.492 170.208 122.466 170.213 122.449 170.215C122.44 170.217 122.433 170.218 122.429 170.219C122.427 170.219 122.425 170.219 122.424 170.219C122.423 170.219 122.423 170.22 122.423 170.22C122.423 170.22 122.422 170.22 122.422 170.22C122.422 170.22 122.422 170.22 122.543 170.96C122.663 171.7 122.663 171.7 122.663 171.7C122.664 171.7 122.664 171.7 122.664 171.7C122.664 171.7 122.664 171.7 122.665 171.7C122.666 171.7 122.668 171.699 122.67 171.699C122.675 171.698 122.681 171.697 122.69 171.696C122.708 171.693 122.734 171.689 122.768 171.683C122.835 171.672 122.935 171.656 123.062 171.635C123.316 171.593 123.678 171.533 124.115 171.461C124.989 171.316 126.159 171.119 127.345 170.914C128.529 170.709 129.732 170.496 130.671 170.316C131.139 170.226 131.548 170.144 131.857 170.075C132.01 170.04 132.147 170.007 132.257 169.977C132.334 169.956 132.49 169.913 132.614 169.843L131.876 168.537Z" fill="#669DF6"/><path d="M122.921 170.316C122.507 170.334 122.187 170.685 122.205 171.099C122.224 171.513 122.575 171.833 122.989 171.814L122.921 170.316ZM118.664 173.766C118.26 173.86 118.009 174.263 118.102 174.666C118.196 175.07 118.599 175.321 119.002 175.228L118.664 173.766ZM122.955 171.065C122.989 171.814 122.989 171.814 122.989 171.814C122.989 171.814 122.989 171.814 122.989 171.814C122.989 171.814 122.989 171.814 122.989 171.814C122.99 171.814 122.991 171.814 122.992 171.814C122.995 171.814 123 171.814 123.005 171.813C123.017 171.813 123.034 171.812 123.057 171.811C123.103 171.809 123.171 171.807 123.258 171.803C123.432 171.797 123.683 171.789 123.988 171.782C124.6 171.767 125.427 171.755 126.292 171.767C127.16 171.78 128.054 171.816 128.802 171.894C129.177 171.933 129.503 171.982 129.764 172.04C130.04 172.101 130.19 172.16 130.25 172.196L131.014 170.905C130.747 170.747 130.411 170.647 130.088 170.575C129.751 170.501 129.365 170.445 128.959 170.402C128.145 170.317 127.201 170.28 126.313 170.267C125.423 170.255 124.576 170.267 123.952 170.282C123.64 170.29 123.383 170.298 123.204 170.304C123.114 170.308 123.044 170.31 122.996 170.312C122.972 170.313 122.953 170.314 122.941 170.315C122.934 170.315 122.929 170.315 122.926 170.315C122.924 170.315 122.923 170.315 122.922 170.316C122.922 170.316 122.922 170.316 122.921 170.316C122.921 170.316 122.921 170.316 122.921 170.316C122.921 170.316 122.921 170.316 122.955 171.065ZM130.25 172.196C130.49 172.338 130.59 172.463 130.633 172.539C130.672 172.609 130.678 172.666 130.672 172.716C130.666 172.775 130.64 172.84 130.601 172.897C130.556 172.961 130.525 172.97 130.555 172.956L131.195 174.312C131.675 174.086 132.09 173.525 132.163 172.885C132.247 172.139 131.87 171.412 131.014 170.905L130.25 172.196ZM130.555 172.956C130.624 172.923 130.665 172.921 130.631 172.927C130.61 172.93 130.569 172.934 130.504 172.938C130.373 172.946 130.191 172.947 129.958 172.943C129.493 172.935 128.888 172.907 128.199 172.878C126.848 172.821 125.185 172.763 123.904 172.888L124.049 174.381C125.208 174.268 126.764 174.319 128.137 174.376C128.809 174.405 129.443 174.434 129.932 174.443C130.177 174.447 130.402 174.446 130.588 174.436C130.681 174.431 130.776 174.422 130.865 174.408C130.942 174.396 131.068 174.372 131.195 174.312L130.555 172.956ZM123.904 172.888C122.651 173.009 121.34 173.229 120.349 173.417C119.852 173.512 119.432 173.599 119.136 173.662C118.988 173.694 118.871 173.72 118.79 173.738C118.75 173.747 118.719 173.754 118.697 173.759C118.687 173.761 118.678 173.763 118.673 173.764C118.67 173.765 118.668 173.765 118.666 173.766C118.666 173.766 118.665 173.766 118.664 173.766C118.664 173.766 118.664 173.766 118.664 173.766C118.664 173.766 118.664 173.766 118.664 173.766C118.664 173.766 118.664 173.766 118.833 174.497C119.002 175.228 119.002 175.228 119.002 175.228C119.002 175.228 119.002 175.228 119.002 175.228C119.002 175.228 119.002 175.228 119.002 175.228C119.003 175.228 119.003 175.227 119.004 175.227C119.005 175.227 119.006 175.227 119.009 175.226C119.014 175.225 119.021 175.223 119.031 175.221C119.05 175.217 119.079 175.21 119.117 175.202C119.194 175.184 119.307 175.159 119.45 175.129C119.737 175.067 120.145 174.983 120.629 174.891C121.599 174.707 122.86 174.496 124.049 174.381L123.904 172.888Z" fill="#669DF6"/>
       </g>
     </defs>
   </svg>
diff --git a/chrome/browser/resources/new_tab_page/app.html b/chrome/browser/resources/new_tab_page/app.html
index 9ea2823..0ebe904 100644
--- a/chrome/browser/resources/new_tab_page/app.html
+++ b/chrome/browser/resources/new_tab_page/app.html
@@ -5,6 +5,7 @@
     --ntp-one-google-bar-height: 56px;
     --ntp-search-box-width: 337px;
     --ntp-module-width: var(--ntp-search-box-width);
+    --ntp-module-layout-width: var(--ntp-search-box-width);
     --ntp-module-border-radius: 5px;
   }
 
@@ -28,9 +29,14 @@
 
   :host([modules-redesigned-enabled_]) {
     --ntp-module-border-radius: 24px;
+    --ntp-module-layout-width: 360px;
     --ntp-module-width: 360px;
   }
 
+  :host([modules-redesigned-layout-enabled_]) {
+    --ntp-module-layout-width: 1170px;
+  }
+
   :host([show-background-image_]) {
     --ntp-theme-text-shadow: 0 0 16px rgba(0, 0, 0, .3);
   }
@@ -69,7 +75,7 @@
 
   ntp-modules {
     flex-shrink: 0;
-    width: var(--ntp-module-width);
+    width: var(--ntp-module-layout-width);
   }
 
   ntp-middle-slot-promo {
diff --git a/chrome/browser/resources/new_tab_page/app.js b/chrome/browser/resources/new_tab_page/app.js
index e71888c..23cd232 100644
--- a/chrome/browser/resources/new_tab_page/app.js
+++ b/chrome/browser/resources/new_tab_page/app.js
@@ -206,6 +206,13 @@
       },
 
       /** @private */
+      modulesRedesignedLayoutEnabled_: {
+        type: Boolean,
+        value: () => loadTimeData.getBoolean('modulesRedesignedLayoutEnabled'),
+        reflectToAttribute: true,
+      },
+
+      /** @private */
       middleSlotPromoEnabled_: {
         type: Boolean,
         value: () => loadTimeData.getBoolean('middleSlotPromoEnabled'),
diff --git a/chrome/browser/resources/new_tab_page/iframe.html b/chrome/browser/resources/new_tab_page/iframe.html
index c732459..4a53322 100644
--- a/chrome/browser/resources/new_tab_page/iframe.html
+++ b/chrome/browser/resources/new_tab_page/iframe.html
@@ -6,6 +6,7 @@
   #iframe {
     border: none;
     border-radius: inherit;
+    display: block;
     height: inherit;
     max-height: inherit;
     max-width: inherit;
diff --git a/chrome/browser/resources/new_tab_page/modules/modules.html b/chrome/browser/resources/new_tab_page/modules/modules.html
index 66e3541..9d44ca0 100644
--- a/chrome/browser/resources/new_tab_page/modules/modules.html
+++ b/chrome/browser/resources/new_tab_page/modules/modules.html
@@ -1,14 +1,26 @@
 <style include="cr-hidden-style">
   :host {
     display: block;
+    --ntp-module-container-padding-top: 16px;
   }
 
   ntp-module-wrapper {
     width: var(--ntp-module-width);
   }
 
+  :host([modules-redesigned-layout-enabled_]) .module-container {
+    --ntp-module-container-padding-top: 0px;
+    margin-bottom: 30px;
+    margin-inline-end: 30px;
+  }
+
   .module-container + .module-container {
-    padding-top: 16px;
+    padding-top: var(--ntp-module-container-padding-top);
+  }
+
+  :host([modules-redesigned-layout-enabled_]) #modules {
+    display: flex;
+    flex-flow: row wrap;
   }
 
   #removeModuleToastMessage {
diff --git a/chrome/browser/resources/new_tab_page/modules/modules.js b/chrome/browser/resources/new_tab_page/modules/modules.js
index 5c939ee..7405f8a 100644
--- a/chrome/browser/resources/new_tab_page/modules/modules.js
+++ b/chrome/browser/resources/new_tab_page/modules/modules.js
@@ -78,6 +78,13 @@
         value: () => loadTimeData.getBoolean('modulesDragAndDropEnabled'),
         reflectToAttribute: true,
       },
+
+      /** @private {boolean} */
+      modulesRedesignedLayoutEnabled_: {
+        type: Boolean,
+        value: () => loadTimeData.getBoolean('modulesRedesignedLayoutEnabled'),
+        reflectToAttribute: true,
+      },
     };
   }
 
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.html b/chrome/browser/resources/new_tab_page/realbox/realbox.html
index 281794be..3cce331 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox.html
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox.html
@@ -53,6 +53,10 @@
     background-color: var(--search-box-results-bg, white);
   }
 
+  input:hover {
+    background-color: var(--search-box-bg-hovered, white);
+  }
+
   ntp-realbox-icon {
     height: 100%;
     left: 12px;
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.ts b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
index e59c88a1..bcffdd61 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox.ts
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
@@ -294,8 +294,25 @@
       return;
     }
 
+    const variant = loadTimeData.getInteger('realboxMatchOmniboxThemeVariant');
+    if (variant === 0) {
+      this.updateStyles({
+        '--search-box-bg': skColorToRgba(assert(this.theme.bg)),
+        '--search-box-bg-hovered': skColorToRgba(assert(this.theme.bg))
+      });
+    } else if (variant === 1) {
+      this.updateStyles({
+        '--search-box-bg': skColorToRgba(assert(this.theme.ntpBg)),
+        '--search-box-bg-hovered': skColorToRgba(assert(this.theme.bg))
+      });
+    } else if (variant === 2) {
+      this.updateStyles({
+        '--search-box-bg': skColorToRgba(assert(this.theme.ntpBg)),
+        '--search-box-bg-hovered': skColorToRgba(assert(this.theme.resultsBg))
+      });
+    }
+
     this.updateStyles({
-      '--search-box-bg': skColorToRgba(assert(this.theme.bg)),
       '--search-box-placeholder': skColorToRgba(assert(this.theme.placeholder)),
       '--search-box-results-bg': skColorToRgba(assert(this.theme.resultsBg)),
       '--search-box-text': skColorToRgba(assert(this.theme.text)),
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox_action.html b/chrome/browser/resources/new_tab_page/realbox/realbox_action.html
index 20075c0..749960f 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox_action.html
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox_action.html
@@ -37,7 +37,7 @@
   }
 
   :host-context(.focus-outline-visible):host(:focus) {
-    box-shadow: inset 0 0 0 2px var(--cr-focus-outline-color);
+    box-shadow: inset 0 0 0 2px var(--google-blue-600);
   }
 
 </style>
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.html b/chrome/browser/resources/settings/privacy_page/privacy_page.html
index c543fe3..ad1f34f 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.html
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.html
@@ -112,13 +112,13 @@
             <security-keys-subpage></security-keys-subpage>
           </settings-subpage>
         </template>
+      </template>
 
-        <template is="dom-if" route-path="/securityKeys/phones">
-          <settings-subpage associated-control="[[$$('#securityLinkRow')]]"
-              page-title="$i18n{securityKeysPhonesManage}">
-            <security-keys-phones-subpage></security-keys-phones-subpage>
-          </settings-subpage>
-        </template>
+      <template is="dom-if" route-path="/securityKeys/phones">
+        <settings-subpage associated-control="[[$$('#securityLinkRow')]]"
+            page-title="$i18n{securityKeysPhonesManage}">
+          <security-keys-phones-subpage></security-keys-phones-subpage>
+        </settings-subpage>
       </template>
 
       <template is="dom-if" route-path="/content">
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.html b/chrome/browser/resources/settings/privacy_page/security_page.html
index b3da3f2..00fc437 100644
--- a/chrome/browser/resources/settings/privacy_page/security_page.html
+++ b/chrome/browser/resources/settings/privacy_page/security_page.html
@@ -182,6 +182,17 @@
           on-click="onSecurityKeysClick_"
           role-description="$i18n{subpageArrowRoleDescription}"></cr-link-row>
     </template>
+
+<if expr="is_win">
+    <template is="dom-if" if="[[enableSecurityKeysPhonesSubpage_]]">
+        <cr-link-row
+          id="security-keys-phones-subpage-trigger"
+          label="$i18n{securityKeysPhonesManage}"
+          sub-label="$i18n{securityKeysPhonesManageDesc}"
+          on-click="onManagePhonesClick_"></cr-link-row>
+    </template>
+</if>
+
 <if expr="use_nss_certs or is_win or is_macosx">
     <cr-link-row id="manageCertificates"
         class="hr"
diff --git a/chrome/browser/resources/settings/privacy_page/security_page.ts b/chrome/browser/resources/settings/privacy_page/security_page.ts
index e72520a9..47e4264 100644
--- a/chrome/browser/resources/settings/privacy_page/security_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/security_page.ts
@@ -136,6 +136,20 @@
         }
       },
 
+      // <if expr="is_win">
+      enableSecurityKeysPhonesSubpage_: {
+        type: Boolean,
+        readOnly: true,
+        value() {
+          // The phones subpage is linked from the security keys subpage, if
+          // it exists. Thus the phones subpage is only linked from this page
+          // if the security keys subpage is disabled.
+          return !loadTimeData.getBoolean('enableSecurityKeysSubpage') &&
+              loadTimeData.getBoolean('enableSecurityKeysPhonesSubpage');
+        }
+      },
+      // </if>
+
       focusConfig: {
         type: Object,
         observer: 'focusConfigChanged_',
@@ -278,6 +292,12 @@
     Router.getInstance().navigateTo(routes.SECURITY_KEYS);
   }
 
+  // <if expr="is_win">
+  private onManagePhonesClick_() {
+    Router.getInstance().navigateTo(routes.SECURITY_KEYS_PHONES);
+  }
+  // </if>
+
   private onSafeBrowsingExtendedReportingChange_() {
     this.metricsBrowserProxy_.recordSettingsPageHistogram(
         PrivacyElementInteractions.IMPROVE_SECURITY);
diff --git a/chrome/browser/resources/settings/privacy_sandbox/app.html b/chrome/browser/resources/settings/privacy_sandbox/app.html
index b077569..b642313 100644
--- a/chrome/browser/resources/settings/privacy_sandbox/app.html
+++ b/chrome/browser/resources/settings/privacy_sandbox/app.html
@@ -1,8 +1,7 @@
 <style include="cr-shared-style settings-shared cr-page-host-style">
   .banner {
     display: block;
-    margin-inline-end: auto;
-    margin-inline-start: auto;
+    margin: var(--cr-section-vertical-margin) auto;
     width: 120px;
   }
 
@@ -96,79 +95,105 @@
     <img class="banner" alt=""
         src="chrome://settings/images/privacy_sandbox_banner.svg">
   </picture>
-  <p>$i18nRaw{privacySandboxPageExplanation1Phase2}</p>
-  <p>$i18n{privacySandboxPageExplanation2Phase2}</p>
-  <div class="card">
-    <settings-toggle-button id="apiToggleButton"
-        pref="{{prefs.privacy_sandbox.apis_enabled}}"
-        label="$i18n{privacySandboxPageSettingTitle}"
-        on-change="onApiToggleButtonChange_">
-    </settings-toggle-button>
-    <div class="cr-row continuation">
-      <div class="secondary">
-        $i18n{privacySandboxPageSettingExplanation1Phase2}
+  <template is="dom-if" if="[[privacySandboxSettings3Enabled_]]">
+    <div id="trialsCardSettings3" class="card">
+      <settings-toggle-button
+          pref="{{privacySandboxTrialsEnabled_}}"
+          label="$i18n{privacySandboxTrialsTitle}"
+          sub-label="$i18n{privacySandboxTrialsSummary}">
+      </settings-toggle-button>
+      <cr-link-row
+        start-icon="settings:ads"
+        label="$i18n{privacySandboxAdPersonalizationTitle}"
+        sub-label="$i18n{privacySandboxAdPersonalizationSummary}"></cr-link-row>
+      <cr-link-row
+        start-icon="settings:ads"
+        label="$i18n{privacySandboxAdMeasurementTitle}"
+        sub-label="$i18n{privacySandboxAdMeasurementSummary}"></cr-link-row>
+      <cr-link-row
+        start-icon="settings:ads"
+        label="$i18n{privacySandboxSpamAndFraudTitle}"
+        sub-label="$i18n{privacySandboxSpamAndFraudSummary}"></cr-link-row>
+    </div>
+  </template>
+  <template is="dom-if" if="[[!privacySandboxSettings3Enabled_]]">
+    <p>$i18nRaw{privacySandboxPageExplanation1Phase2}</p>
+    <p>$i18n{privacySandboxPageExplanation2Phase2}</p>
+    <div id="trialsCard" class="card">
+      <settings-toggle-button id="apiToggleButton"
+          pref="{{prefs.privacy_sandbox.apis_enabled}}"
+          label="$i18n{privacySandboxPageSettingTitle}"
+          on-change="onApiToggleButtonChange_">
+      </settings-toggle-button>
+      <div class="cr-row continuation">
+        <div class="secondary">
+          $i18n{privacySandboxPageSettingExplanation1Phase2}
+        </div>
       </div>
-    </div>
-    <div class="cr-row continuation box-last">
-      <div class="secondary">
-        <ul>
-          <li>
-            <span>$i18n{privacySandboxPageSettingExplanation2Phase2}</span>
-          </li>
-          <li>
-            <span>$i18n{privacySandboxPageSettingExplanation3Phase2}</span>
-          </li>
-        </ul>
-      </div>
-    </div>
-  </div>
-  <div id="flocCard" class="card">
-    <picture>
-      <source class="card-banner" media="(prefers-color-scheme: dark)"
-          srcset="./images/privacy_sandbox_floc_banner_dark.svg">
-      <img class="card-banner" alt=""
-          src="./images/privacy_sandbox_floc_banner.svg">
-    </picture>
-    <settings-toggle-button id="flocToggleButton"
-        pref="{{prefs.generated.floc_enabled}}"
-        label="$i18n{privacySandboxPageFlocHeading}"
-        on-change="onFlocToggleButtonChange_">
-    </settings-toggle-button>
-    <div id="flocExplanation" class="cr-row continuation">
-      <div class="secondary">$i18nRaw{privacySandboxPageFlocExplanation}</div>
-    </div>
-    <div class="cr-row continuation">
-      <div class="label-wrapper">
-        <div class="info-header">$i18n{privacySandboxPageFlocStatus}</div>
-        <div id="flocStatus" class="cr-secondary-text">
-          [[flocId_.trialStatus]]
+      <div class="cr-row continuation box-last">
+        <div class="secondary">
+          <ul>
+            <li>
+              <span>$i18n{privacySandboxPageSettingExplanation2Phase2}</span>
+            </li>
+            <li>
+              <span>$i18n{privacySandboxPageSettingExplanation3Phase2}</span>
+            </li>
+          </ul>
         </div>
       </div>
     </div>
-    <div class="cr-row continuation">
-      <div class="label-wrapper">
-        <div class="info-header">$i18n{privacySandboxPageFlocCohort}</div>
-        <div id="flocId" class="cr-secondary-text">[[flocId_.cohort]]</div>
+    <div id="flocCard" class="card">
+      <picture>
+        <source class="card-banner" media="(prefers-color-scheme: dark)"
+            srcset="./images/privacy_sandbox_floc_banner_dark.svg">
+        <img class="card-banner" alt=""
+            src="./images/privacy_sandbox_floc_banner.svg">
+      </picture>
+      <settings-toggle-button id="flocToggleButton"
+          pref="{{prefs.generated.floc_enabled}}"
+          label="$i18n{privacySandboxPageFlocHeading}"
+          on-change="onFlocToggleButtonChange_">
+      </settings-toggle-button>
+      <div id="flocExplanation" class="cr-row continuation">
+        <div class="secondary">$i18nRaw{privacySandboxPageFlocExplanation}</div>
       </div>
-    </div>
-    <div class="cr-row continuation">
-      <div class="label-wrapper">
-        <div class="info-header">
-          $i18n{privacySandboxPageFlocCohortNextUpdate}
-        </div>
-        <div id="flocUpdatedOn" class="cr-secondary-text">
-          [[flocId_.nextUpdate]]
+      <div class="cr-row continuation">
+        <div class="label-wrapper">
+          <div class="info-header">$i18n{privacySandboxPageFlocStatus}</div>
+          <div id="flocStatus" class="cr-secondary-text">
+            [[flocId_.trialStatus]]
+          </div>
         </div>
       </div>
+      <div class="cr-row continuation">
+        <div class="label-wrapper">
+          <div class="info-header">$i18n{privacySandboxPageFlocCohort}</div>
+          <div id="flocId" class="cr-secondary-text">[[flocId_.cohort]]</div>
+        </div>
+      </div>
+      <div class="cr-row continuation">
+        <div class="label-wrapper">
+          <div class="info-header">
+            $i18n{privacySandboxPageFlocCohortNextUpdate}
+          </div>
+          <div id="flocUpdatedOn" class="cr-secondary-text">
+            [[flocId_.nextUpdate]]
+          </div>
+        </div>
+      </div>
+      <div class="cr-row continuation">
+        <div class="secondary">
+          $i18n{privacySandboxPageFlocResetExplanation}
+        </div>
+      </div>
+      <div class="cr-row continuation box-last">
+        <cr-button id="resetFlocIdButton" class="cr-button" role="button"
+            disabled$="[[!flocId_.canReset]]" on-click="onResetFlocClick_">
+          $i18n{privacySandboxPageFlocResetCohort}
+        </cr-button>
+      </div>
     </div>
-  <div class="cr-row continuation">
-    <div class="secondary">$i18n{privacySandboxPageFlocResetExplanation}</div>
-  </div>
-  <div class="cr-row continuation box-last">
-    <cr-button id="resetFlocIdButton" class="cr-button" role="button"
-        disabled$="[[!flocId_.canReset]]" on-click="onResetFlocClick_">
-      $i18n{privacySandboxPageFlocResetCohort}
-    </cr-button>
-  </div>
+  </template>
 </div>
 <div id="overscroll"></div>
diff --git a/chrome/browser/resources/settings/privacy_sandbox/app.ts b/chrome/browser/resources/settings/privacy_sandbox/app.ts
index 5aa36ae2..83ce91f 100644
--- a/chrome/browser/resources/settings/privacy_sandbox/app.ts
+++ b/chrome/browser/resources/settings/privacy_sandbox/app.ts
@@ -12,20 +12,10 @@
 // Those resources are loaded through settings.js as the privacy sandbox page
 // lives outside regular settings, hence can't access those resources directly
 // with |optimize_webui="true"|.
-import {CrButtonElement, CrSettingsPrefs, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxy, MetricsBrowserProxyImpl, PrefsMixin, SettingsToggleButtonElement, TrustSafetyInteraction} from '../settings.js';
+import {CrSettingsPrefs, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxy, MetricsBrowserProxyImpl, PrefsMixin, SettingsToggleButtonElement, TrustSafetyInteraction} from '../settings.js';
 
 import {FlocIdentifier, PrivacySandboxBrowserProxy, PrivacySandboxBrowserProxyImpl} from './privacy_sandbox_browser_proxy.js';
 
-export interface PrivacySandboxAppElement {
-  $: {
-    flocId: HTMLElement,
-    flocStatus: HTMLElement,
-    flocToggleButton: SettingsToggleButtonElement,
-    flocUpdatedOn: HTMLElement,
-    resetFlocIdButton: CrButtonElement,
-  };
-}
-
 const PrivacySandboxAppElementBase = PrefsMixin(PolymerElement);
 
 export class PrivacySandboxAppElement extends PrivacySandboxAppElementBase {
@@ -40,6 +30,23 @@
   static get properties() {
     return {
       flocId_: Object,
+
+      privacySandboxSettings3Enabled_: {
+        type: Boolean,
+        value: () => loadTimeData.getBoolean('privacySandboxSettings3Enabled'),
+      },
+
+      // TODO(crbug/1286276): Remove this when connecting the new pref.
+      privacySandboxTrialsEnabled_: {
+        type: Object,
+        notify: true,
+        value() {
+          return {
+            type: chrome.settingsPrivate.PrefType.BOOLEAN,
+            value: true,
+          };
+        },
+      },
     };
   }
 
diff --git a/chrome/browser/resources/settings/route.ts b/chrome/browser/resources/settings/route.ts
index 55c6ead..e5d13c8 100644
--- a/chrome/browser/resources/settings/route.ts
+++ b/chrome/browser/resources/settings/route.ts
@@ -31,8 +31,14 @@
 
   if (loadTimeData.getBoolean('enableSecurityKeysSubpage')) {
     r.SECURITY_KEYS = r.SECURITY.createChild('/securityKeys');
-    r.SECURITY_KEYS_PHONES =
-        r.SECURITY_KEYS.createChild('/securityKeys/phones');
+    if (loadTimeData.getBoolean('enableSecurityKeysPhonesSubpage')) {
+      r.SECURITY_KEYS_PHONES =
+          r.SECURITY_KEYS.createChild('/securityKeys/phones');
+    }
+    // <if expr="is_win">
+  } else if (loadTimeData.getBoolean('enableSecurityKeysPhonesSubpage')) {
+    r.SECURITY_KEYS_PHONES = r.SECURITY.createChild('/securityKeys/phones');
+    // </if>
   }
 
   r.SITE_SETTINGS_ALL = r.SITE_SETTINGS.createChild('all');
diff --git a/chrome/browser/resources/tab_search/app.ts b/chrome/browser/resources/tab_search/app.ts
index 12702d83..199b805 100644
--- a/chrome/browser/resources/tab_search/app.ts
+++ b/chrome/browser/resources/tab_search/app.ts
@@ -572,10 +572,9 @@
     });
 
     let mediaTabs: Array<TabData> = [];
-    // Audio & Video section will not be added when search criteria is applied
-    // if media tabs are also shown in Open Tabs section.
-    if (this.searchText_.length == 0 ||
-        !loadTimeData.getBoolean('alsoShowMediaTabsinOpenTabsSection')) {
+    // Audio & Video section will not be added when search criteria is applied.
+    // Show media tabs in Open Tabs.
+    if (this.searchText_.length === 0) {
       mediaTabs = this.openTabs_.filter(
           tabData => tabHasMediaAlerts(tabData.tab as Tab));
     }
@@ -586,7 +585,8 @@
     let filteredOpenTabs =
         fuzzySearch(this.searchText_, this.openTabs_, this.fuzzySearchOptions_);
 
-    if (!loadTimeData.getBoolean('alsoShowMediaTabsinOpenTabsSection')) {
+    if (!loadTimeData.getBoolean('alsoShowMediaTabsinOpenTabsSection') &&
+        this.searchText_.length === 0) {
       filteredOpenTabs = filteredOpenTabs.filter(
           tabData => !tabHasMediaAlerts(tabData.tab as Tab));
     }
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
index 89b4543..c3d18a12 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
@@ -828,7 +828,7 @@
   SimulateGaiaPasswordChange("password");
   ASSERT_EQ(1u, profile->GetPrefs()
                     ->GetList(password_manager::prefs::kPasswordHashDataList)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   // Turn off trigger
   profile->GetPrefs()->SetInteger(
@@ -841,7 +841,7 @@
       user_manager::kStubUserEmail, /*is_gaia_password=*/true));
   EXPECT_EQ(0u, profile->GetPrefs()
                     ->GetList(password_manager::prefs::kPasswordHashDataList)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
 }
 
@@ -854,7 +854,7 @@
 
   ASSERT_EQ(0u, profile->GetPrefs()
                     ->GetList(password_manager::prefs::kPasswordHashDataList)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   // Configures initial password to "password_1";
   password_manager::PasswordReuseManager* reuse_manager =
@@ -868,7 +868,7 @@
           CHANGED_IN_CONTENT_AREA);
   ASSERT_EQ(2u, profile->GetPrefs()
                     ->GetList(password_manager::prefs::kPasswordHashDataList)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
 
   // Turn off trigger
@@ -885,7 +885,7 @@
                                             /*is_gaia_password=*/true));
   EXPECT_EQ(0u, profile->GetPrefs()
                     ->GetList(password_manager::prefs::kPasswordHashDataList)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
 }
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc
index 99eaa9e..717f13e6 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc
@@ -366,7 +366,7 @@
       report->FindKey(policy::RealtimeReportingJobConfiguration::kEventListKey);
   ASSERT_NE(nullptr, event_list);
   EXPECT_EQ(base::Value::Type::LIST, event_list->type());
-  const base::Value::ListView mutable_list = event_list->GetList();
+  const base::Value::ListView mutable_list = event_list->GetListDeprecated();
 
   // There should only be 1 event per test.
   ASSERT_EQ(1, (int)mutable_list.size());
@@ -419,7 +419,7 @@
     EXPECT_NE(nullptr, v);
 
     EXPECT_TRUE(v->is_list());
-    const auto& identities = v->GetList();
+    const auto& identities = v->GetListDeprecated();
     EXPECT_EQ(password_breach_identities_->size(), identities.size());
     for (const auto& expected_identity : *password_breach_identities_) {
       bool matched = false;
@@ -460,7 +460,7 @@
       value->FindListKey(SafeBrowsingPrivateEventRouter::kKeyTriggeredRuleInfo);
   ASSERT_NE(nullptr, triggered_rules);
   ASSERT_EQ(base::Value::Type::LIST, triggered_rules->type());
-  base::Value::ListView rules_list = triggered_rules->GetList();
+  base::Value::ListView rules_list = triggered_rules->GetListDeprecated();
   int rules_size = rules_list.size();
   ASSERT_EQ(rules_size, result.triggered_rules_size());
   for (int i = 0; i < rules_size; ++i) {
@@ -567,7 +567,7 @@
                           bool machine_scope) {
   ListPrefUpdate settings_list(prefs, ConnectorPref(connector));
   DCHECK(settings_list.Get());
-  if (!settings_list->GetList().empty())
+  if (!settings_list->GetListDeprecated().empty())
     settings_list->ClearList();
 
   settings_list->Append(*base::JSONReader::Read(pref_value));
@@ -585,7 +585,7 @@
                                enterprise_connectors::kOnSecurityEventPref);
   DCHECK(settings_list.Get());
   if (enabled) {
-    if (settings_list->GetList().empty()) {
+    if (settings_list->GetListDeprecated().empty()) {
       base::Value settings(base::Value::Type::DICTIONARY);
 
       settings.SetKey(enterprise_connectors::kKeyServiceProvider,
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_browsertest_win.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_browsertest_win.cc
index 57c45bf..ace9e89 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_browsertest_win.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_browsertest_win.cc
@@ -175,9 +175,10 @@
     // Ensure that the startup url seen in the prefs is same as |startup_url|.
     const base::Value* url_list =
         GetPrefs()->GetList(prefs::kURLsToRestoreOnStartup);
-    ASSERT_EQ(url_list->GetList().size(), 1U);
-    ASSERT_TRUE(url_list->GetList()[0].is_string());
-    ASSERT_EQ(GURL(url_list->GetList()[0].GetString()), GURL(startup_url));
+    ASSERT_EQ(url_list->GetListDeprecated().size(), 1U);
+    ASSERT_TRUE(url_list->GetListDeprecated()[0].is_string());
+    ASSERT_EQ(GURL(url_list->GetListDeprecated()[0].GetString()),
+              GURL(startup_url));
   }
 
   void LoadManifest(const std::string& manifest,
diff --git a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_unittest.cc b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_unittest.cc
index 06c3095..3e17bf7 100644
--- a/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_unittest.cc
+++ b/chrome/browser/safe_browsing/settings_reset_prompt/settings_reset_prompt_model_unittest.cc
@@ -57,7 +57,7 @@
   if (!list || !list->is_list())
     return false;
 
-  for (const base::Value& i : list->GetList()) {
+  for (const base::Value& i : list->GetListDeprecated()) {
     const std::string* url_text = i.GetIfString();
     if (url_text && url == *url_text)
       return true;
diff --git a/chrome/browser/serial/serial_policy_allowed_ports.cc b/chrome/browser/serial/serial_policy_allowed_ports.cc
index f5c1213..4c9f556 100644
--- a/chrome/browser/serial/serial_policy_allowed_ports.cc
+++ b/chrome/browser/serial/serial_policy_allowed_ports.cc
@@ -89,7 +89,7 @@
   // The pref value has already been validated by the policy handler, so it is
   // safe to assume that |pref_value| follows the policy template.
   std::vector<url::Origin> urls;
-  for (const auto& url_value : pref_value->GetList()) {
+  for (const auto& url_value : pref_value->GetListDeprecated()) {
     GURL url(url_value.GetString());
     if (!url.is_valid()) {
       continue;
@@ -113,12 +113,12 @@
 
   // The pref value has already been validated by the policy handler, so it is
   // safe to assume that |pref_value| follows the policy template.
-  for (const auto& item : pref_value->GetList()) {
+  for (const auto& item : pref_value->GetListDeprecated()) {
     const base::Value* urls_value = item.FindKey(kPrefUrlsKey);
     DCHECK(urls_value);
 
     std::vector<url::Origin> urls;
-    for (const auto& url_value : urls_value->GetList()) {
+    for (const auto& url_value : urls_value->GetListDeprecated()) {
       GURL url(url_value.GetString());
       if (!url.is_valid()) {
         continue;
@@ -133,7 +133,7 @@
 
     const base::Value* devices_value = item.FindKey(kPrefDevicesKey);
     DCHECK(devices_value);
-    for (const auto& port_value : devices_value->GetList()) {
+    for (const auto& port_value : devices_value->GetListDeprecated()) {
       const base::Value* vendor_id_value = port_value.FindKey(kPrefVendorIdKey);
       DCHECK(vendor_id_value);
 
diff --git a/chrome/browser/sessions/restore_on_startup_policy_handler.cc b/chrome/browser/sessions/restore_on_startup_policy_handler.cc
index 404bc71b..01b12cc 100644
--- a/chrome/browser/sessions/restore_on_startup_policy_handler.cc
+++ b/chrome/browser/sessions/restore_on_startup_policy_handler.cc
@@ -58,7 +58,7 @@
         const base::Value* cookies_policy =
             policies.GetValue(key::kCookiesSessionOnlyForUrls);
         if (cookies_policy && cookies_policy->is_list() &&
-            !cookies_policy->GetList().empty()) {
+            !cookies_policy->GetListDeprecated().empty()) {
           errors->AddError(key::kCookiesSessionOnlyForUrls,
                            IDS_POLICY_OVERRIDDEN,
                            key::kRestoreOnStartup);
diff --git a/chrome/browser/sessions/session_service_log.cc b/chrome/browser/sessions/session_service_log.cc
index 39851a8..cdb51c2 100644
--- a/chrome/browser/sessions/session_service_log.cc
+++ b/chrome/browser/sessions/session_service_log.cc
@@ -181,7 +181,7 @@
   if (!serialized_events)
     return {};
   std::list<SessionServiceEvent> events;
-  for (const auto& serialized_event : serialized_events->GetList()) {
+  for (const auto& serialized_event : serialized_events->GetListDeprecated()) {
     SessionServiceEvent event;
     if (DeserializeEvent(serialized_event, event))
       events.push_back(std::move(event));
diff --git a/chrome/browser/sharing/sharing_sync_preference.cc b/chrome/browser/sharing/sharing_sync_preference.cc
index 6f0f0e27..68b2c1c 100644
--- a/chrome/browser/sharing/sharing_sync_preference.cc
+++ b/chrome/browser/sharing/sharing_sync_preference.cc
@@ -259,7 +259,7 @@
     return absl::nullopt;
 
   std::set<SharingSpecificFields::EnabledFeatures> enabled_features;
-  for (auto& value : enabled_features_value->GetList()) {
+  for (auto& value : enabled_features_value->GetListDeprecated()) {
     DCHECK(value.is_int());
     int feature_value = value.GetInt();
     // Filter invalid enums from other browser versions.
diff --git a/chrome/browser/signin/dice_browsertest.cc b/chrome/browser/signin/dice_browsertest.cc
index 9676031b..3ab8f44 100644
--- a/chrome/browser/signin/dice_browsertest.cc
+++ b/chrome/browser/signin/dice_browsertest.cc
@@ -1205,7 +1205,7 @@
   const base::Value* deleted_profiles =
       local_state->GetList(prefs::kProfilesDeleted);
   ASSERT_TRUE(deleted_profiles);
-  ASSERT_TRUE(deleted_profiles->GetList().empty());
+  ASSERT_TRUE(deleted_profiles->GetListDeprecated().empty());
 
   // Sign the profile in.
   SetupSignedInAccounts(signin::ConsentLevel::kSync);
@@ -1224,7 +1224,7 @@
   const base::Value* deleted_profiles =
       local_state->GetList(prefs::kProfilesDeleted);
   EXPECT_TRUE(deleted_profiles);
-  EXPECT_EQ(1U, deleted_profiles->GetList().size());
+  EXPECT_EQ(1U, deleted_profiles->GetListDeprecated().size());
 
   content::RunAllTasksUntilIdle();
 
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
index 8ba125a..c8f9590 100644
--- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
+++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
@@ -129,7 +129,7 @@
 
     if (event_types) {
       const base::Value::ConstListView event_types_list =
-          event_types->GetList();
+          event_types->GetListDeprecated();
       for (size_t j = 0; j < event_types_list.size(); j++) {
         std::string event_type;
         if (event_types_list[j].is_string())
@@ -156,7 +156,7 @@
                                       &voices_data)) {
     const char* error = nullptr;
     return ValidateAndConvertToTtsVoiceVector(
-        extension, voices_data->GetList(),
+        extension, voices_data->GetListDeprecated(),
         /* return_after_first_error = */ false, &error);
   }
 
diff --git a/chrome/browser/speech/extension_api/tts_extension_api.cc b/chrome/browser/speech/extension_api/tts_extension_api.cc
index 2afd8537..aa560d5 100644
--- a/chrome/browser/speech/extension_api/tts_extension_api.cc
+++ b/chrome/browser/speech/extension_api/tts_extension_api.cc
@@ -260,7 +260,7 @@
     base::ListValue* list;
     EXTENSION_FUNCTION_VALIDATE(
         options->GetList(constants::kRequiredEventTypesKey, &list));
-    for (const base::Value& i : list->GetList()) {
+    for (const base::Value& i : list->GetListDeprecated()) {
       const std::string* event_type = i.GetIfString();
       if (event_type) {
         required_event_types.insert(
@@ -274,7 +274,7 @@
     base::ListValue* list;
     EXTENSION_FUNCTION_VALIDATE(
         options->GetList(constants::kDesiredEventTypesKey, &list));
-    for (const base::Value& i : list->GetList()) {
+    for (const base::Value& i : list->GetListDeprecated()) {
       const std::string* event_type = i.GetIfString();
       if (event_type)
         desired_event_types.insert(TtsEventTypeFromString(event_type->c_str()));
diff --git a/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc b/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc
index deab80e..ad02483 100644
--- a/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc
+++ b/chrome/browser/spellchecker/spellcheck_language_blocklist_policy_handler.cc
@@ -107,13 +107,14 @@
       policies.GetValue(policy::key::kSpellcheckLanguage);
   std::unordered_set<std::string> forced_languages_lookup;
   if (forced_enabled_value) {
-    for (const auto& forced_language : forced_enabled_value->GetList())
+    for (const auto& forced_language :
+         forced_enabled_value->GetListDeprecated())
       forced_languages_lookup.insert(forced_language.GetString());
   }
 
   // Separate the valid languages from the unknown / unsupported languages and
   // the languages that also appear in the SpellcheckLanguage policy.
-  for (const base::Value& language : value->GetList()) {
+  for (const base::Value& language : value->GetListDeprecated()) {
     std::string candidate_language(
         base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL));
     std::string current_language =
diff --git a/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc b/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc
index e7830de..316f636 100644
--- a/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc
+++ b/chrome/browser/spellchecker/spellcheck_language_policy_handler.cc
@@ -87,7 +87,7 @@
     return;
 
   // Separate the valid languages from the unknown / unsupported languages.
-  for (const base::Value& language : value->GetList()) {
+  for (const base::Value& language : value->GetListDeprecated()) {
     std::string candidate_language(
         base::TrimWhitespaceASCII(language.GetString(), base::TRIM_ALL));
     std::string current_language =
diff --git a/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc b/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc
index 3778f8a..db8eeae 100644
--- a/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc
+++ b/chrome/browser/spellchecker/spellcheck_language_policy_handlers_unittest.cc
@@ -87,9 +87,9 @@
 
       EXPECT_TRUE(prefs.GetValue(key, &languages_list));
       EXPECT_TRUE(languages_list->is_list());
-      EXPECT_EQ(expected.size(), languages_list->GetList().size());
+      EXPECT_EQ(expected.size(), languages_list->GetListDeprecated().size());
 
-      for (const auto& language : languages_list->GetList()) {
+      for (const auto& language : languages_list->GetListDeprecated()) {
         EXPECT_TRUE(language.is_string());
         EXPECT_TRUE(std::find(expected.begin(), expected.end(),
                               language.GetString()) != expected.end());
diff --git a/chrome/browser/spellchecker/spellcheck_service.cc b/chrome/browser/spellchecker/spellcheck_service.cc
index f841d58..c345438 100644
--- a/chrome/browser/spellchecker/spellcheck_service.cc
+++ b/chrome/browser/spellchecker/spellcheck_service.cc
@@ -192,7 +192,8 @@
   PrefService* prefs = user_prefs::UserPrefs::Get(browser_context);
   std::set<std::string> spellcheck_dictionaries;
   for (const auto& value :
-       prefs->GetList(spellcheck::prefs::kSpellCheckDictionaries)->GetList()) {
+       prefs->GetList(spellcheck::prefs::kSpellCheckDictionaries)
+           ->GetListDeprecated()) {
     const std::string* dictionary = value.GetIfString();
     if (dictionary)
       spellcheck_dictionaries.insert(*dictionary);
@@ -432,18 +433,19 @@
   const base::Value* blocked_dictionaries =
       prefs->GetList(spellcheck::prefs::kSpellCheckBlocklistedDictionaries);
   std::unordered_set<std::string> blocked_dictionaries_lookup;
-  for (const auto& blocked_dict : blocked_dictionaries->GetList()) {
+  for (const auto& blocked_dict : blocked_dictionaries->GetListDeprecated()) {
     blocked_dictionaries_lookup.insert(blocked_dict.GetString());
   }
 
   // Merge both lists of dictionaries. Use a set to avoid duplicates.
   std::set<std::string> dictionaries;
-  for (const auto& dictionary_value : user_dictionaries->GetList()) {
+  for (const auto& dictionary_value : user_dictionaries->GetListDeprecated()) {
     if (blocked_dictionaries_lookup.find(dictionary_value.GetString()) ==
         blocked_dictionaries_lookup.end())
       dictionaries.insert(dictionary_value.GetString());
   }
-  for (const auto& dictionary_value : forced_dictionaries->GetList()) {
+  for (const auto& dictionary_value :
+       forced_dictionaries->GetListDeprecated()) {
     dictionaries.insert(dictionary_value.GetString());
   }
 
diff --git a/chrome/browser/spellchecker/spellcheck_service_browsertest.cc b/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
index 81e05cdc..43f59ea 100644
--- a/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
+++ b/chrome/browser/spellchecker/spellcheck_service_browsertest.cc
@@ -187,7 +187,7 @@
     const base::Value* list_value =
         prefs_->GetList(spellcheck::prefs::kSpellCheckDictionaries);
     std::vector<base::StringPiece> dictionaries;
-    for (const auto& item_value : list_value->GetList()) {
+    for (const auto& item_value : list_value->GetListDeprecated()) {
       EXPECT_TRUE(item_value.is_string());
       dictionaries.push_back(item_value.GetString());
     }
@@ -633,15 +633,15 @@
   // Make sure the preferences have been migrated.
   ASSERT_EQ(1u, GetPrefs()
                     ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   ASSERT_TRUE(GetPrefs()
                   ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                  ->GetList()[0]
+                  ->GetListDeprecated()[0]
                   .is_string());
   EXPECT_EQ("en-US", GetPrefs()
                          ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                         ->GetList()[0]
+                         ->GetListDeprecated()[0]
                          .GetString());
   EXPECT_TRUE(
       GetPrefs()->GetString(spellcheck::prefs::kSpellCheckDictionary).empty());
@@ -660,15 +660,15 @@
   // Make sure the preferences have not been migrated.
   ASSERT_EQ(1u, GetPrefs()
                     ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   ASSERT_TRUE(GetPrefs()
                   ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                  ->GetList()[0]
+                  ->GetListDeprecated()[0]
                   .is_string());
   EXPECT_EQ("en-US", GetPrefs()
                          ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                         ->GetList()[0]
+                         ->GetListDeprecated()[0]
                          .GetString());
   EXPECT_TRUE(
       GetPrefs()->GetString(spellcheck::prefs::kSpellCheckDictionary).empty());
@@ -689,7 +689,7 @@
   EXPECT_FALSE(GetPrefs()->GetBoolean(spellcheck::prefs::kSpellCheckEnable));
   EXPECT_EQ(1U, GetPrefs()
                     ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
 }
 
@@ -708,23 +708,23 @@
   EXPECT_TRUE(GetPrefs()->GetBoolean(spellcheck::prefs::kSpellCheckEnable));
   EXPECT_EQ(2U, GetPrefs()
                     ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   ASSERT_TRUE(GetPrefs()
                   ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                  ->GetList()[0]
+                  ->GetListDeprecated()[0]
                   .is_string());
   EXPECT_EQ("en-US", GetPrefs()
                          ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                         ->GetList()[0]
+                         ->GetListDeprecated()[0]
                          .GetString());
   ASSERT_TRUE(GetPrefs()
                   ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                  ->GetList()[1]
+                  ->GetListDeprecated()[1]
                   .is_string());
   EXPECT_EQ("fr", GetPrefs()
                       ->GetList(spellcheck::prefs::kSpellCheckDictionaries)
-                      ->GetList()[1]
+                      ->GetListDeprecated()[1]
                       .GetString());
 }
 
@@ -917,7 +917,7 @@
   const base::Value* dictionaries_list =
       GetPrefs()->Get(spellcheck::prefs::kSpellCheckDictionaries);
   std::vector<std::string> actual_dictionaries;
-  for (const auto& dictionary : dictionaries_list->GetList()) {
+  for (const auto& dictionary : dictionaries_list->GetListDeprecated()) {
     actual_dictionaries.push_back(dictionary.GetString());
   }
   EXPECT_EQ(kSpellcheckDictionariesAfter, actual_dictionaries);
diff --git a/chrome/browser/ssl/secure_origin_policy_handler.cc b/chrome/browser/ssl/secure_origin_policy_handler.cc
index 0ef7eb5..d0d2206 100644
--- a/chrome/browser/ssl/secure_origin_policy_handler.cc
+++ b/chrome/browser/ssl/secure_origin_policy_handler.cc
@@ -33,7 +33,7 @@
     return;
 
   std::string pref_string;
-  for (const auto& list_entry : value->GetList()) {
+  for (const auto& list_entry : value->GetListDeprecated()) {
     if (!pref_string.empty())
       pref_string.append(",");
     pref_string.append(list_entry.GetString());
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc
index 0a44758..9815fe6 100644
--- a/chrome/browser/ssl/ssl_browsertest.cc
+++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -1739,7 +1739,7 @@
     const base::Value* pref_value = pref_service->GetList(pref_name);
     ASSERT_TRUE(pref_value);
     std::vector<std::string> pref_values;
-    for (const auto& value : pref_value->GetList()) {
+    for (const auto& value : pref_value->GetListDeprecated()) {
       ASSERT_TRUE(value.is_string());
       pref_values.push_back(value.GetString());
     }
diff --git a/chrome/browser/ssl/ssl_config_service_manager.cc b/chrome/browser/ssl/ssl_config_service_manager.cc
index ab8b44d..08fe7667 100644
--- a/chrome/browser/ssl/ssl_config_service_manager.cc
+++ b/chrome/browser/ssl/ssl_config_service_manager.cc
@@ -51,8 +51,8 @@
 // which cannot be converted will be skipped.
 std::vector<std::string> ListValueToStringVector(const base::ListValue* value) {
   std::vector<std::string> results;
-  results.reserve(value->GetList().size());
-  for (const auto& entry : value->GetList()) {
+  results.reserve(value->GetListDeprecated().size());
+  for (const auto& entry : value->GetListDeprecated()) {
     const std::string* s = entry.GetIfString();
     if (s)
       results.push_back(*s);
diff --git a/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc b/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc
index 0c197a5..79db121 100644
--- a/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc
+++ b/chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc
@@ -252,7 +252,7 @@
 // static
 bool FamilyInfoFetcher::ParseMembers(const base::ListValue* list,
                                      std::vector<FamilyMember>* members) {
-  for (const auto& entry : list->GetList()) {
+  for (const auto& entry : list->GetListDeprecated()) {
     FamilyMember member;
     const base::DictionaryValue* dict = NULL;
     if (!entry.GetAsDictionary(&dict) || !ParseMember(dict, &member)) {
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index 3afe319f..cf99216 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -177,7 +177,8 @@
 
 }  // namespace
 
-ChromeSyncClient::ChromeSyncClient(Profile* profile) : profile_(profile) {
+ChromeSyncClient::ChromeSyncClient(Profile* profile)
+    : profile_(profile), extensions_activity_monitor_(profile) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   profile_web_data_service_ =
diff --git a/chrome/browser/sync/glue/extensions_activity_monitor.cc b/chrome/browser/sync/glue/extensions_activity_monitor.cc
index 050fe7db..5758d18b 100644
--- a/chrome/browser/sync/glue/extensions_activity_monitor.cc
+++ b/chrome/browser/sync/glue/extensions_activity_monitor.cc
@@ -8,9 +8,8 @@
 #include "content/public/browser/browser_thread.h"
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-#include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/api/bookmarks/bookmarks_api.h"
-#include "content/public/browser/notification_service.h"
+#include "chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h"
 #include "extensions/common/extension.h"
 #endif
 
@@ -18,7 +17,8 @@
 
 namespace browser_sync {
 
-ExtensionsActivityMonitor::ExtensionsActivityMonitor()
+ExtensionsActivityMonitor::ExtensionsActivityMonitor(
+    content::BrowserContext* context)
     : extensions_activity_(new syncer::ExtensionsActivity()) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   // It would be nice if we could specify a Source for each specific function
@@ -27,8 +27,8 @@
   // wanted to use the string name).  Thus, we use all sources and filter in
   // Observe.
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED,
-                 content::NotificationService::AllSources());
+  bookmarks_api_observation_.Observe(
+      extensions::BookmarksApiWatcher::GetForBrowserContext(context));
 #endif
 }
 
@@ -36,21 +36,15 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 }
 
-void ExtensionsActivityMonitor::Observe(
-    int type,
-    const content::NotificationSource& source,
-    const content::NotificationDetails& details) {
 #if BUILDFLAG(ENABLE_EXTENSIONS)
+void ExtensionsActivityMonitor::OnBookmarksApiInvoked(
+    const extensions::Extension* extension,
+    const extensions::BookmarksFunction* func) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED, type);
-  const extensions::Extension* extension =
-      content::Source<const extensions::Extension>(source).ptr();
   if (!extension)
     return;
 
-  const extensions::BookmarksFunction* f =
-      content::Details<const extensions::BookmarksFunction>(details).ptr();
-  switch (f->histogram_value()) {
+  switch (func->histogram_value()) {
     case extensions::functions::BOOKMARKS_UPDATE:
     case extensions::functions::BOOKMARKS_MOVE:
     case extensions::functions::BOOKMARKS_CREATE:
@@ -61,8 +55,8 @@
     default:
       break;
   }
-#endif
 }
+#endif
 
 const scoped_refptr<syncer::ExtensionsActivity>&
 ExtensionsActivityMonitor::GetExtensionsActivity() {
diff --git a/chrome/browser/sync/glue/extensions_activity_monitor.h b/chrome/browser/sync/glue/extensions_activity_monitor.h
index e7a32f9..35ad59c 100644
--- a/chrome/browser/sync/glue/extensions_activity_monitor.h
+++ b/chrome/browser/sync/glue/extensions_activity_monitor.h
@@ -6,20 +6,39 @@
 #define CHROME_BROWSER_SYNC_GLUE_EXTENSIONS_ACTIVITY_MONITOR_H_
 
 #include "base/memory/ref_counted.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
+#include "base/scoped_observation.h"
+#include "content/public/browser/browser_context.h"
 #include "extensions/buildflags/buildflags.h"
 
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h"
+#endif
+
 namespace syncer {
 class ExtensionsActivity;
 }
 
+namespace extensions {
+class BookmarksFunction;
+class Extension;
+}  // namespace extensions
+
 namespace browser_sync {
 
-// Observe and record usage of extension bookmark API.
-class ExtensionsActivityMonitor : public content::NotificationObserver {
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+using BookmarksApiWatcherObserver = extensions::BookmarksApiWatcher::Observer;
+#else
+// Provides a stub class to inherit from to support overriding the destructor.
+class BookmarksApiWatcherObserver {
  public:
-  ExtensionsActivityMonitor();
+  virtual ~BookmarksApiWatcherObserver() {}
+};
+#endif
+
+// Observe and record usage of extension bookmark API.
+class ExtensionsActivityMonitor : public BookmarksApiWatcherObserver {
+ public:
+  explicit ExtensionsActivityMonitor(content::BrowserContext* context);
 
   ExtensionsActivityMonitor(const ExtensionsActivityMonitor&) = delete;
   ExtensionsActivityMonitor& operator=(const ExtensionsActivityMonitor&) =
@@ -27,10 +46,12 @@
 
   ~ExtensionsActivityMonitor() override;
 
-  // content::NotificationObserver implementation.
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  // content::BookmarksApiWatcher:
+  void OnBookmarksApiInvoked(
+      const extensions::Extension* ext,
+      const extensions::BookmarksFunction* func) override;
+#endif
 
   const scoped_refptr<syncer::ExtensionsActivity>& GetExtensionsActivity();
 
@@ -38,8 +59,9 @@
   scoped_refptr<syncer::ExtensionsActivity> extensions_activity_;
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-  // Used only on UI loop.
-  content::NotificationRegistrar registrar_;
+  base::ScopedObservation<extensions::BookmarksApiWatcher,
+                          extensions::BookmarksApiWatcher::Observer>
+      bookmarks_api_observation_{this};
 #endif
 };
 
diff --git a/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc b/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc
index 5772be5..8847501 100644
--- a/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc
+++ b/chrome/browser/sync/glue/extensions_activity_monitor_unittest.cc
@@ -13,7 +13,9 @@
 #include "base/values.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/api/bookmarks/bookmarks_api.h"
+#include "chrome/browser/extensions/api/bookmarks/bookmarks_api_watcher.h"
 #include "chrome/common/chrome_paths.h"
+#include "chrome/test/base/testing_profile.h"
 #include "components/sync/base/extensions_activity.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/test/browser_task_environment.h"
@@ -54,7 +56,8 @@
 // Fire a bookmarks API event from the given extension the given
 // number of times.
 template <class T>
-void FireBookmarksApiEvent(const scoped_refptr<Extension>& extension,
+void FireBookmarksApiEvent(Profile* profile,
+                           const scoped_refptr<Extension>& extension,
                            int repeats) {
   scoped_refptr<extensions::BookmarksFunction> bookmarks_function(new T());
   bookmarks_function->set_histogram_value(T::static_histogram_value());
@@ -63,18 +66,17 @@
   // ignore_did_respond_for_testing() is needed to avoid a DCHECK failure.
   bookmarks_function->ignore_did_respond_for_testing();
   for (int i = 0; i < repeats; i++) {
-    content::NotificationService::current()->Notify(
-        extensions::NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED,
-        content::Source<Extension>(extension.get()),
-        content::Details<const extensions::BookmarksFunction>(
-            bookmarks_function.get()));
+    extensions::BookmarksApiWatcher::GetForBrowserContext(profile)
+        ->NotifyApiInvoked(extension.get(), bookmarks_function.get());
   }
 }
 
 class SyncChromeExtensionsActivityMonitorTest : public testing::Test {
  public:
   SyncChromeExtensionsActivityMonitorTest()
-      : extension1_(MakeExtension("extension1")),
+      : profile_(std::make_unique<TestingProfile>()),
+        monitor_(profile_.get()),
+        extension1_(MakeExtension("extension1")),
         extension2_(MakeExtension("extension2")),
         id1_(extension1_->id()),
         id2_(extension2_->id()) {}
@@ -84,6 +86,7 @@
   content::BrowserTaskEnvironment task_environment_;
 
  protected:
+  std::unique_ptr<TestingProfile> profile_;
   ExtensionsActivityMonitor monitor_;
   scoped_refptr<Extension> extension1_;
   scoped_refptr<Extension> extension2_;
@@ -97,20 +100,26 @@
 // 2.  Only the mutating events should be recorded by the
 // syncer::ExtensionsActivityMonitor.
 TEST_F(SyncChromeExtensionsActivityMonitorTest, Basic) {
-  FireBookmarksApiEvent<extensions::BookmarksRemoveFunction>(extension1_, 1);
-  FireBookmarksApiEvent<extensions::BookmarksMoveFunction>(extension1_, 1);
-  FireBookmarksApiEvent<extensions::BookmarksUpdateFunction>(extension1_, 2);
-  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(extension1_, 3);
-  FireBookmarksApiEvent<extensions::BookmarksSearchFunction>(extension1_, 5);
+  FireBookmarksApiEvent<extensions::BookmarksRemoveFunction>(profile_.get(),
+                                                             extension1_, 1);
+  FireBookmarksApiEvent<extensions::BookmarksMoveFunction>(profile_.get(),
+                                                           extension1_, 1);
+  FireBookmarksApiEvent<extensions::BookmarksUpdateFunction>(profile_.get(),
+                                                             extension1_, 2);
+  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(profile_.get(),
+                                                             extension1_, 3);
+  FireBookmarksApiEvent<extensions::BookmarksSearchFunction>(profile_.get(),
+                                                             extension1_, 5);
   const uint32_t writes_by_extension1 = 1 + 1 + 2 + 3;
 
-  FireBookmarksApiEvent<extensions::BookmarksRemoveTreeFunction>(extension2_,
-                                                                 8);
-  FireBookmarksApiEvent<extensions::BookmarksGetSubTreeFunction>(extension2_,
-                                                                 13);
-  FireBookmarksApiEvent<extensions::BookmarksGetChildrenFunction>(extension2_,
-                                                                  21);
-  FireBookmarksApiEvent<extensions::BookmarksGetTreeFunction>(extension2_, 33);
+  FireBookmarksApiEvent<extensions::BookmarksRemoveTreeFunction>(
+      profile_.get(), extension2_, 8);
+  FireBookmarksApiEvent<extensions::BookmarksGetSubTreeFunction>(
+      profile_.get(), extension2_, 13);
+  FireBookmarksApiEvent<extensions::BookmarksGetChildrenFunction>(
+      profile_.get(), extension2_, 21);
+  FireBookmarksApiEvent<extensions::BookmarksGetTreeFunction>(profile_.get(),
+                                                              extension2_, 33);
   const uint32_t writes_by_extension2 = 8;
 
   syncer::ExtensionsActivity::Records results;
@@ -128,8 +137,10 @@
 // and put the old records back.  Those should be merged with the new
 // records correctly.
 TEST_F(SyncChromeExtensionsActivityMonitorTest, Put) {
-  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(extension1_, 5);
-  FireBookmarksApiEvent<extensions::BookmarksMoveFunction>(extension2_, 8);
+  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(profile_.get(),
+                                                             extension1_, 5);
+  FireBookmarksApiEvent<extensions::BookmarksMoveFunction>(profile_.get(),
+                                                           extension2_, 8);
 
   syncer::ExtensionsActivity::Records results;
   monitor_.GetExtensionsActivity()->GetAndClearRecords(&results);
@@ -138,8 +149,10 @@
   EXPECT_EQ(5U, results[id1_].bookmark_write_count);
   EXPECT_EQ(8U, results[id2_].bookmark_write_count);
 
-  FireBookmarksApiEvent<extensions::BookmarksGetTreeFunction>(extension2_, 3);
-  FireBookmarksApiEvent<extensions::BookmarksUpdateFunction>(extension2_, 2);
+  FireBookmarksApiEvent<extensions::BookmarksGetTreeFunction>(profile_.get(),
+                                                              extension2_, 3);
+  FireBookmarksApiEvent<extensions::BookmarksUpdateFunction>(profile_.get(),
+                                                             extension2_, 2);
 
   // Simulate a commit failure, which augments the active record set with the
   // refugee records.
@@ -158,7 +171,8 @@
 // times.  The mintor should correctly clear its records every time
 // they're returned.
 TEST_F(SyncChromeExtensionsActivityMonitorTest, MultiGet) {
-  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(extension1_, 5);
+  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(profile_.get(),
+                                                             extension1_, 5);
 
   syncer::ExtensionsActivity::Records results;
   monitor_.GetExtensionsActivity()->GetAndClearRecords(&results);
@@ -169,7 +183,8 @@
   monitor_.GetExtensionsActivity()->GetAndClearRecords(&results);
   EXPECT_TRUE(results.empty());
 
-  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(extension1_, 3);
+  FireBookmarksApiEvent<extensions::BookmarksCreateFunction>(profile_.get(),
+                                                             extension1_, 3);
   monitor_.GetExtensionsActivity()->GetAndClearRecords(&results);
 
   EXPECT_EQ(1U, results.size());
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
index bdde0b3..0cb4763 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
@@ -1161,10 +1161,10 @@
 
   std::unique_ptr<base::ListValue> files =
       metadata_database()->DumpFiles(app_root.tracker.app_id());
-  ASSERT_EQ(2u, files->GetList().size());
+  ASSERT_EQ(2u, files->GetListDeprecated().size());
 
   const std::string* str;
-  const base::Value& folder = files->GetList()[0];
+  const base::Value& folder = files->GetListDeprecated()[0];
   ASSERT_TRUE(folder.is_dict());
   str = folder.FindStringKey("title");
   EXPECT_TRUE(str && *str == "folder_0");
@@ -1172,7 +1172,7 @@
   EXPECT_TRUE(str && *str == "folder");
   EXPECT_TRUE(folder.FindKey("details"));
 
-  const base::Value& file = files->GetList()[1];
+  const base::Value& file = files->GetListDeprecated()[1];
   ASSERT_TRUE(file.is_dict());
   str = file.FindStringKey("title");
   EXPECT_TRUE(str && *str == "file_0");
diff --git a/chrome/browser/sync_file_system/sync_file_system_service.cc b/chrome/browser/sync_file_system/sync_file_system_service.cc
index fdbc3aae..d640c0e 100644
--- a/chrome/browser/sync_file_system/sync_file_system_service.cc
+++ b/chrome/browser/sync_file_system/sync_file_system_service.cc
@@ -123,8 +123,8 @@
     file->SetString("status", SyncFileStatusToString(sync_file_status));
 
   // Once all results have been received, run the callback to signal end.
-  DCHECK_LE(*num_results, files->GetList().size());
-  if (++*num_results < files->GetList().size())
+  DCHECK_LE(*num_results, files->GetListDeprecated().size());
+  if (++*num_results < files->GetListDeprecated().size())
     return;
 
   // `callback` is a DumpFilesCallback, which should only be called
@@ -557,8 +557,8 @@
     const GURL& origin,
     DumpFilesCallback callback,
     std::unique_ptr<base::ListValue> dump_files) {
-  if (!dump_files || !dump_files->GetList().size() || !local_service_ ||
-      !remote_service_) {
+  if (!dump_files || !dump_files->GetListDeprecated().size() ||
+      !local_service_ || !remote_service_) {
     std::move(callback).Run(base::ListValue());
     return;
   }
@@ -575,7 +575,7 @@
       base::OwnedRef(std::move(callback)));
 
   // After all metadata loaded, sync status can be added to each entry.
-  for (base::Value& file : files->GetList()) {
+  for (base::Value& file : files->GetListDeprecated()) {
     const std::string* path_string =
       file.is_dict() ? file.FindStringKey("path") : nullptr;
     if (!path_string) {
diff --git a/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc b/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc
index e47f0d0b..a93859d3 100644
--- a/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc
+++ b/chrome/browser/tab_contents/navigation_metrics_recorder_browsertest.cc
@@ -12,16 +12,12 @@
 #include "components/navigation_metrics/navigation_metrics.h"
 #include "components/site_engagement/content/site_engagement_score.h"
 #include "components/site_engagement/content/site_engagement_service.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/prerender_test_util.h"
 #include "content/public/test/test_navigation_observer.h"
 #include "net/dns/mock_host_resolver.h"
-#include "ui/events/keycodes/dom/keycode_converter.h"
-#include "ui/events/keycodes/keyboard_code_conversion.h"
 
 namespace {
 
@@ -30,20 +26,6 @@
 // A site engagement score that falls into the range for HIGH engagement level.
 const int kHighEngagementScore = 50;
 
-// Types a character in the given web content.
-void TypeText(content::WebContents* web_contents) {
-  content::DOMMessageQueue msg_queue;
-  const std::string code_string = "KeyA";
-  std::string reply;
-  ui::DomKey dom_key = ui::KeycodeConverter::KeyStringToDomKey(code_string);
-  ui::DomCode dom_code = ui::KeycodeConverter::CodeStringToDomCode(code_string);
-  SimulateKeyPress(web_contents, dom_key, dom_code,
-                   ui::DomCodeToUsLayoutKeyboardCode(dom_code), false, false,
-                   false, false);
-  ASSERT_TRUE(msg_queue.WaitForMessage(&reply));
-  ASSERT_EQ("\"entry\"", reply);
-}
-
 IN_PROC_BROWSER_TEST_F(NavigationMetricsRecorderBrowserTest, TestMetrics) {
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
@@ -125,60 +107,6 @@
       blink::mojom::EngagementLevel::HIGH, 1);
 }
 
-IN_PROC_BROWSER_TEST_F(NavigationMetricsRecorderBrowserTest,
-                       PasswordEntry_EngagementLevel) {
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-
-  ASSERT_TRUE(embedded_test_server()->Start());
-  const GURL url(
-      embedded_test_server()->GetURL("/password/password_form.html"));
-  site_engagement::SiteEngagementService::Get(browser()->profile())
-      ->ResetBaseScoreForURL(url, kHighEngagementScore);
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), url));
-
-  // Submit a form and check the histograms. Before doing so, we set a high site
-  // engagement score so that a single form submission doesn't affect the score
-  // much.
-  site_engagement::SiteEngagementService::Get(browser()->profile())
-      ->ResetBaseScoreForURL(url, kHighEngagementScore);
-
-  // Setup handlers:
-  const char* const kScript =
-      "var f = document.getElementById('password_field');"
-      "f.onfocus = function() { "
-      "  setTimeout(function() { window.domAutomationController.send('focus'); "
-      "}, "
-      "0);};"
-      "f.onkeyup = function() { "
-      "  setTimeout(function() { window.domAutomationController.send('entry'); "
-      "}, "
-      "0);};"
-      "window.domAutomationController.send('setup');";
-  std::string reply1;
-  EXPECT_TRUE(
-      content::ExecuteScriptAndExtractString(web_contents, kScript, &reply1));
-  EXPECT_EQ("setup", reply1);
-
-  base::HistogramTester histograms;
-  std::string reply;
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      web_contents, "document.getElementById('password_field').focus()",
-      &reply));
-  EXPECT_EQ("focus", reply);
-  TypeText(web_contents);
-  // Navigate away to flush the metrics.
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL("about:blank")));
-
-  histograms.ExpectTotalCount("Security.PasswordFocus.SiteEngagementLevel", 1);
-  histograms.ExpectBucketCount("Security.PasswordFocus.SiteEngagementLevel",
-                               blink::mojom::EngagementLevel::HIGH, 1);
-
-  histograms.ExpectTotalCount("Security.PasswordEntry.SiteEngagementLevel", 1);
-  histograms.ExpectBucketCount("Security.PasswordEntry.SiteEngagementLevel",
-                               blink::mojom::EngagementLevel::HIGH, 1);
-}
-
 class NavigationMetricsRecorderPrerenderBrowserTest
     : public NavigationMetricsRecorderBrowserTest {
  public:
diff --git a/chrome/browser/tracing/chrome_tracing_delegate.cc b/chrome/browser/tracing/chrome_tracing_delegate.cc
index e8a2fdd..673ba93 100644
--- a/chrome/browser/tracing/chrome_tracing_delegate.cc
+++ b/chrome/browser/tracing/chrome_tracing_delegate.cc
@@ -170,7 +170,7 @@
 
   const base::Value* upload_times = dict->FindListKey(kUploadTimesKey);
   if (upload_times) {
-    for (const auto& scenario_dict : upload_times->GetList()) {
+    for (const auto& scenario_dict : upload_times->GetListDeprecated()) {
       DCHECK(scenario_dict.is_dict());
       const std::string* scenario = scenario_dict.FindStringKey(kScenarioKey);
       const base::Value* timestamp_val =
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 51337f4..d8a7080c 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3831,7 +3831,7 @@
     }
   }
 
-  if (is_win || is_mac || is_linux) {
+  if (is_win || is_mac || is_linux || is_fuchsia) {
     sources += [
       "webui/app_settings/web_app_settings_navigation_throttle.cc",
       "webui/app_settings/web_app_settings_navigation_throttle.h",
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn
index cc52e39..c540569 100644
--- a/chrome/browser/ui/android/omnibox/BUILD.gn
+++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -138,6 +138,7 @@
     ":java_resources",
     "//base:base_java",
     "//chrome/browser/android/lifecycle:java",
+    "//chrome/browser/browser_controls/android:java",
     "//chrome/browser/commerce/merchant_viewer/android:java",
     "//chrome/browser/device:java",
     "//chrome/browser/feature_engagement:java",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
index 3b837d4..843d5a4 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -21,6 +21,7 @@
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.OneshotSupplierImpl;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.lens.LensController;
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.NativeInitObserver;
@@ -161,7 +162,8 @@
             @Nullable UserEducationHelper userEducationHelper,
             @Nullable Supplier<MerchantTrustSignalsCoordinator>
                     merchantTrustSignalsCoordinatorSupplier,
-            @NonNull OmniboxPedalDelegate omniboxPedalDelegate) {
+            @NonNull OmniboxPedalDelegate omniboxPedalDelegate,
+            BrowserStateBrowserControlsVisibilityDelegate browserControlsVisibilityDelegate) {
         mLocationBarLayout = (LocationBarLayout) locationBarLayout;
         mWindowDelegate = windowDelegate;
         mWindowAndroid = windowAndroid;
@@ -192,10 +194,10 @@
                 exploreIconProvider, omniboxPedalDelegate);
         StatusView statusView = mLocationBarLayout.findViewById(R.id.location_bar_status);
         mStatusCoordinator = new StatusCoordinator(isTablet(), statusView, mUrlCoordinator,
-                incognitoStateProvider, modalDialogManagerSupplier, locationBarDataProvider,
-                mTemplateUrlServiceSupplier, searchEngineLogoUtils, profileObservableSupplier,
-                windowAndroid, pageInfoAction, userEducationHelper,
-                merchantTrustSignalsCoordinatorSupplier);
+                modalDialogManagerSupplier, locationBarDataProvider, mTemplateUrlServiceSupplier,
+                searchEngineLogoUtils, profileObservableSupplier, windowAndroid, pageInfoAction,
+                userEducationHelper, merchantTrustSignalsCoordinatorSupplier,
+                browserControlsVisibilityDelegate);
         mLocationBarMediator.setCoordinators(
                 mUrlCoordinator, mAutocompleteCoordinator, mStatusCoordinator);
 
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java
index 9d807ef..f66ad46 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusCoordinator.java
@@ -15,6 +15,7 @@
 import org.chromium.base.FeatureList;
 import org.chromium.base.supplier.OneshotSupplier;
 import org.chromium.base.supplier.Supplier;
+import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.merchant_viewer.MerchantTrustSignalsCoordinator;
 import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
@@ -25,7 +26,6 @@
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tabmodel.IncognitoStateProvider;
 import org.chromium.chrome.browser.ui.theme.BrandedColorScheme;
 import org.chromium.chrome.browser.user_education.IPHCommandBuilder;
 import org.chromium.chrome.browser.user_education.UserEducationHelper;
@@ -73,7 +73,6 @@
      * @param isTablet Whether the UI is shown on a tablet.
      * @param statusView The status view, used to supply and manipulate child views.
      * @param urlBarEditingTextStateProvider The url coordinator.
-     * @param incognitoStateProvider Provider of incognito-ness for the active TabModel.
      * @param modalDialogManagerSupplier A supplier for {@link ModalDialogManager} used to display a
      *         dialog.
      * @param templateUrlServiceSupplier A supplier for {@link TemplateUrlService} used to query
@@ -86,10 +85,11 @@
      * @param merchantTrustSignalsCoordinatorSupplier Supplier of {@link
      *         MerchantTrustSignalsCoordinator}. Can be null if a store icon shouldn't be shown,
      *         such as when called from a search activity.
+     * @param browserControlsVisibilityDelegate Delegate interface allowing control of the
+     *         visibility of the browser controls (i.e. toolbar).
      */
     public StatusCoordinator(boolean isTablet, StatusView statusView,
             UrlBarEditingTextStateProvider urlBarEditingTextStateProvider,
-            IncognitoStateProvider incognitoStateProvider,
             Supplier<ModalDialogManager> modalDialogManagerSupplier,
             LocationBarDataProvider locationBarDataProvider,
             OneshotSupplier<TemplateUrlService> templateUrlServiceSupplier,
@@ -97,7 +97,8 @@
             WindowAndroid windowAndroid, PageInfoAction pageInfoAction,
             UserEducationHelper userEducationHelper,
             @Nullable Supplier<MerchantTrustSignalsCoordinator>
-                    merchantTrustSignalsCoordinatorSupplier) {
+                    merchantTrustSignalsCoordinatorSupplier,
+            BrowserStateBrowserControlsVisibilityDelegate browserControlsVisibilityDelegate) {
         mIsTablet = isTablet;
         mStatusView = statusView;
         mModalDialogManagerSupplier = modalDialogManagerSupplier;
@@ -131,14 +132,13 @@
         mMediator.setVerboseStatusTextMinWidth(
                 res.getDimensionPixelSize(R.dimen.location_bar_min_verbose_status_text_width));
 
-        mStatusView.setLocationBarDataProvider(mLocationBarDataProvider);
-        mStatusView.setSearchEngineLogoUtils(searchEngineLogoUtils);
         // Update status immediately after receiving the data provider to avoid initial presence
         // glitch on tablet devices. This glitch would be typically seen upon launch of app, right
         // before the landing page is presented to the user.
         updateStatusIcon();
         updateVerboseStatusVisibility();
         mLocationBarDataProvider.addObserver(this);
+        mStatusView.setBrowserControlsVisibilityDelegate(browserControlsVisibilityDelegate);
     }
 
     /** Signals that native initialization has completed. */
@@ -359,4 +359,9 @@
         mLocationBarDataProvider.removeObserver(this);
         mLocationBarDataProvider = null;
     }
+
+    /** Returns whether the status view is currently in the process of animating a change. */
+    public boolean isStatusIconAnimating() {
+        return mStatusView.isStatusIconAnimating();
+    }
 }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
index e0a9822..13ebf54 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
@@ -5,10 +5,12 @@
 package org.chromium.chrome.browser.omnibox.status;
 
 import android.content.Context;
+import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.graphics.drawable.RotateDrawable;
 import android.graphics.drawable.TransitionDrawable;
+import android.os.SystemClock;
 import android.util.AttributeSet;
 import android.view.TouchDelegate;
 import android.view.View;
@@ -26,11 +28,11 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 
-import org.chromium.chrome.browser.omnibox.LocationBarDataProvider;
+import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.omnibox.R;
-import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils;
 import org.chromium.components.browser_ui.widget.CompositeTouchDelegate;
 import org.chromium.components.browser_ui.widget.animation.Interpolators;
+import org.chromium.ui.util.TokenHolder;
 import org.chromium.ui.widget.Toast;
 
 import java.lang.annotation.Retention;
@@ -62,6 +64,7 @@
     private boolean mAnimationsEnabled;
     private boolean mAnimatingStatusIconShow;
     private boolean mAnimatingStatusIconHide;
+    private boolean mIsAnimatingStatusIconChange;
 
     private @StringRes int mAccessibilityToast;
     private @StringRes int mAccessibilityDoubleTapDescription;
@@ -74,8 +77,11 @@
     private boolean mLastTouchDelegateRtlness;
     private Rect mLastTouchDelegateRect;
 
-    private LocationBarDataProvider mLocationBarDataProvider;
-    private SearchEngineLogoUtils mSearchEngineLogoUtils;
+    private int mCurrentTransitionDuration;
+    private long mTimeAtTransitionStartMs;
+
+    private BrowserStateBrowserControlsVisibilityDelegate mBrowserControlsVisibilityDelegate;
+    private int mShowBrowserControlsToken = TokenHolder.INVALID_TOKEN;
 
     public StatusView(Context context, AttributeSet attributes) {
         super(context, attributes);
@@ -93,14 +99,6 @@
         configureAccessibilityDescriptions();
     }
 
-    void setLocationBarDataProvider(LocationBarDataProvider toolbarCommonPropertiesModel) {
-        mLocationBarDataProvider = toolbarCommonPropertiesModel;
-    }
-
-    void setSearchEngineLogoUtils(SearchEngineLogoUtils searchEngineLogoUtils) {
-        mSearchEngineLogoUtils = searchEngineLogoUtils;
-    }
-
     /**
      * @return Whether search engine status icon is visible.
      */
@@ -121,7 +119,8 @@
     /**
      * Start animating transition of status icon.
      * @param transitionType The animation transition type for the icon.
-     * @param animationFinishedCallback The callback to be run after the status icon has been
+     * @param animationFinishedCallback The callback to be run after the status icon has
+     *         been
      *                                  successfully set.
      */
     private void animateStatusIcon(
@@ -155,14 +154,15 @@
             // Action 1: animate showing, if icon was either hidden or hiding.
             if (mAnimatingStatusIconHide) mIconView.animate().cancel();
             mAnimatingStatusIconHide = false;
-
             mAnimatingStatusIconShow = true;
+            keepControlsShownForAnimation();
             mIconView.setVisibility(View.VISIBLE);
             mIconView.animate()
                     .alpha(1.0f)
                     .setDuration(ICON_ANIMATION_DURATION_MS)
                     .withEndAction(() -> {
                         mAnimatingStatusIconShow = false;
+                        allowBrowserControlsHide();
                         // Wait until the icon is visible so the bounds will be properly set.
                         updateTouchDelegate();
                     })
@@ -171,8 +171,8 @@
             // Action 2: animate hiding, if icon was either shown or showing.
             if (mAnimatingStatusIconShow) mIconView.animate().cancel();
             mAnimatingStatusIconShow = false;
-
             mAnimatingStatusIconHide = true;
+            keepControlsShownForAnimation();
             // Do not animate phase-out when animations are disabled.
             // While this looks nice in some cases (navigating to insecure sites),
             // it has a side-effect of briefly showing padlock (phase-out) when navigating
@@ -184,6 +184,7 @@
                     .withEndAction(() -> {
                         mIconView.setVisibility(View.GONE);
                         mAnimatingStatusIconHide = false;
+                        allowBrowserControlsHide();
                         updateTouchDelegate();
                     })
                     .start();
@@ -211,8 +212,17 @@
                 newImage.setCrossFadeEnabled(true);
 
                 if (transitionType == IconTransitionType.CROSSFADE) {
-                    newImage.startTransition(mAnimationsEnabled ? ICON_ANIMATION_DURATION_MS : 0);
+                    mIsAnimatingStatusIconChange = true;
+                    mCurrentTransitionDuration =
+                            mAnimationsEnabled ? ICON_ANIMATION_DURATION_MS : 0;
+                    if (mCurrentTransitionDuration > 0) {
+                        keepControlsShownForAnimation();
+                    }
+                    mTimeAtTransitionStartMs = SystemClock.uptimeMillis();
+                    newImage.startTransition(mCurrentTransitionDuration);
                 } else {
+                    mIsAnimatingStatusIconChange = true;
+                    keepControlsShownForAnimation();
                     mIconView.animate()
                             .setDuration(ICON_ROTATION_DURATION_MS)
                             .rotationBy(ICON_ROTATION_DEGREES)
@@ -220,6 +230,8 @@
                             .withStartAction(
                                     () -> { newImage.startTransition(ICON_ANIMATION_DURATION_MS); })
                             .withEndAction(() -> {
+                                mIsAnimatingStatusIconChange = false;
+                                allowBrowserControlsHide();
                                 mIconView.setRotation(0);
                                 // Only update status icon if it is still the current icon.
                                 if (mStatusIconDrawable == targetIcon) {
@@ -402,6 +414,11 @@
         updateTouchDelegate();
     }
 
+    void setBrowserControlsVisibilityDelegate(
+            BrowserStateBrowserControlsVisibilityDelegate browserControlsVisibilityDelegate) {
+        mBrowserControlsVisibilityDelegate = browserControlsVisibilityDelegate;
+    }
+
     private void initializeIncognitoBadge() {
         ViewStub viewStub = findViewById(R.id.location_bar_incognito_badge_stub);
         mIncognitoBadge = viewStub.inflate();
@@ -479,12 +496,48 @@
         return lp.getMarginStart() + getMeasuredWidth() + lp.getMarginEnd();
     }
 
+    boolean isStatusIconAnimating() {
+        return mAnimatingStatusIconShow || mAnimatingStatusIconHide || mIsAnimatingStatusIconChange;
+    }
+
     /** @return True if the status icon is currently visible. */
     private boolean isIconVisible() {
         return mStatusIconDrawable != null && mIconView.getVisibility() != GONE
                 && mIconView.getAlpha() != 0;
     }
 
+    private void keepControlsShownForAnimation() {
+        // isShown() being false implies that the status view isn't visible. We don't want to force
+        // it back into visibility just so that we can show an animation.
+        if (isShown() && mBrowserControlsVisibilityDelegate != null) {
+            mShowBrowserControlsToken =
+                    mBrowserControlsVisibilityDelegate.showControlsPersistentAndClearOldToken(
+                            mShowBrowserControlsToken);
+        }
+    }
+
+    private void allowBrowserControlsHide() {
+        if (mBrowserControlsVisibilityDelegate != null) {
+            mBrowserControlsVisibilityDelegate.releasePersistentShowingToken(
+                    mShowBrowserControlsToken);
+            mShowBrowserControlsToken = TokenHolder.INVALID_TOKEN;
+        }
+    }
+
+    @Override
+    protected void dispatchDraw(Canvas canvas) {
+        super.dispatchDraw(canvas);
+
+        long currentTimeMs = SystemClock.uptimeMillis();
+        if (mIsAnimatingStatusIconChange
+                && currentTimeMs - mTimeAtTransitionStartMs >= mCurrentTransitionDuration) {
+            mTimeAtTransitionStartMs = 0;
+            mCurrentTransitionDuration = 0;
+            mIsAnimatingStatusIconChange = false;
+            allowBrowserControlsHide();
+        }
+    }
+
     TouchDelegate getTouchDelegateForTesting() {
         return mTouchDelegate;
     }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
index e1e7a6f9..7e66e57 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -29,7 +29,6 @@
 import org.chromium.chrome.browser.omnibox.OmniboxSuggestionType;
 import org.chromium.chrome.browser.omnibox.R;
 import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
-import org.chromium.chrome.browser.omnibox.action.OmniboxPedalType;
 import org.chromium.chrome.browser.omnibox.suggestions.AutocompleteController.OnSuggestionsReceivedListener;
 import org.chromium.chrome.browser.omnibox.suggestions.SuggestionsMetrics.RefineActionUsage;
 import org.chromium.chrome.browser.omnibox.suggestions.basic.BasicSuggestionProcessor.BookmarkState;
@@ -86,7 +85,6 @@
     private final @NonNull Callback<Tab> mBringTabToFrontCallback;
     private final @NonNull Supplier<TabWindowManager> mTabWindowManagerSupplier;
     private final @NonNull JankTracker mJankTracker;
-    private final @NonNull OmniboxPedalDelegate mOmniboxPedalDelegate;
 
     private @NonNull AutocompleteResult mAutocompleteResult = AutocompleteResult.EMPTY_RESULT;
     private @Nullable Runnable mCurrentAutocompleteRequest;
@@ -168,10 +166,9 @@
         mTabWindowManagerSupplier = tabWindowManagerSupplier;
         mSuggestionModels = mListPropertyModel.get(SuggestionListProperties.SUGGESTION_MODELS);
         mDropdownViewInfoListBuilder = new DropdownItemViewInfoListBuilder(
-                activityTabSupplier, bookmarkState, exploreIconProvider);
+                activityTabSupplier, bookmarkState, exploreIconProvider, omniboxPedalDelegate);
         mDropdownViewInfoListBuilder.setShareDelegateSupplier(shareDelegateSupplier);
         mDropdownViewInfoListManager = new DropdownItemViewInfoListManager(mSuggestionModels);
-        mOmniboxPedalDelegate = omniboxPedalDelegate;
     }
 
     /**
@@ -455,11 +452,6 @@
     }
 
     @Override
-    public void onPedalClicked(@OmniboxPedalType int omniboxPedalType) {
-        mOmniboxPedalDelegate.executeAction(omniboxPedalType);
-    }
-
-    @Override
     public void onGesture(boolean isGestureUp, long timestamp) {
         stopAutocomplete(false);
         if (isGestureUp) {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java
index 46981e7..2305facf 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java
@@ -51,6 +51,7 @@
 
     private final @NonNull List<SuggestionProcessor> mPriorityOrderedSuggestionProcessors;
     private final @NonNull Supplier<Tab> mActivityTabSupplier;
+    private final @NonNull OmniboxPedalDelegate mOmniboxPedalDelegate;
 
     private @Nullable HeaderProcessor mHeaderProcessor;
     private @Nullable Supplier<ShareDelegate> mShareDelegateSupplier;
@@ -63,12 +64,14 @@
     private boolean mBuiltListHasFullyConcealedElements;
 
     DropdownItemViewInfoListBuilder(@NonNull Supplier<Tab> tabSupplier, BookmarkState bookmarkState,
-            @NonNull ExploreIconProvider exploreIconProvider) {
+            @NonNull ExploreIconProvider exploreIconProvider,
+            @NonNull OmniboxPedalDelegate omniboxPedalDelegate) {
         mPriorityOrderedSuggestionProcessors = new ArrayList<>();
         mDropdownHeight = DROPDOWN_HEIGHT_UNKNOWN;
         mActivityTabSupplier = tabSupplier;
         mBookmarkState = bookmarkState;
         mExploreIconProvider = exploreIconProvider;
+        mOmniboxPedalDelegate = omniboxPedalDelegate;
     }
 
     /**
@@ -100,8 +103,8 @@
         registerSuggestionProcessor(new TailSuggestionProcessor(context, host));
         registerSuggestionProcessor(new MostVisitedTilesProcessor(context, host, iconBridgeSupplier,
                 mExploreIconProvider, GlobalDiscardableReferencePool.getReferencePool()));
-        registerSuggestionProcessor(new PedalSuggestionProcessor(
-                context, host, textProvider, iconBridgeSupplier, mBookmarkState));
+        registerSuggestionProcessor(new PedalSuggestionProcessor(context, host, textProvider,
+                iconBridgeSupplier, mBookmarkState, mOmniboxPedalDelegate));
         registerSuggestionProcessor(new BasicSuggestionProcessor(
                 context, host, textProvider, iconBridgeSupplier, mBookmarkState));
     }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalDelegate.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalDelegate.java
index 2252097..39ef41a 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalDelegate.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalDelegate.java
@@ -4,10 +4,12 @@
 
 package org.chromium.chrome.browser.omnibox.suggestions;
 
+import androidx.annotation.DrawableRes;
+
 import org.chromium.chrome.browser.omnibox.action.OmniboxPedalType;
 
 /**
- * An interface for handling click event on Omnibox Pedals.
+ * An interface for handling interactions for Omnibox Pedals.
  */
 public interface OmniboxPedalDelegate {
     /**
@@ -16,4 +18,13 @@
      * @param omniboxActionType the {@link OmniboxActionType} related to the clicked pedal.
      */
     void executeAction(@OmniboxPedalType int omniboxActionType);
+
+    /**
+     * Call this method when request the pedal's icon.
+     *
+     * @param omniboxActionType the {@link OmniboxActionType} for the request pedal.
+     * @return The icon's resource id.
+     */
+    @DrawableRes
+    int getPedalIcon(@OmniboxPedalType int omniboxActionType);
 }
\ No newline at end of file
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHost.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHost.java
index 6569e4b4..a030ed66 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHost.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHost.java
@@ -6,7 +6,6 @@
 
 import androidx.annotation.NonNull;
 
-import org.chromium.chrome.browser.omnibox.action.OmniboxPedalType;
 import org.chromium.components.omnibox.AutocompleteMatch;
 import org.chromium.url.GURL;
 
@@ -46,13 +45,6 @@
     void onSwitchToTab(@NonNull AutocompleteMatch suggestion, int position);
 
     /**
-     * Triggered when the user selects a pedal.
-     *
-     * @param omniboxPedalType The type of the clicked pedal.
-     */
-    void onPedalClicked(@OmniboxPedalType int omniboxPedalType);
-
-    /**
      * Toggle expanded state of suggestion items belonging to specific group.
      *
      * @param groupId ID of Suggestion Group whose visibility changed.
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionProcessor.java
index 4fbdaf4..353bae25 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionProcessor.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/pedal/PedalSuggestionProcessor.java
@@ -11,8 +11,8 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.supplier.Supplier;
-import org.chromium.chrome.browser.omnibox.R;
 import org.chromium.chrome.browser.omnibox.UrlBarEditingTextStateProvider;
+import org.chromium.chrome.browser.omnibox.suggestions.OmniboxPedalDelegate;
 import org.chromium.chrome.browser.omnibox.suggestions.OmniboxSuggestionUiType;
 import org.chromium.chrome.browser.omnibox.suggestions.SuggestionHost;
 import org.chromium.chrome.browser.omnibox.suggestions.basic.BasicSuggestionProcessor;
@@ -25,19 +25,24 @@
  * A class that handles model and view creation for the pedal omnibox suggestion.
  */
 public class PedalSuggestionProcessor extends BasicSuggestionProcessor {
-    private final SuggestionHost mSuggestionHost;
+    private final @NonNull OmniboxPedalDelegate mOmniboxPedalDelegate;
 
     /**
      * @param context An Android context.
      * @param suggestionHost A handle to the object using the suggestions.
+     * @param editingTextProvider A means of accessing the text in the omnibox.
+     * @param iconBridgeSupplier A means of accessing the large icon bridge.
+     * @param bookmarkBridgeSupplier A means of accessing the bookmark information.
+     * @param omniboxPedalDelegate A delegate that will responsible for pedals.
      */
     public PedalSuggestionProcessor(@NonNull Context context,
             @NonNull SuggestionHost suggestionHost,
             @NonNull UrlBarEditingTextStateProvider editingTextProvider,
             @NonNull Supplier<LargeIconBridge> iconBridgeSupplier,
-            @NonNull BookmarkState bookmarkState) {
+            @NonNull BookmarkState bookmarkState,
+            @NonNull OmniboxPedalDelegate omniboxPedalDelegate) {
         super(context, suggestionHost, editingTextProvider, iconBridgeSupplier, bookmarkState);
-        mSuggestionHost = suggestionHost;
+        mOmniboxPedalDelegate = omniboxPedalDelegate;
     }
 
     @Override
@@ -71,7 +76,7 @@
         model.set(PedalSuggestionViewProperties.PEDAL, omniboxPedal);
         model.set(PedalSuggestionViewProperties.PEDAL_ICON, getPedalIcon(omniboxPedal));
         model.set(PedalSuggestionViewProperties.ON_PEDAL_CLICK,
-                v -> mSuggestionHost.onPedalClicked(omniboxPedal.getID()));
+                v -> mOmniboxPedalDelegate.executeAction(omniboxPedal.getID()));
     }
 
     /**
@@ -82,6 +87,6 @@
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
     @DrawableRes
     int getPedalIcon(@NonNull OmniboxPedal omniboxPedal) {
-        return R.drawable.ic_google_round;
+        return mOmniboxPedalDelegate.getPedalIcon(omniboxPedal.getID());
     }
 }
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index f2768ab4..ec766231f 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -536,6 +536,15 @@
       <message name="IDS_AUTOFILL_PAYMENTS_AUTHENTICATOR_SELECTION_DIALOG_NEGATIVE_BUTTON_LABEL" desc="Negative button label for the dialog where the user selects an authenticator from a list of options.">
         Cancel
       </message>
+      <message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_TITLE" desc="Title for the dialog where the user confirms that they wish to unenroll a card from Virtual Cards.">
+        Remove your virtual card?
+      </message>
+      <message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_MESSAGE" desc="Message for the dialog where the user confirms that they wish to unenroll a card from Virtual Cards.">
+        You’ll no longer be able to use your virtual card with Google Pay. <ph name="BEGIN_LINK1">&lt;link1&gt;</ph>Learn more about virtual cards<ph name="END_LINK1">&lt;/link1&gt;</ph>
+      </message>
+      <message name="IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_POSITIVE_BUTTON_LABEL" desc="Positive button label for the dialog where the user confirms that they wish to unenroll a card from Virtual Cards.">
+        Remove
+      </message>
 
        <!-- Payment Request section preview strings -->
        <message name="IDS_PAYMENT_REQUEST_PAYMENT_METHODS_PREVIEW" desc="This is a snippet of a payment method a user has saved to Chrome, plus an indication of the number of additional payment methods the user has saved.
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_MESSAGE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_MESSAGE.png.sha1
new file mode 100644
index 0000000..b22c2e9e
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_MESSAGE.png.sha1
@@ -0,0 +1 @@
+e33f3f4812921de66363db825e44e81603a899bf
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_POSITIVE_BUTTON_LABEL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_POSITIVE_BUTTON_LABEL.png.sha1
new file mode 100644
index 0000000..b22c2e9e
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_POSITIVE_BUTTON_LABEL.png.sha1
@@ -0,0 +1 @@
+e33f3f4812921de66363db825e44e81603a899bf
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_TITLE.png.sha1
new file mode 100644
index 0000000..b22c2e9e
--- /dev/null
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_AUTOFILL_CREDIT_CARD_EDITOR_VIRTUAL_CARD_UNENROLL_DIALOG_TITLE.png.sha1
@@ -0,0 +1 @@
+e33f3f4812921de66363db825e44e81603a899bf
\ No newline at end of file
diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn
index b609aaf..732a7b6 100644
--- a/chrome/browser/ui/android/toolbar/BUILD.gn
+++ b/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -87,6 +87,7 @@
     "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarControlContainer.java",
     "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java",
     "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java",
+    "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarSnapshotState.java",
     "java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java",
     "java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java",
     "java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java
index 10a48f2..ca0e5287 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabCountProvider.java
@@ -50,7 +50,12 @@
     private boolean mIsIncognito;
 
     TabCountProvider() {
-        mTabCountObservers = new ObserverList<TabCountObserver>();
+        mTabCountObservers = new ObserverList<>();
+    }
+
+    /** Gets the current count of tabs. */
+    public int getTabCount() {
+        return mTabCount;
     }
 
     /**
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
index d3991dc0..947cf18 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
@@ -67,4 +67,14 @@
      * @return Whether the current primary color is a brand color.
      */
     boolean isUsingBrandColor();
+
+    /**
+     * Returns the resource ID of the icon that should be displayed or 0 if no icon should be shown.
+     *
+     * @param isTablet Whether or not the display context of the icon is a tablet.
+     */
+    int getSecurityIconResource(boolean isTablet);
+
+    /** Returns whether the page currently shown is a paint preview. */
+    boolean isPaintPreview();
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java
index de7646d..61da98e2 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonCoordinator.java
@@ -238,4 +238,9 @@
         return mMediator.getUrlFocusingAnimator(isFocusingUrl,
                 mMenuButton != null && mMenuButton.getLayoutDirection() == LAYOUT_DIRECTION_RTL);
     }
+
+    /** Returns whether the menu button is currently showing an update badge. */
+    public boolean isShowingUpdateBadge() {
+        return mPropertyModel.get(MenuButtonProperties.SHOW_UPDATE_BADGE).mShowUpdateBadge;
+    }
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
index adeda4e..ae08c57 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -29,6 +29,7 @@
 import org.chromium.base.TraceEvent;
 import org.chromium.base.supplier.BooleanSupplier;
 import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.omnibox.LocationBar;
@@ -291,6 +292,16 @@
             public boolean isUsingBrandColor() {
                 return false;
             }
+
+            @Override
+            public int getSecurityIconResource(boolean isTablet) {
+                return 0;
+            }
+
+            @Override
+            public boolean isPaintPreview() {
+                return false;
+            }
         };
     }
 
@@ -860,4 +871,12 @@
                 ThemeUtils.getToolbarHairlineColor(getContext(), toolbarColor, isIncognito());
         shadow.setImageTintList(ColorStateList.valueOf(hairlineColor));
     }
+
+    /**
+     * Sets the {@link BrowserStateBrowserControlsVisibilityDelegate} instance the toolbar should
+     * use to manipulate the visibility of browser controls; notably, "browser controls" includes
+     * the toolbar itself.
+     */
+    public void setBrowserControlsVisibilityDelegate(
+            BrowserStateBrowserControlsVisibilityDelegate controlsVisibilityDelegate) {}
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
index 4b2c9e7..953d57f 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -42,12 +42,15 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.graphics.drawable.DrawableWrapper;
+import androidx.core.widget.ImageViewCompat;
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.MathUtils;
 import org.chromium.base.TraceEvent;
+import org.chromium.chrome.browser.browser_controls.BrowserStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.device.DeviceClassManager;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.omnibox.LocationBar;
 import org.chromium.chrome.browser.omnibox.LocationBarCoordinator;
 import org.chromium.chrome.browser.omnibox.NewTabPageDelegate;
@@ -77,6 +80,7 @@
 import org.chromium.ui.base.ViewUtils;
 import org.chromium.ui.interpolators.BakedBezierInterpolator;
 import org.chromium.ui.util.ColorUtils;
+import org.chromium.ui.util.TokenHolder;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -149,8 +153,9 @@
     @ViewDebug.ExportedProperty(category = "chrome")
     protected boolean mTextureCaptureMode;
     private boolean mForceTextureCapture;
-    private int mTintUsedForLastTextureCapture;
-    private int mTabCountForLastTextureCapture;
+
+    private BrowserStateBrowserControlsVisibilityDelegate mBrowserControlsVisibilityDelegate;
+    private int mShowBrowserControlsToken = TokenHolder.INVALID_TOKEN;
 
     @ViewDebug.ExportedProperty(category = "chrome")
     private boolean mAnimateNormalToolbar;
@@ -244,6 +249,9 @@
 
     /** Whether the toolbar has a pending request to call {@link triggerUrlFocusAnimation()}. */
     private boolean mPendingTriggerUrlFocusRequest;
+    private ToolbarSnapshotState mToolbarSnapshotState;
+    private ButtonData mButtonData;
+    private int mTabCount;
 
     /**
      * Used to specify the visual state of the toolbar.
@@ -251,7 +259,7 @@
     @IntDef({VisualState.NORMAL, VisualState.INCOGNITO, VisualState.BRAND_COLOR,
             VisualState.NEW_TAB_NORMAL})
     @Retention(RetentionPolicy.SOURCE)
-    private @interface VisualState {
+    @interface VisualState {
         int NORMAL = 0;
         int INCOGNITO = 1;
         int BRAND_COLOR = 2;
@@ -371,6 +379,12 @@
     }
 
     @Override
+    public void setBrowserControlsVisibilityDelegate(
+            BrowserStateBrowserControlsVisibilityDelegate controlsVisibilityDelegate) {
+        mBrowserControlsVisibilityDelegate = controlsVisibilityDelegate;
+    }
+
+    @Override
     void destroy() {
         cancelAnimations();
         super.destroy();
@@ -1328,11 +1342,7 @@
                     mToolbarButtonsContainer, canvas, rgbAlpha);
         }
 
-        mTintUsedForLastTextureCapture = getTint().getDefaultColor();
-
-        if (mTabSwitcherAnimationTabStackDrawable != null && mToggleTabStackButton != null) {
-            mTabCountForLastTextureCapture = mTabSwitcherAnimationTabStackDrawable.getTabCount();
-        }
+        mToolbarSnapshotState = generateToolbarSnapshotState();
 
         canvas.restore();
     }
@@ -1551,7 +1561,16 @@
         if (mForceTextureCapture) {
             return true;
         }
-        return !(urlHasFocus() || mUrlFocusChangeInProgress);
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.SUPPRESS_TOOLBAR_CAPTURES)) {
+            ToolbarSnapshotState snapshotState = generateToolbarSnapshotState();
+            boolean isReady = !snapshotState.equals(mToolbarSnapshotState);
+            isReady &=
+                    !(urlHasFocus() || mUrlFocusChangeInProgress || mOptionalButtonAnimationRunning
+                            || mLocationBar.getStatusCoordinator().isStatusIconAnimating());
+            return isReady;
+        } else {
+            return !(urlHasFocus() || mUrlFocusChangeInProgress);
+        }
     }
 
     @Override
@@ -1559,11 +1578,15 @@
         if (forceTextureCapture) {
             // Only force a texture capture if the tint for the toolbar drawables is changing or
             // if the tab count has changed since the last texture capture.
-            mForceTextureCapture = mTintUsedForLastTextureCapture != getTint().getDefaultColor();
+            if (mToolbarSnapshotState == null) {
+                mToolbarSnapshotState = generateToolbarSnapshotState();
+            }
+
+            mForceTextureCapture = mToolbarSnapshotState.getTint() != getTint().getDefaultColor();
 
             if (mTabSwitcherAnimationTabStackDrawable != null && mToggleTabStackButton != null) {
                 mForceTextureCapture = mForceTextureCapture
-                        || mTabCountForLastTextureCapture
+                        || mToolbarSnapshotState.getTabCount()
                                 != mTabSwitcherAnimationTabStackDrawable.getTabCount();
             }
 
@@ -1574,6 +1597,17 @@
         return false;
     }
 
+    private ToolbarSnapshotState generateToolbarSnapshotState() {
+        return new ToolbarSnapshotState(getTint().getDefaultColor(),
+                mTabCountProvider.getTabCount(), mButtonData, mVisualState,
+                getToolbarDataProvider().getCurrentUrl(),
+                getToolbarDataProvider().getSecurityIconResource(false),
+                ImageViewCompat.getImageTintList(mHomeButton),
+                getMenuButtonCoordinator().isShowingUpdateBadge(),
+                getToolbarDataProvider().isPaintPreview(), getProgressBar().getProgress(),
+                mUnfocusedLocationBarLayoutWidth);
+    }
+
     @Override
     public void setLayoutUpdater(Runnable layoutUpdater) {
         mLayoutUpdater = layoutUpdater;
@@ -2170,7 +2204,6 @@
     @Override
     public void onTabCountChanged(int numberOfTabs, boolean isIncognito) {
         if (mHomeButton != null) mHomeButton.setEnabled(true);
-
         if (mToggleTabStackButton == null) return;
 
         @BrandedColorScheme
@@ -2493,6 +2526,7 @@
 
     @Override
     void updateOptionalButton(ButtonData buttonData) {
+        mButtonData = buttonData;
         if (mOptionalButton == null) {
             ViewStub viewStub = findViewById(R.id.optional_button_stub);
             mOptionalButton = (ImageButton) viewStub.inflate();
@@ -2541,6 +2575,7 @@
 
     @Override
     void hideOptionalButton() {
+        mButtonData = null;
         // mLayoutLocationBarWithoutExtraButton implies that the hide animation is currently
         // running.
         if (mOptionalButton == null || mOptionalButton.getVisibility() == View.GONE
@@ -2616,6 +2651,7 @@
             public void onStart(Animator animation) {
                 mDisableLocationBarRelayout = true;
                 mOptionalButtonAnimationRunning = true;
+                keepControlsShownForAnimation();
                 mOptionalButton.setVisibility(View.VISIBLE);
             }
 
@@ -2624,6 +2660,7 @@
                 onOptionalButtonAnimationEnd();
                 mDisableLocationBarRelayout = false;
                 mOptionalButtonAnimationRunning = false;
+                allowBrowserControlsHide();
                 getViewTreeObserver().addOnGlobalLayoutListener(mOptionalButtonLayoutListener);
                 requestLayout();
             }
@@ -2632,6 +2669,24 @@
         mOptionalButtonAnimator.start();
     }
 
+    private void keepControlsShownForAnimation() {
+        // isShown() being false implies that the toolbar isn't visible. We don't want to force it
+        // back into visibility just so that we can show an animation.
+        if (isShown() && mBrowserControlsVisibilityDelegate != null) {
+            mShowBrowserControlsToken =
+                    mBrowserControlsVisibilityDelegate.showControlsPersistentAndClearOldToken(
+                            mShowBrowserControlsToken);
+        }
+    }
+
+    private void allowBrowserControlsHide() {
+        if (mBrowserControlsVisibilityDelegate != null) {
+            mBrowserControlsVisibilityDelegate.releasePersistentShowingToken(
+                    mShowBrowserControlsToken);
+            mShowBrowserControlsToken = TokenHolder.INVALID_TOKEN;
+        }
+    }
+
     /**
      * Runs an animation that fades out the optional button while lengthening the location bar
      * background.
@@ -2666,6 +2721,7 @@
             public void onStart(Animator animation) {
                 mLayoutLocationBarWithoutExtraButton = true;
                 mOptionalButtonAnimationRunning = true;
+                keepControlsShownForAnimation();
                 requestLayout();
             }
 
@@ -2675,6 +2731,7 @@
                 mOptionalButton.setVisibility(View.GONE);
                 mLayoutLocationBarWithoutExtraButton = false;
                 mOptionalButtonAnimationRunning = false;
+                allowBrowserControlsHide();
                 getViewTreeObserver().addOnGlobalLayoutListener(mOptionalButtonLayoutListener);
             }
         });
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarSnapshotState.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarSnapshotState.java
new file mode 100644
index 0000000..87712af
--- /dev/null
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarSnapshotState.java
@@ -0,0 +1,79 @@
+// Copyright 2021 The Chromium Authors. All rights reserved.
+// 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.toolbar.top;
+
+import android.content.res.ColorStateList;
+
+import org.chromium.chrome.browser.toolbar.ButtonData;
+import org.chromium.chrome.browser.toolbar.top.ToolbarPhone.VisualState;
+
+import java.util.Objects;
+
+class ToolbarSnapshotState {
+    private final int mTint;
+    private final int mTabCount;
+    private final ButtonData mOptionalButtonData;
+    private final @VisualState int mVisualState;
+    private String mUrlText = "";
+    private final int mSecurityIcon;
+    private final ColorStateList mColorStateList;
+    private final boolean mIsShowingUpdateBadgeDuringLastCapture;
+    private final boolean mIsPaintPreview;
+    private final float mProgress;
+    private final int mUnfocusedLocationBarLayoutWidth;
+
+    public ToolbarSnapshotState(int tint, int tabCount, ButtonData optionalButtonData,
+            @VisualState int visualState, String urlText, int securityIcon,
+            ColorStateList colorStateList, boolean isShowingUpdateBadgeDuringLastCapture,
+            boolean isPaintPreview, float progress, int unfocusedLocationBarLayoutWidth) {
+        mTint = tint;
+        mTabCount = tabCount;
+        mOptionalButtonData = optionalButtonData;
+        mVisualState = visualState;
+        mUrlText = urlText;
+        mSecurityIcon = securityIcon;
+        mColorStateList = colorStateList;
+        mIsShowingUpdateBadgeDuringLastCapture = isShowingUpdateBadgeDuringLastCapture;
+        mIsPaintPreview = isPaintPreview;
+        mProgress = progress;
+        mUnfocusedLocationBarLayoutWidth = unfocusedLocationBarLayoutWidth;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (!(o instanceof ToolbarSnapshotState)) {
+            return false;
+        }
+        ToolbarSnapshotState that = (ToolbarSnapshotState) o;
+        return mTint == that.mTint && mTabCount == that.mTabCount
+                && Objects.equals(mOptionalButtonData, that.mOptionalButtonData)
+                && mVisualState == that.mVisualState && mSecurityIcon == that.mSecurityIcon
+                && mIsShowingUpdateBadgeDuringLastCapture
+                == that.mIsShowingUpdateBadgeDuringLastCapture
+                && mIsPaintPreview == that.mIsPaintPreview
+                && Float.compare(mProgress, that.mProgress) == 0
+                && mUnfocusedLocationBarLayoutWidth == that.mUnfocusedLocationBarLayoutWidth
+                && Objects.equals(mUrlText, that.mUrlText)
+                && Objects.equals(mColorStateList, that.mColorStateList);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mTint, mTabCount, mOptionalButtonData, mVisualState, mUrlText,
+                mSecurityIcon, mColorStateList, mIsShowingUpdateBadgeDuringLastCapture,
+                mIsPaintPreview, mProgress, mUnfocusedLocationBarLayoutWidth);
+    }
+
+    int getTint() {
+        return mTint;
+    }
+
+    int getTabCount() {
+        return mTabCount;
+    }
+}
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
index 7aa61996..f470341 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -495,7 +495,7 @@
 
   const base::Value* selected_package_prefs =
       prefs->GetList(arc::prefs::kArcFastAppReinstallPackages);
-  for (const base::Value& item : selected_package_prefs->GetList()) {
+  for (const base::Value& item : selected_package_prefs->GetListDeprecated()) {
     std::string item_str = item.is_string() ? item.GetString() : std::string();
     packages.push_back(std::move(item_str));
   }
diff --git a/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc b/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc
index 6e109528..8c4aae83 100644
--- a/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc
+++ b/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc
@@ -177,7 +177,7 @@
     }
 
     for (const auto& access_permision :
-         access_permision_list_value->GetList()) {
+         access_permision_list_value->GetListDeprecated()) {
       const base::Value* serial_number_value = access_permision.FindKeyOfType(
           kUsbSerialNumber, base::Value::Type::STRING);
       if (!serial_number_value) {
diff --git a/chrome/browser/ui/app_list/search/DEPS b/chrome/browser/ui/app_list/search/DEPS
index e3e15e43..81160f2f 100644
--- a/chrome/browser/ui/app_list/search/DEPS
+++ b/chrome/browser/ui/app_list/search/DEPS
@@ -1,6 +1,7 @@
 include_rules = [
   "+ash/assistant/model",
   "+ash/assistant/util",
+  "+ash/shortcut_viewer",
   "+ash/strings/grit",
   "+chromeos/ui/vector_icons",
 ]
diff --git a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.cc b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.cc
index ee085945..51e9af5 100644
--- a/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.cc
+++ b/chrome/browser/ui/app_list/search/arc/recommend_apps_fetcher_impl.cc
@@ -231,7 +231,7 @@
   }
 
   // Otherwise, the response should return a list of apps.
-  base::Value::ConstListView app_list = parsed_json.value->GetList();
+  base::Value::ConstListView app_list = parsed_json.value->GetListDeprecated();
   if (app_list.empty()) {
     DVLOG(1) << "No app in the response.";
     // TODO(thanhdng): Add a UMA histogram here.
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.cc b/chrome/browser/ui/app_list/search/chrome_search_result.cc
index 29f8a5b..d58789c 100644
--- a/chrome/browser/ui/app_list/search/chrome_search_result.cc
+++ b/chrome/browser/ui/app_list/search/chrome_search_result.cc
@@ -45,7 +45,7 @@
 
 void ChromeSearchResult::MaybeUpdateTitleVector() {
   // Create and setup title tags if not set explicitly.
-  if (!explicit_title_vector) {
+  if (!explicit_title_vector_) {
     std::vector<TextItem> text_vector;
     TextItem text_item(ash::SearchResultTextItemType::kString);
     text_item.SetText(metadata_->title);
@@ -69,7 +69,7 @@
 
 void ChromeSearchResult::MaybeUpdateDetailsVector() {
   // Create and setup details tags if not set explicitly.
-  if (!explicit_details_vector) {
+  if (!explicit_details_vector_) {
     std::vector<TextItem> text_vector;
     TextItem text_item(ash::SearchResultTextItemType::kString);
     text_item.SetText(metadata_->details);
@@ -81,13 +81,13 @@
 
 void ChromeSearchResult::SetTitleTextVector(const TextVector& text_vector) {
   metadata_->title_vector = text_vector;
-  explicit_title_vector = true;
+  explicit_title_vector_ = true;
   SetSearchResultMetadata();
 }
 
 void ChromeSearchResult::SetDetailsTextVector(const TextVector& text_vector) {
   metadata_->details_vector = text_vector;
-  explicit_details_vector = true;
+  explicit_details_vector_ = true;
   SetSearchResultMetadata();
 }
 
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.h b/chrome/browser/ui/app_list/search/chrome_search_result.h
index 9af6433..36c54e9 100644
--- a/chrome/browser/ui/app_list/search/chrome_search_result.h
+++ b/chrome/browser/ui/app_list/search/chrome_search_result.h
@@ -227,8 +227,8 @@
   bool dismiss_view_on_open_ = true;
 
   // Whether the text vector is explicitly set by chrome.
-  bool explicit_title_vector = false;
-  bool explicit_details_vector = false;
+  bool explicit_title_vector_ = false;
+  bool explicit_details_vector_ = false;
 
   std::unique_ptr<ash::SearchResultMetadata> metadata_;
 
diff --git a/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc b/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc
index 7fa7031..b327022 100644
--- a/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc
+++ b/chrome/browser/ui/app_list/search/files/item_suggest_cache.cc
@@ -101,7 +101,7 @@
   const base::Value* field = value->FindListKey(key);
   if (!field)
     return absl::nullopt;
-  return field->GetList();
+  return field->GetListDeprecated();
 }
 
 absl::optional<std::string> GetString(const base::Value* value,
diff --git a/chrome/browser/ui/app_list/search/help_app_search_browsertest.cc b/chrome/browser/ui/app_list/search/help_app_search_browsertest.cc
index 57898b5..71979a0 100644
--- a/chrome/browser/ui/app_list/search/help_app_search_browsertest.cc
+++ b/chrome/browser/ui/app_list/search/help_app_search_browsertest.cc
@@ -264,9 +264,8 @@
   GetProfile()->GetPrefs()->SetInteger(
       prefs::kReleaseNotesSuggestionChipTimesLeftToShow, 3);
 
-  SearchAndWaitForProviders(
-      "", {ResultType::kInstalledApp, ResultType::kZeroStateFile,
-           ResultType::kHelpApp});
+  SearchAndWaitForProviders("",
+                            {ResultType::kInstalledApp, ResultType::kHelpApp});
 
   auto* result = FindResult(web_app::kHelpAppId);
   ASSERT_TRUE(result);
@@ -285,9 +284,8 @@
   system_web_app_manager.InstallSystemAppsForTesting();
   const web_app::AppId app_id = web_app::kHelpAppId;
 
-  SearchAndWaitForProviders(
-      "", {ResultType::kInstalledApp, ResultType::kZeroStateFile,
-           ResultType::kHelpApp});
+  SearchAndWaitForProviders("",
+                            {ResultType::kInstalledApp, ResultType::kHelpApp});
   auto* result = FindResult(web_app::kHelpAppId);
   ASSERT_TRUE(result);
 
diff --git a/chrome/browser/ui/app_list/search/omnibox_answer_result.cc b/chrome/browser/ui/app_list/search/omnibox_answer_result.cc
index 0bce272..cd5be12b 100644
--- a/chrome/browser/ui/app_list/search/omnibox_answer_result.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_answer_result.cc
@@ -213,8 +213,7 @@
     SetDetailsTextVector(details_vector);
   }
 
-  // Bold the title fields.
-  SetBigTitleTextVector(AddBoldTags(big_title_text_vector()));
+  // Bold the title field.
   SetTitleTextVector(AddBoldTags(title_text_vector()));
 
   // TODO(crbug.com/1250154): Remove these once the migration to TextVectors
diff --git a/chrome/browser/ui/app_list/search/omnibox_provider.cc b/chrome/browser/ui/app_list/search/omnibox_provider.cc
index 60cd255..7a87f56 100644
--- a/chrome/browser/ui/app_list/search/omnibox_provider.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_provider.cc
@@ -4,7 +4,12 @@
 
 #include "chrome/browser/ui/app_list/search/omnibox_provider.h"
 
+#include <iterator>
+#include <string>
+#include <utility>
+
 #include "ash/public/cpp/app_list/app_list_features.h"
+#include "base/containers/flat_set.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h"
@@ -47,6 +52,28 @@
          ~AutocompleteProvider::TYPE_DOCUMENT;
 }
 
+void RemoveDuplicates(std::vector<std::unique_ptr<OmniboxResult>>& results) {
+  // Sort the results by deduplication priority and then filter from left to
+  // right. This ensures that higher priority results are retained.
+  sort(results.begin(), results.end(),
+       [](const std::unique_ptr<OmniboxResult>& a,
+          const std::unique_ptr<OmniboxResult>& b) {
+         return a->dedup_priority() > b->dedup_priority();
+       });
+
+  base::flat_set<std::string> seen_ids;
+  for (auto iter = results.begin(); iter != results.end();) {
+    bool inserted = seen_ids.insert((*iter)->id()).second;
+    if (!inserted) {
+      // C++11:: The return value of erase(iter) is an iterator pointing to the
+      // next element in the container.
+      iter = results.erase(iter);
+    } else {
+      ++iter;
+    }
+  }
+}
+
 }  //  namespace
 
 OmniboxProvider::OmniboxProvider(Profile* profile,
@@ -106,6 +133,10 @@
 void OmniboxProvider::PopulateFromACResult(const AutocompleteResult& result) {
   SearchProvider::Results new_results;
   new_results.reserve(result.size());
+
+  std::vector<std::unique_ptr<OmniboxResult>> list_results;
+  list_results.reserve(result.size());
+
   for (const AutocompleteMatch& match : result) {
     // Do not return a match in any of these cases:
     // - The URL is invalid.
@@ -120,18 +151,21 @@
       continue;
     }
 
-    std::unique_ptr<ChromeSearchResult> result;
     if (!is_zero_state_input_ && IsAnswer(match)) {
-      result = std::make_unique<OmniboxAnswerResult>(profile_, list_controller_,
-                                                     controller_.get(), match);
+      new_results.emplace_back(std::make_unique<OmniboxAnswerResult>(
+          profile_, list_controller_, controller_.get(), match));
     } else {
-      result = std::make_unique<OmniboxResult>(
+      list_results.emplace_back(std::make_unique<OmniboxResult>(
           profile_, list_controller_, controller_.get(), &favicon_cache_, match,
-          is_zero_state_input_);
+          is_zero_state_input_));
     }
-    new_results.emplace_back(std::move(result));
   }
 
+  // Deduplicate the list results and then move-concatenate it into new_results.
+  RemoveDuplicates(list_results);
+  std::move(list_results.begin(), list_results.end(),
+            std::back_inserter(new_results));
+
   SwapResults(&new_results);
 }
 
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.cc b/chrome/browser/ui/app_list/search/omnibox_result.cc
index 612ee62..7f69a87 100644
--- a/chrome/browser/ui/app_list/search/omnibox_result.cc
+++ b/chrome/browser/ui/app_list/search/omnibox_result.cc
@@ -41,15 +41,20 @@
 
 constexpr SkColor kListIconColor = gfx::kGoogleGrey700;
 
-// Types of generic icon to show with a result.
-enum class IconType {
+// Priority numbers for deduplication. Higher numbers indicate higher priority.
+constexpr int kRichEntityPriority = 2;
+constexpr int kHistoryPriority = 1;
+constexpr int kDefaultPriority = 0;
+
+// Subtype for generic results.
+enum class Subtype {
   kDomain,
   kSearch,
   kHistory,
   kCalculator,
 };
 
-IconType MatchTypeToIconType(AutocompleteMatchType::Type type) {
+Subtype MatchTypeToSubtype(AutocompleteMatchType::Type type) {
   switch (type) {
     case AutocompleteMatchType::URL_WHAT_YOU_TYPED:
     case AutocompleteMatchType::HISTORY_URL:
@@ -65,7 +70,7 @@
     case AutocompleteMatchType::TAB_SEARCH_DEPRECATED:
     case AutocompleteMatchType::DOCUMENT_SUGGESTION:
     case AutocompleteMatchType::PEDAL_DEPRECATED:
-      return IconType::kDomain;
+      return Subtype::kDomain;
 
     case AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED:
     case AutocompleteMatchType::SEARCH_SUGGEST:
@@ -77,34 +82,34 @@
     case AutocompleteMatchType::VOICE_SUGGEST:
     case AutocompleteMatchType::CLIPBOARD_TEXT:
     case AutocompleteMatchType::CLIPBOARD_IMAGE:
-      return IconType::kSearch;
+      return Subtype::kSearch;
 
     case AutocompleteMatchType::SEARCH_HISTORY:
     case AutocompleteMatchType::SEARCH_SUGGEST_PERSONALIZED:
-      return IconType::kHistory;
+      return Subtype::kHistory;
 
     case AutocompleteMatchType::CALCULATOR:
-      return IconType::kCalculator;
+      return Subtype::kCalculator;
 
     case AutocompleteMatchType::EXTENSION_APP_DEPRECATED:
     case AutocompleteMatchType::TILE_SUGGESTION:
     case AutocompleteMatchType::TILE_NAVSUGGEST:
     case AutocompleteMatchType::NUM_TYPES:
       NOTREACHED();
-      return IconType::kDomain;
+      return Subtype::kDomain;
   }
 }
 
 // AutocompleteMatchType::Type to vector icon, used for app list.
 const gfx::VectorIcon& TypeToVectorIcon(AutocompleteMatchType::Type type) {
-  switch (MatchTypeToIconType(type)) {
-    case IconType::kDomain:
+  switch (MatchTypeToSubtype(type)) {
+    case Subtype::kDomain:
       return ash::kOmniboxGenericIcon;
-    case IconType::kSearch:
+    case Subtype::kSearch:
       return ash::kSearchIcon;
-    case IconType::kHistory:
+    case Subtype::kHistory:
       return ash::kHistoryIcon;
-    case IconType::kCalculator:
+    case Subtype::kCalculator:
       return ash::kEqualIcon;
   }
 }
@@ -134,27 +139,21 @@
 
   // Omnibox results are categorized as Search and Assistant if they are search
   // suggestions, and Web otherwise.
-  switch (match_.type) {
-    case AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED:
-    case AutocompleteMatchType::SEARCH_SUGGEST:
-    case AutocompleteMatchType::SEARCH_SUGGEST_ENTITY:
-    case AutocompleteMatchType::SEARCH_SUGGEST_TAIL:
-    case AutocompleteMatchType::SEARCH_SUGGEST_PROFILE:
-    case AutocompleteMatchType::SEARCH_OTHER_ENGINE:
-    case AutocompleteMatchType::CONTACT_DEPRECATED:
-    case AutocompleteMatchType::VOICE_SUGGEST:
-    case AutocompleteMatchType::CLIPBOARD_TEXT:
-    case AutocompleteMatchType::CLIPBOARD_IMAGE:
-      SetCategory(Category::kSearchAndAssistant);
-      break;
-    default:
-      SetCategory(Category::kWeb);
-      break;
-  }
+  SetCategory(MatchTypeToSubtype(match_.type) == Subtype::kSearch
+                  ? Category::kSearchAndAssistant
+                  : Category::kWeb);
 
   // Derive relevance from omnibox relevance and normalize it to [0, 1].
   set_relevance(match_.relevance / kMaxOmniboxScore);
 
+  if (IsRichEntity()) {
+    dedup_priority_ = kRichEntityPriority;
+  } else if (MatchTypeToSubtype(match_.type) == Subtype::kHistory) {
+    dedup_priority_ = kHistoryPriority;
+  } else {
+    dedup_priority_ = kDefaultPriority;
+  }
+
   const bool is_omnibox_search = AutocompleteMatch::IsSearchType(match_.type);
   SetIsOmniboxSearch(is_omnibox_search);
 
@@ -259,7 +258,7 @@
   // Use a favicon if eligible. If the result should have a favicon but
   // there isn't one in the cache, fall through to using a generic icon
   // instead.
-  if (favicon_cache_ && MatchTypeToIconType(match_.type) == IconType::kDomain) {
+  if (favicon_cache_ && MatchTypeToSubtype(match_.type) == Subtype::kDomain) {
     const auto icon = favicon_cache_->GetFaviconForPageUrl(
         match_.destination_url, base::BindOnce(&OmniboxResult::OnFaviconFetched,
                                                weak_factory_.GetWeakPtr()));
diff --git a/chrome/browser/ui/app_list/search/omnibox_result.h b/chrome/browser/ui/app_list/search/omnibox_result.h
index c51c67a..1507b03 100644
--- a/chrome/browser/ui/app_list/search/omnibox_result.h
+++ b/chrome/browser/ui/app_list/search/omnibox_result.h
@@ -41,6 +41,8 @@
   // BitmapFetcherDelegate:
   void OnFetchComplete(const GURL& url, const SkBitmap* bitmap) override;
 
+  int dedup_priority() const { return dedup_priority_; }
+
  private:
   void UpdateIcon();
   void UpdateTitleAndDetails();
@@ -62,6 +64,10 @@
 
   ash::SearchResultType GetSearchResultType() const;
 
+  // Indicates the priority of a result for deduplicatin. Results with the same
+  // ID but lower |dedup_priority| are removed.
+  int dedup_priority_ = 0;
+
   Profile* profile_;
   AppListControllerDelegate* list_controller_;
   AutocompleteController* autocomplete_controller_;
diff --git a/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc b/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc
index f61b7db6..bf9fb7a 100644
--- a/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc
+++ b/chrome/browser/ui/app_list/search/ranking/ranker_delegate.cc
@@ -146,4 +146,9 @@
   rankers_.emplace_back(std::move(ranker));
 }
 
+void RankerDelegate::OnBurnInPeriodElapsed() {
+  for (auto& ranker : rankers_)
+    ranker->OnBurnInPeriodElapsed();
+}
+
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/ranking/ranker_delegate.h b/chrome/browser/ui/app_list/search/ranking/ranker_delegate.h
index 9e3dffd0..961135e 100644
--- a/chrome/browser/ui/app_list/search/ranking/ranker_delegate.h
+++ b/chrome/browser/ui/app_list/search/ranking/ranker_delegate.h
@@ -42,6 +42,7 @@
                            ProviderType provider) override;
   void Train(const LaunchData& launch) override;
   void Remove(ChromeSearchResult* result) override;
+  void OnBurnInPeriodElapsed() override;
 
  private:
   void AddRanker(std::unique_ptr<Ranker> ranker);
diff --git a/chrome/browser/ui/app_list/search/search_controller.h b/chrome/browser/ui/app_list/search/search_controller.h
index a0651dff..a639fb5c 100644
--- a/chrome/browser/ui/app_list/search/search_controller.h
+++ b/chrome/browser/ui/app_list/search/search_controller.h
@@ -90,6 +90,8 @@
   // Update the controller with the given results. Used only if the categorical
   // search feature flag is enabled.
   virtual void SetResults(const SearchProvider* provider, Results results) = 0;
+  // Publishes results to ash.
+  virtual void Publish() = 0;
 
   virtual ChromeSearchResult* FindSearchResult(
       const std::string& result_id) = 0;
diff --git a/chrome/browser/ui/app_list/search/search_controller_factory.cc b/chrome/browser/ui/app_list/search/search_controller_factory.cc
index 811fd6e..8181fce 100644
--- a/chrome/browser/ui/app_list/search/search_controller_factory.cc
+++ b/chrome/browser/ui/app_list/search/search_controller_factory.cc
@@ -131,10 +131,11 @@
             kMaxAppShortcutResults, profile, list_controller));
   }
 
-  // This flag controls whether files are shown alongside Omnibox recent queries
-  // in the launcher. If enabled, Omnibox recent queries have their relevance
-  // scores changed to fit with these providers.
-  if (app_list_features::IsZeroStateMixedTypesRankerEnabled()) {
+  // Enable the Continue section providers only in the productivity launcher,
+  // and only if the enable_continue parameter is true (the default).
+  if (ash::features::IsProductivityLauncherEnabled() &&
+      base::GetFieldTrialParamByFeatureAsBool(
+          ash::features::kProductivityLauncher, "enable_continue", true)) {
     size_t zero_state_files_group_id =
         controller->AddGroup(kMaxZeroStateFileResults);
     controller->AddProvider(zero_state_files_group_id,
diff --git a/chrome/browser/ui/app_list/search/search_controller_impl.cc b/chrome/browser/ui/app_list/search/search_controller_impl.cc
index 5eabf431..49744f5 100644
--- a/chrome/browser/ui/app_list/search/search_controller_impl.cc
+++ b/chrome/browser/ui/app_list/search/search_controller_impl.cc
@@ -142,6 +142,11 @@
   NOTREACHED();
 }
 
+void SearchControllerImpl::Publish() {
+  // Should only be called when IsCategoricalSearchEnabled is true.
+  NOTREACHED();
+}
+
 void SearchControllerImpl::OnResultsChangedWithType(
     ash::AppListSearchResultType result_type) {
   OnResultsChanged();
diff --git a/chrome/browser/ui/app_list/search/search_controller_impl.h b/chrome/browser/ui/app_list/search/search_controller_impl.h
index 0cf121760..557ab3b 100644
--- a/chrome/browser/ui/app_list/search/search_controller_impl.h
+++ b/chrome/browser/ui/app_list/search/search_controller_impl.h
@@ -64,6 +64,7 @@
   void AddProvider(size_t group_id,
                    std::unique_ptr<SearchProvider> provider) override;
   void SetResults(const SearchProvider* provider, Results results) override;
+  void Publish() override;
   ChromeSearchResult* FindSearchResult(const std::string& result_id) override;
   ChromeSearchResult* GetResultByTitleForTest(
       const std::string& title) override;
diff --git a/chrome/browser/ui/app_list/search/search_controller_impl_new.h b/chrome/browser/ui/app_list/search/search_controller_impl_new.h
index d682d8d..a9712de0 100644
--- a/chrome/browser/ui/app_list/search/search_controller_impl_new.h
+++ b/chrome/browser/ui/app_list/search/search_controller_impl_new.h
@@ -66,6 +66,7 @@
   void AddProvider(size_t group_id,
                    std::unique_ptr<SearchProvider> provider) override;
   void SetResults(const SearchProvider* provider, Results results) override;
+  void Publish() override;
   ChromeSearchResult* FindSearchResult(const std::string& result_id) override;
   ChromeSearchResult* GetResultByTitleForTest(
       const std::string& title) override;
@@ -96,9 +97,6 @@
   // Rank the results of |provider_type|.
   void Rank(ash::AppListSearchResultType provider_type);
 
-  // Publish results to ash.
-  void Publish();
-
   void SetSearchResults(const SearchProvider* provider);
 
   void SetZeroStateResults(const SearchProvider* provider);
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc
index 4ffa65c..590baac 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/recurrence_ranker_util.cc
@@ -102,7 +102,7 @@
   if (!bin_weights)
     return false;
 
-  for (const Value& bin_weight : bin_weights.value()->GetList()) {
+  for (const Value& bin_weight : bin_weights.value()->GetListDeprecated()) {
     const auto& bin = GetInt(&bin_weight, "bin");
     const auto& weight = GetDouble(&bin_weight, "weight");
     if (!bin || !weight)
@@ -127,7 +127,7 @@
   proto->set_learning_rate(learning_rate.value());
 
   bool success = true;
-  for (const Value& predictor : predictors.value()->GetList())
+  for (const Value& predictor : predictors.value()->GetListDeprecated())
     success &= ConvertRecurrencePredictor(&predictor, proto->add_predictors());
   return success;
 }
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
index 82e47b83..100c6751 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -668,7 +668,7 @@
   EXPECT_EQ(GetProfile()
                 ->GetPrefs()
                 ->GetList(HoldingSpacePersistenceDelegate::kPersistencePath)
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             0u);
 
@@ -1576,7 +1576,7 @@
   EXPECT_EQ(3u, GetProfile()
                     ->GetPrefs()
                     ->GetList(HoldingSpacePersistenceDelegate::kPersistencePath)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   EXPECT_EQ(3u, holding_space_model->items().size());
 
@@ -1586,7 +1586,7 @@
   EXPECT_EQ(1u, GetProfile()
                     ->GetPrefs()
                     ->GetList(HoldingSpacePersistenceDelegate::kPersistencePath)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   ASSERT_EQ(1u, holding_space_model->items().size());
   EXPECT_EQ(file_path_2, holding_space_model->items()[0]->file_path());
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_persistence_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_persistence_delegate.cc
index 589a888..2717604f 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_persistence_delegate.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_persistence_delegate.cc
@@ -101,21 +101,21 @@
   // Attempt to find the finalized `item` in persistent storage.
   ListPrefUpdate update(profile()->GetPrefs(), kPersistencePath);
   auto item_it = std::find_if(
-      update->GetList().begin(), update->GetList().end(),
+      update->GetListDeprecated().begin(), update->GetListDeprecated().end(),
       [&item](const base::Value& persisted_item) {
         return HoldingSpaceItem::DeserializeId(base::Value::AsDictionaryValue(
                    persisted_item)) == item->id();
       });
 
   // If the finalized `item` already exists in persistent storage, update it.
-  if (item_it != update->GetList().end()) {
+  if (item_it != update->GetListDeprecated().end()) {
     *item_it = item->Serialize();
     return;
   }
 
   // If the finalized `item` did not previously exist in persistent storage,
   // insert it at the appropriate index.
-  item_it = update->GetList().begin();
+  item_it = update->GetListDeprecated().begin();
   for (const auto& candidate_item : model()->items()) {
     if (candidate_item.get() == item) {
       update->Insert(item_it, item->Serialize());
@@ -137,13 +137,13 @@
 
   // If persistent storage is empty we can immediately notify the callback of
   // persistence restoration completion and quit early.
-  if (persisted_holding_space_items->GetList().empty()) {
+  if (persisted_holding_space_items->GetListDeprecated().empty()) {
     std::move(persistence_restored_callback_).Run();
     return;
   }
 
   for (const auto& persisted_holding_space_item :
-       persisted_holding_space_items->GetList()) {
+       persisted_holding_space_items->GetListDeprecated()) {
     std::unique_ptr<HoldingSpaceItem> holding_space_item =
         HoldingSpaceItem::Deserialize(
             base::Value::AsDictionaryValue(persisted_holding_space_item),
diff --git a/chrome/browser/ui/ash/login_screen_client_impl.cc b/chrome/browser/ui/ash/login_screen_client_impl.cc
index 563c04f..56e2a24 100644
--- a/chrome/browser/ui/ash/login_screen_client_impl.cc
+++ b/chrome/browser/ui/ash/login_screen_client_impl.cc
@@ -329,7 +329,7 @@
     std::unique_ptr<base::ListValue> keyboard_layouts) {
   std::vector<ash::InputMethodItem> result;
 
-  for (const auto& i : keyboard_layouts->GetList()) {
+  for (const auto& i : keyboard_layouts->GetListDeprecated()) {
     const base::DictionaryValue* dictionary;
     if (!i.GetAsDictionary(&dictionary))
       continue;
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h b/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h
index c638fb99..4f23784 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_constants.h
@@ -45,7 +45,6 @@
 constexpr int kImagePreviewIconCornerRadius = 2;
 constexpr int kImagePreviewPlaceholderIconContentSize = 20;
 constexpr SkAlpha kImagePreviewBackgroundAlphaComponent = 0x32;
-constexpr SkColor kImagePreviewPlaceholderBackgroundColor = gfx::kGoogleBlue050;
 
 constexpr int kHeaderViewBetweenChildSpacing = 12;
 constexpr int kHeaderViewNarrowInsideBorderInsets = 14;
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
index 83d4cd9..495dd32 100644
--- a/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
+++ b/chrome/browser/ui/ash/sharesheet/sharesheet_header_view.cc
@@ -38,6 +38,7 @@
 #include "ui/accessibility/ax_node_data.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/chromeos/styles/cros_styles.h"
 #include "ui/color/color_id.h"
 #include "ui/color/color_provider.h"
 #include "ui/gfx/color_palette.h"
@@ -97,8 +98,12 @@
  public:
   METADATA_HEADER(SharesheetImagePreview);
   explicit SharesheetImagePreview(size_t file_count) {
+    ScopedLightModeAsDefault scoped_light_mode_as_default;
+    auto* color_provider = AshColorProvider::Get();
     SetBackground(views::CreateRoundedRectBackground(
-        kImagePreviewPlaceholderBackgroundColor,
+        cros_styles::ResolveColor(cros_styles::ColorName::kHighlightColor,
+                                  color_provider->IsDarkModeEnabled(),
+                                  /*use_debug_colors=*/false),
         views::LayoutProvider::Get()->GetCornerRadiusMetric(
             views::Emphasis::kMedium)));
     SetLayoutManager(std::make_unique<views::BoxLayout>(
@@ -125,7 +130,6 @@
     AddRowToImageContainerView();
     AddRowToImageContainerView();
 
-    ScopedLightModeAsDefault scoped_light_mode_as_default;
     for (size_t index = 0; index < grid_icon_count; ++index) {
       // If we have |enumeration|, add it as a label at the bottom right of
       // SharesheetImagePreview.
@@ -135,12 +139,17 @@
                 base::StrCat({u"+", base::NumberToString16(enumeration)}),
                 CONTEXT_SHARESHEET_BUBBLE_SMALL, STYLE_SHARESHEET));
         label->SetLineHeight(kImagePreviewFileEnumerationLineHeight);
-        label->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor(
-            AshColorProvider::ContentLayerType::kButtonLabelColorBlue));
+        label->SetEnabledColor(cros_styles::ResolveColor(
+            cros_styles::ColorName::kTextColorProminent,
+            color_provider->IsDarkModeEnabled(),
+            /*use_debug_colors=*/false));
         label->SetHorizontalAlignment(gfx::ALIGN_CENTER);
+        auto second_tone_icon_color_prominent =
+            AshColorProvider::GetSecondToneColor(
+                color_provider->GetContentLayerColor(
+                    AshColorProvider::ContentLayerType::kIconColorProminent));
         label->SetBackground(views::CreateRoundedRectBackground(
-            kImagePreviewPlaceholderBackgroundColor,
-            kImagePreviewIconCornerRadius));
+            second_tone_icon_color_prominent, kImagePreviewIconCornerRadius));
         label->SetPreferredSize(kImagePreviewQuarterSize);
         return;
       }
@@ -192,7 +201,8 @@
         /*thickness=*/1,
         views::LayoutProvider::Get()->GetCornerRadiusMetric(
             views::Emphasis::kMedium),
-        GetColorProvider()->GetColor(ui::kColorFocusableBorderUnfocused)));
+        AshColorProvider::Get()->GetContentLayerColor(
+            AshColorProvider::ContentLayerType::kSeparatorColor)));
   }
 
   void AddRowToImageContainerView() {
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc
index ac45c61..1e2158fa 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.cc
@@ -125,7 +125,8 @@
   if (!policy_apps)
     return AppListControllerDelegate::PIN_EDITABLE;
 
-  for (const base::Value& policy_dict_entry : policy_apps->GetList()) {
+  for (const base::Value& policy_dict_entry :
+       policy_apps->GetListDeprecated()) {
     if (!policy_dict_entry.is_dict())
       return AppListControllerDelegate::PIN_EDITABLE;
 
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
index 40775df..ad0e4fe 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_prefs.cc
@@ -211,7 +211,7 @@
   std::vector<std::string> result;
   const base::Value* policy_apps =
       prefs->GetList(prefs::kPolicyPinnedLauncherApps);
-  if (!policy_apps || policy_apps->GetList().empty())
+  if (!policy_apps || policy_apps->GetListDeprecated().empty())
     return result;
 
   // Obtain here all ids of ARC apps because it takes linear time, and getting
@@ -221,7 +221,7 @@
       arc_app_list_pref ? arc_app_list_pref->GetAppIds()
                         : std::vector<std::string>());
 
-  for (const auto& policy_dict_entry : policy_apps->GetList()) {
+  for (const auto& policy_dict_entry : policy_apps->GetListDeprecated()) {
     const std::string* policy_entry =
         policy_dict_entry.is_dict()
             ? policy_dict_entry.FindStringKey(
@@ -577,7 +577,7 @@
   const auto* layouts_rolled =
       pref_service->GetList(GetShelfDefaultPinLayoutPref());
   DCHECK(layouts_rolled);
-  return !layouts_rolled->GetList().empty();
+  return !layouts_rolled->GetListDeprecated().empty();
 }
 
 bool ChromeShelfPrefs::ShouldAddDefaultApps(PrefService* pref_service) {
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 2db8dde0..4f036b83 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -66,6 +66,7 @@
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h"
 #include "chrome/browser/policy/developer_tools_policy_handler.h"
+#include "chrome/browser/prefetch/prefetch_prefs.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/printing/background_printing_manager.h"
 #include "chrome/browser/profiles/keep_alive/profile_keep_alive_types.h"
@@ -1418,8 +1419,10 @@
   return true;
 }
 
-bool Browser::IsPrerender2Supported() {
-  return true;
+bool Browser::IsPrerender2Supported(content::WebContents& web_contents) {
+  Profile* profile =
+      Profile::FromBrowserContext(web_contents.GetBrowserContext());
+  return prefetch::IsSomePreloadingEnabled(*profile->GetPrefs());
 }
 
 std::unique_ptr<content::WebContents> Browser::ActivatePortalWebContents(
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index 3617ce5..d8aeaee 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -662,7 +662,7 @@
       content::WebContents* web_contents) override;
   void ExitPictureInPicture() override;
   bool IsBackForwardCacheSupported() override;
-  bool IsPrerender2Supported() override;
+  bool IsPrerender2Supported(content::WebContents& web_contents) override;
   std::unique_ptr<content::WebContents> ActivatePortalWebContents(
       content::WebContents* predecessor_contents,
       std::unique_ptr<content::WebContents> portal_contents) override;
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc
index 26a040d..9891c24 100644
--- a/chrome/browser/ui/browser_element_identifiers.cc
+++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -17,6 +17,7 @@
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kReadLaterButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSavePasswordComboboxElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSideSearchButtonElementId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kTabAlertIndicatorButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kTabCounterButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kTabGroupEditorBubbleId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kTabGroupHeaderElementId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h
index 38beadd..44dc89b 100644
--- a/chrome/browser/ui/browser_element_identifiers.h
+++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -26,6 +26,7 @@
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kReadLaterButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kSavePasswordComboboxElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kSideSearchButtonElementId);
+DECLARE_ELEMENT_IDENTIFIER_VALUE(kTabAlertIndicatorButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kTabCounterButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kTabGroupEditorBubbleId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kTabGroupHeaderElementId);
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h
index b47962e..1280267 100644
--- a/chrome/browser/ui/browser_window.h
+++ b/chrome/browser/ui/browser_window.h
@@ -92,6 +92,7 @@
 namespace ui {
 class ColorProvider;
 class NativeTheme;
+class ThemeProvider;
 }
 
 namespace views {
@@ -205,6 +206,9 @@
   // Returns the native theme associated with the frame.
   virtual ui::NativeTheme* GetNativeTheme() = 0;
 
+  // Returns the ThemeProvider associated with the frame.
+  virtual const ui::ThemeProvider* GetThemeProvider() const = 0;
+
   // Returns the ColorProvider associated with the frame.
   virtual const ui::ColorProvider* GetColorProvider() const = 0;
 
diff --git a/chrome/browser/ui/chrome_pages.cc b/chrome/browser/ui/chrome_pages.cc
index b3ba0a0..bee9f75 100644
--- a/chrome/browser/ui/chrome_pages.cc
+++ b/chrome/browser/ui/chrome_pages.cc
@@ -549,7 +549,8 @@
 }
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 void ShowWebAppSettings(Browser* browser, const std::string& app_id) {
   const GURL link_destination(chrome::kChromeUIWebAppSettingsURL + app_id);
   NavigateParams params(browser->profile(), link_destination,
diff --git a/chrome/browser/ui/chrome_pages.h b/chrome/browser/ui/chrome_pages.h
index 0191aa6..40eca3f 100644
--- a/chrome/browser/ui/chrome_pages.h
+++ b/chrome/browser/ui/chrome_pages.h
@@ -195,7 +195,8 @@
                                  signin_metrics::AccessPoint access_point);
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 // Show chrome://app-settings/<app-id> page.
 void ShowWebAppSettings(Browser* browser, const std::string& app_id);
 #endif
diff --git a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm
index 25671a55..3795b4f 100644
--- a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm
+++ b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm
@@ -107,7 +107,7 @@
 
     case base::Value::Type::LIST: {
       descriptor = [NSAppleEventDescriptor listDescriptor];
-      for (const auto& item : value->GetList()) {
+      for (const auto& item : value->GetListDeprecated()) {
         AppendValueToListDescriptor(descriptor, item);
       }
       break;
diff --git a/chrome/browser/ui/extensions/extension_action_platform_delegate.h b/chrome/browser/ui/extensions/extension_action_platform_delegate.h
index 6ce4e95..02d1074 100644
--- a/chrome/browser/ui/extensions/extension_action_platform_delegate.h
+++ b/chrome/browser/ui/extensions/extension_action_platform_delegate.h
@@ -25,12 +25,9 @@
   virtual void RegisterCommand() = 0;
   virtual void UnregisterCommand() = 0;
 
-  // Shows the given |host|. |grant_tab_permissions| is true if active tab
-  // permissions should be given to the extension; this is only true if the
-  // popup is opened through a user action.
+  // Shows the given |host| in an extension popup.
   virtual void ShowPopup(
       std::unique_ptr<extensions::ExtensionViewHost> host,
-      bool grant_tab_permissions,
       ExtensionActionViewController::PopupShowAction show_action) = 0;
 };
 
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.cc b/chrome/browser/ui/extensions/extension_action_view_controller.cc
index 10c06f59..2eae042a 100644
--- a/chrome/browser/ui/extensions/extension_action_view_controller.cc
+++ b/chrome/browser/ui/extensions/extension_action_view_controller.cc
@@ -276,10 +276,9 @@
 
   if (action_runner->RunAction(extension(), grant_tab_permissions) ==
       extensions::ExtensionAction::ACTION_SHOW_POPUP) {
-    GURL popup_url = extension_action_->GetPopupUrl(
-        sessions::SessionTabHelper::IdForTab(web_contents).id());
-    return GetPreferredPopupViewController()
-        ->TriggerPopupWithUrl(show_action, popup_url, grant_tab_permissions);
+    GetPreferredPopupViewController()->TriggerPopup(show_action, web_contents,
+                                                    grant_tab_permissions);
+    return true;
   }
   return false;
 }
@@ -376,22 +375,25 @@
       extensions_container_->GetActionForId(GetId()));
 }
 
-bool ExtensionActionViewController::TriggerPopupWithUrl(
+void ExtensionActionViewController::TriggerPopup(
     PopupShowAction show_action,
-    const GURL& popup_url,
+    content::WebContents* web_contents,
     bool grant_tab_permissions) {
-  if (!ExtensionIsValid())
-    return false;
+  // Callers should already have validated the extension.
+  DCHECK(ExtensionIsValid());
 
   // Always hide the current popup, even if it's not owned by this extension.
   // Only one popup should be visible at a time.
   extensions_container_->HideActivePopup();
 
+  GURL popup_url = extension_action_->GetPopupUrl(
+      sessions::SessionTabHelper::IdForTab(web_contents).id());
   std::unique_ptr<extensions::ExtensionViewHost> host =
       extensions::ExtensionViewHostFactory::CreatePopupHost(popup_url,
                                                             browser_);
-  if (!host)
-    return false;
+  // Creating a host should never fail in this case, since the extension is
+  // valid and has a valid popup URL.
+  CHECK(host);
 
   popup_host_ = host.get();
   popup_host_observation_.Observe(popup_host_.get());
@@ -403,8 +405,6 @@
       base::BindOnce(&ExtensionActionViewController::ShowPopup,
                      weak_factory_.GetWeakPtr(), std::move(host),
                      grant_tab_permissions, show_action));
-
-  return true;
 }
 
 void ExtensionActionViewController::ShowPopup(
@@ -415,8 +415,7 @@
   // (since it can open asynchronously). Check before proceeding.
   if (!popup_host_)
     return;
-  platform_delegate_->ShowPopup(std::move(popup_host), grant_tab_permissions,
-                                show_action);
+  platform_delegate_->ShowPopup(std::move(popup_host), show_action);
   view_delegate_->OnPopupShown(grant_tab_permissions);
 }
 
diff --git a/chrome/browser/ui/extensions/extension_action_view_controller.h b/chrome/browser/ui/extensions/extension_action_view_controller.h
index a11c5dbf..83d8860f 100644
--- a/chrome/browser/ui/extensions/extension_action_view_controller.h
+++ b/chrome/browser/ui/extensions/extension_action_view_controller.h
@@ -20,7 +20,6 @@
 
 class Browser;
 class ExtensionActionPlatformDelegate;
-class GURL;
 class IconWithBadgeImageSource;
 class ExtensionsContainer;
 
@@ -147,16 +146,15 @@
   // e.g. an API). Returns true if a popup is shown.
   bool ExecuteAction(PopupShowAction show_action, bool grant_tab_permissions);
 
-  // Begins the process of showing the popup for the extension action, given the
-  // associated |popup_url|. |grant_tab_permissions| is true if active tab
+  // Begins the process of showing the popup for the extension action over the
+  // given |web_contents|. |grant_tab_permissions| is true if active tab
   // permissions should be given to the extension; this is only true if the
   // popup is opened through a user action.
   // The popup may not be shown synchronously if the extension is hidden and
   // first needs to slide itself out.
-  // Returns true if a popup will be shown.
-  bool TriggerPopupWithUrl(PopupShowAction show_action,
-                           const GURL& popup_url,
-                           bool grant_tab_permissions);
+  void TriggerPopup(PopupShowAction show_action,
+                    content::WebContents* web_contents,
+                    bool grant_tab_permissions);
 
   // Shows the popup with the given |host|.
   void ShowPopup(std::unique_ptr<extensions::ExtensionViewHost> host,
diff --git a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc
index f720e43..3ed2de8 100644
--- a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc
+++ b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc
@@ -194,11 +194,11 @@
   base::Value ParseArgs(const base::ListValue* args, int* out_exit_code) {
     DCHECK(out_exit_code);
 
-    if (!args || args->GetList().empty()) {
+    if (!args || args->GetListDeprecated().empty()) {
       *out_exit_code = credential_provider::kUiecMissingSigninData;
       return base::Value(base::Value::Type::DICTIONARY);
     }
-    const base::Value& dict_result = args->GetList()[0];
+    const base::Value& dict_result = args->GetListDeprecated()[0];
     if (!dict_result.is_dict()) {
       *out_exit_code = credential_provider::kUiecMissingSigninData;
       return base::Value(base::Value::Type::DICTIONARY);
diff --git a/chrome/browser/ui/tabs/pinned_tab_codec.cc b/chrome/browser/ui/tabs/pinned_tab_codec.cc
index 074a15db..ebcdefb 100644
--- a/chrome/browser/ui/tabs/pinned_tab_codec.cc
+++ b/chrome/browser/ui/tabs/pinned_tab_codec.cc
@@ -109,7 +109,7 @@
   if (!value->is_list())
     return results;
 
-  for (const auto& serialized_tab : value->GetList()) {
+  for (const auto& serialized_tab : value->GetListDeprecated()) {
     if (!serialized_tab.is_dict())
       continue;
     absl::optional<StartupTab> tab = DecodeTab(serialized_tab);
diff --git a/chrome/browser/ui/tabs/tab_strip_model.cc b/chrome/browser/ui/tabs/tab_strip_model.cc
index 8c1c5f7a7..1e5ef12 100644
--- a/chrome/browser/ui/tabs/tab_strip_model.cc
+++ b/chrome/browser/ui/tabs/tab_strip_model.cc
@@ -32,7 +32,10 @@
 #include "chrome/browser/send_tab_to_self/send_tab_to_self_desktop_util.h"
 #include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
 #include "chrome/browser/ui/bookmarks/bookmark_utils.h"
+#include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_finder.h"
+#include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/read_later/reading_list_model_factory.h"
 #include "chrome/browser/ui/tab_ui_helper.h"
 #include "chrome/browser/ui/tabs/tab_group.h"
@@ -46,6 +49,7 @@
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/feature_engagement/public/feature_constants.h"
 #include "components/reading_list/core/reading_list_model.h"
 #include "components/send_tab_to_self/metrics_util.h"
 #include "components/tab_groups/tab_group_id.h"
@@ -56,6 +60,7 @@
 #include "content/public/browser/render_widget_host_observer.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
+#include "media/base/media_switches.h"
 #include "third_party/perfetto/include/perfetto/tracing/traced_value.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/range/range.h"
@@ -1915,7 +1920,19 @@
 
   if (!triggered_by_other_operation &&
       (selection.active_tab_changed() || selection.selection_changed())) {
-    if (selection.active_tab_changed()) {
+    // Show the in-product help dialog pointing users to the tab mute button if
+    // the user backgrounds an audible tab.
+    if (selection.active_tab_changed() &&
+        base::FeatureList::IsEnabled(media::kEnableTabMuting)) {
+      if (selection.old_contents &&
+          selection.old_contents->IsCurrentlyAudible()) {
+        Browser* browser =
+            chrome::FindBrowserWithWebContents(selection.old_contents);
+        DCHECK(browser);
+        browser->window()->MaybeShowFeaturePromo(
+            feature_engagement::kIPHTabAudioMutingFeature);
+      }
+
       auto now = base::TimeTicks::Now();
       if (selection.new_contents) {
         auto input_event_timestamp =
diff --git a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
index fe0ca1c1..aa3c0a7 100644
--- a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
+++ b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.cc
@@ -75,7 +75,6 @@
 
 void ExtensionActionPlatformDelegateViews::ShowPopup(
     std::unique_ptr<extensions::ExtensionViewHost> host,
-    bool grant_tab_permissions,
     ExtensionActionViewController::PopupShowAction show_action) {
   // TOP_RIGHT is correct for both RTL and LTR, because the views platform
   // performs the flipping in RTL cases.
diff --git a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h
index 67c82a2d..97dc579e 100644
--- a/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h
+++ b/chrome/browser/ui/views/extensions/extension_action_platform_delegate_views.h
@@ -42,7 +42,6 @@
   void UnregisterCommand() override;
   void ShowPopup(
       std::unique_ptr<extensions::ExtensionViewHost> host,
-      bool grant_tab_permissions,
       ExtensionActionViewController::PopupShowAction show_action) override;
 
   // extensions::CommandService::Observer:
diff --git a/chrome/browser/ui/views/external_protocol_dialog.cc b/chrome/browser/ui/views/external_protocol_dialog.cc
index 80216b5..113a90f 100644
--- a/chrome/browser/ui/views/external_protocol_dialog.cc
+++ b/chrome/browser/ui/views/external_protocol_dialog.cc
@@ -48,7 +48,7 @@
 
 }  // namespace
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
+#if !BUILDFLAG(IS_CHROMEOS)
 // static
 void ExternalProtocolHandler::RunExternalProtocolDialog(
     const GURL& url,
@@ -70,7 +70,7 @@
   new ExternalProtocolDialog(web_contents, url, program_name, initiating_origin,
                              std::move(initiator_document));
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
+#endif  // !BUILDFLAG(IS_CHROMEOS)
 
 ExternalProtocolDialog::ExternalProtocolDialog(
     WebContents* web_contents,
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 455df67..c968fc1 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -1203,6 +1203,10 @@
   return views::ClientView::GetNativeTheme();
 }
 
+const ui::ThemeProvider* BrowserView::GetThemeProvider() const {
+  return views::ClientView::GetThemeProvider();
+}
+
 const ui::ColorProvider* BrowserView::GetColorProvider() const {
   return views::ClientView::GetColorProvider();
 }
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index dac39b47..3aa31d4 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -400,6 +400,7 @@
   bool DoBrowserControlsShrinkRendererSize(
       const content::WebContents* contents) const override;
   ui::NativeTheme* GetNativeTheme() override;
+  const ui::ThemeProvider* GetThemeProvider() const override;
   const ui::ColorProvider* GetColorProvider() const override;
   ui::ElementContext GetElementContext() override;
   int GetTopControlsHeight() const override;
diff --git a/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc b/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc
index 2fdb67a..84fd111 100644
--- a/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc
+++ b/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.cc
@@ -60,11 +60,7 @@
   DCHECK(!DistillabilityObserver::IsInObserverList());
 }
 
-void ReaderModeIconView::DidFinishNavigation(
-    content::NavigationHandle* navigation_handle) {
-  if (!navigation_handle->IsInPrimaryMainFrame())
-    return;
-
+void ReaderModeIconView::PrimaryPageChanged(content::Page& page) {
   if (GetVisible())
     views::InkDrop::Get(this)->AnimateToState(views::InkDropState::HIDDEN,
                                               nullptr);
diff --git a/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.h b/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.h
index b4f3e622..b5917fa 100644
--- a/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.h
+++ b/chrome/browser/ui/views/reader_mode/reader_mode_icon_view.h
@@ -12,11 +12,7 @@
 #include "components/dom_distiller/content/browser/distillable_page_utils.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "ui/base/metadata/metadata_header_macros.h"
-#include "ui/gfx/vector_icon_types.h"
 
-namespace content {
-class NavigationHandle;
-}
 class CommandUpdater;
 class PrefService;
 
@@ -38,8 +34,7 @@
   // content:WebContentsObserver overrides:
   // Detect when navigation to the distilled page completes. This is required to
   // correctly update the icon's inkdrop.
-  void DidFinishNavigation(
-      content::NavigationHandle* navigation_handle) override;
+  void PrimaryPageChanged(content::Page& page) override;
   void ReadyToCommitNavigation(
       content::NavigationHandle* navigation_handle) override;
   void PrimaryMainDocumentElementAvailable() override;
diff --git a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
index 3defeb7..bf204c16 100644
--- a/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
+++ b/chrome/browser/ui/views/sync/inline_login_ui_browsertest.cc
@@ -274,7 +274,7 @@
   PrefService* pref_service = browser()->profile()->GetPrefs();
   ListPrefUpdate updater(pref_service,
                          prefs::kReverseAutologinRejectedEmailList);
-  if (!base::Contains(updater->GetList(), base::Value(email)))
+  if (!base::Contains(updater->GetListDeprecated(), base::Value(email)))
     updater->Append(email);
 }
 
diff --git a/chrome/browser/ui/views/tabs/alert_indicator_button.cc b/chrome/browser/ui/views/tabs/alert_indicator_button.cc
index 65f82e0..776e69f 100644
--- a/chrome/browser/ui/views/tabs/alert_indicator_button.cc
+++ b/chrome/browser/ui/views/tabs/alert_indicator_button.cc
@@ -11,6 +11,7 @@
 #include "base/metrics/user_metrics.h"
 #include "base/time/time.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/browser/ui/views/tabs/tab_controller.h"
@@ -26,6 +27,7 @@
 #include "ui/gfx/paint_vector_icon.h"
 #include "ui/views/animation/animation_delegate_views.h"
 #include "ui/views/metrics.h"
+#include "ui/views/view_class_properties.h"
 
 namespace {
 
@@ -143,9 +145,8 @@
   SetEventTargeter(std::make_unique<views::ViewTargeter>(this));
 
   SetAccessibleName(l10n_util::GetStringUTF16(IDS_ACCNAME_MUTE_TAB));
-  // Disable animations of hover state change, to be consistent with the
-  // behavior of the tab close button.
-  // set_animate_on_state_change(false);
+
+  SetProperty(views::kElementIdentifierKey, kTabAlertIndicatorButtonElementId);
 }
 
 AlertIndicatorButton::~AlertIndicatorButton() = default;
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
index 2937cef..ea08007d 100644
--- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc
+++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -91,6 +91,15 @@
       IDS_LIVE_CAPTION_PROMO, IDS_LIVE_CAPTION_PROMO_SCREENREADER,
       FeaturePromoSpecification::AcceleratorInfo()));
 
+  // kIPHTabAudioMutingFeature:
+  registry.RegisterFeature(std::move(
+      FeaturePromoSpecification::CreateForToastPromo(
+          feature_engagement::kIPHTabAudioMutingFeature,
+          kTabAlertIndicatorButtonElementId, IDS_TAB_AUDIO_MUTING_PROMO,
+          IDS_LIVE_CAPTION_PROMO_SCREENREADER,
+          FeaturePromoSpecification::AcceleratorInfo())
+          .SetBubbleArrow(HelpBubbleArrow::kTopCenter)));
+
   // kIPHGMCCastStartStopFeature:
   registry.RegisterFeature(FeaturePromoSpecification::CreateForLegacyPromo(
       &feature_engagement::kIPHGMCCastStartStopFeature, kMediaButtonElementId,
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
index 1b09875..b118d9d 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -216,21 +216,24 @@
 bool WebAppUiManagerImpl::UninstallAndReplaceIfExists(
     const std::vector<AppId>& from_apps,
     const AppId& to_app) {
-  bool has_migrated = false;
+  bool has_migrated_ui = false;
   bool uninstall_triggered = false;
   for (const AppId& from_app : from_apps) {
     if (!IsAppInstalled(profile_, from_app))
       continue;
 
-    if (!has_migrated) {
+    if (!has_migrated_ui) {
+      has_migrated_ui = true;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
       // Grid position in app list.
       auto* app_list_syncable_service =
           app_list::AppListSyncableServiceFactory::GetForProfile(profile_);
-      if (app_list_syncable_service->GetSyncItem(from_app)) {
+      bool to_app_in_shelf =
+          app_list_syncable_service->GetPinPosition(to_app).IsValid();
+      // If the new app is already pinned to the shelf don't transfer UI prefs
+      // across as that could cause it to become unpinned.
+      if (!to_app_in_shelf)
         app_list_syncable_service->TransferItemAttributes(from_app, to_app);
-        has_migrated = true;
-      }
 #endif
 
       // If migration of user/UI data is required for other app types consider
@@ -252,7 +255,6 @@
             to_app, GetExtensionDisplayMode(profile_, from_extension),
             /*is_user_action=*/false);
 
-        has_migrated = true;
         auto shortcut_info = web_app::ShortcutInfoForExtensionAndProfile(
             from_extension, profile_);
         auto callback =
@@ -263,7 +265,7 @@
         uninstall_triggered = true;
         continue;
       }
-      has_migrated = true;
+
       // The from_app could be a web app.
       os_integration_manager_->GetShortcutInfoForApp(
           from_app,
diff --git a/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc b/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc
index 93d3720..3edb56e 100644
--- a/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc
+++ b/chrome/browser/ui/webui/access_code_cast/access_code_cast_ui.cc
@@ -120,8 +120,8 @@
     std::vector<content::WebUIMessageHandler*>* handlers) const {}
 
 void AccessCodeCastDialog::GetDialogSize(gfx::Size* size) const {
-  const int kDefaultWidth = 480;
-  const int kDefaultHeight = 341;
+  const int kDefaultWidth = 448;
+  const int kDefaultHeight = 271;
   size->SetSize(kDefaultWidth, kDefaultHeight);
 }
 
@@ -204,6 +204,7 @@
       {"errorPermission", IDS_ACCESS_CODE_CAST_ERROR_PERMISSION},
       {"errorTooManyRequests", IDS_ACCESS_CODE_CAST_ERROR_TOO_MANY_REQUESTS},
       {"errorUnknown", IDS_ACCESS_CODE_CAST_ERROR_UNKNOWN},
+      {"submit", IDS_ACCESS_CODE_CAST_SUBMIT},
       {"useCamera", IDS_ACCESS_CODE_CAST_USE_CAMERA},
   };
 
diff --git a/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.cc b/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.cc
index 899849c..25b062f 100644
--- a/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.cc
+++ b/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.cc
@@ -11,6 +11,12 @@
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 
+namespace {
+
+bool g_disable_throttle_for_testing_ = false;
+
+}  // namespace
+
 // static
 std::unique_ptr<content::NavigationThrottle>
 WebAppSettingsNavigationThrottle::MaybeCreateThrottleFor(
@@ -28,6 +34,11 @@
   return std::make_unique<WebAppSettingsNavigationThrottle>(handle);
 }
 
+// static
+void WebAppSettingsNavigationThrottle::DisableForTesting() {
+  g_disable_throttle_for_testing_ = true;
+}
+
 WebAppSettingsNavigationThrottle::WebAppSettingsNavigationThrottle(
     content::NavigationHandle* navigation_handle)
     : content::NavigationThrottle(navigation_handle) {}
@@ -36,6 +47,9 @@
 
 content::NavigationThrottle::ThrottleCheckResult
 WebAppSettingsNavigationThrottle::WillStartRequest() {
+  if (g_disable_throttle_for_testing_)
+    return content::NavigationThrottle::PROCEED;
+
   content::WebContents* web_contents = navigation_handle()->GetWebContents();
   Profile* profile =
       Profile::FromBrowserContext(web_contents->GetBrowserContext());
diff --git a/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.h b/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.h
index a0fa3fd..141bc3a 100644
--- a/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.h
+++ b/chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.h
@@ -21,6 +21,8 @@
   static std::unique_ptr<content::NavigationThrottle> MaybeCreateThrottleFor(
       content::NavigationHandle* handle);
 
+  static void DisableForTesting();
+
   explicit WebAppSettingsNavigationThrottle(content::NavigationHandle* handle);
   ~WebAppSettingsNavigationThrottle() override;
 
diff --git a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc
index 3be10f6ae..98a699f 100644
--- a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc
+++ b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc
@@ -52,8 +52,8 @@
 
 void BookmarksMessageHandler::HandleGetIncognitoAvailability(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   AllowJavascript();
 
@@ -73,8 +73,8 @@
 
 void BookmarksMessageHandler::HandleGetCanEditBookmarks(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   AllowJavascript();
 
diff --git a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
index 027389b..02f53053 100644
--- a/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
+++ b/chrome/browser/ui/webui/browser_switch/browser_switch_ui.cc
@@ -324,8 +324,8 @@
   DCHECK(args);
   AllowJavascript();
 
-  std::string callback_id = args->GetList()[0].GetString();
-  std::string url_spec = args->GetList()[1].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  std::string url_spec = args->GetListDeprecated()[1].GetString();
   GURL url(url_spec);
 
   auto* service = GetBrowserSwitcherService(web_ui());
@@ -334,7 +334,7 @@
     // This URL shouldn't open in an alternative browser. Abort launch, because
     // something weird is going on (e.g. race condition from a new sitelist
     // being loaded).
-    RejectJavascriptCallback(args->GetList()[0], base::Value());
+    RejectJavascriptCallback(args->GetListDeprecated()[0], base::Value());
     return;
   }
 
@@ -392,16 +392,16 @@
       RuleSetToDict(*service->sitelist()->GetExternalGreylist());
   retval.SetKey("external_greylist", std::move(external_greylist_dict));
 
-  ResolveJavascriptCallback(args->GetList()[0], retval);
+  ResolveJavascriptCallback(args->GetListDeprecated()[0], retval);
 }
 
 void BrowserSwitchHandler::HandleGetDecision(const base::ListValue* args) {
   DCHECK(args);
   AllowJavascript();
 
-  GURL url = GURL(args->GetList()[1].GetString());
+  GURL url = GURL(args->GetListDeprecated()[1].GetString());
   if (!url.is_valid()) {
-    RejectJavascriptCallback(args->GetList()[0], base::Value());
+    RejectJavascriptCallback(args->GetListDeprecated()[0], base::Value());
     return;
   }
 
@@ -439,7 +439,7 @@
                                     decision.matching_rule->ToString()));
   }
 
-  ResolveJavascriptCallback(args->GetList()[0], retval);
+  ResolveJavascriptCallback(args->GetListDeprecated()[0], retval);
 }
 
 void BrowserSwitchHandler::HandleGetTimestamps(const base::ListValue* args) {
@@ -450,7 +450,7 @@
   auto* downloader = service->sitelist_downloader();
 
   if (!downloader) {
-    ResolveJavascriptCallback(args->GetList()[0], base::Value());
+    ResolveJavascriptCallback(args->GetListDeprecated()[0], base::Value());
     return;
   }
 
@@ -460,7 +460,7 @@
   retval.Set("next_fetch", std::make_unique<base::Value>(
                                downloader->next_refresh_time().ToJsTime()));
 
-  ResolveJavascriptCallback(args->GetList()[0], retval);
+  ResolveJavascriptCallback(args->GetListDeprecated()[0], retval);
 }
 
 void BrowserSwitchHandler::HandleGetRulesetSources(
@@ -481,7 +481,7 @@
     // a nested object.
     retval.SetKey(source.pref_name, std::move(val));
   }
-  ResolveJavascriptCallback(args->GetList()[0], retval);
+  ResolveJavascriptCallback(args->GetListDeprecated()[0], retval);
 }
 
 void BrowserSwitchHandler::HandleRefreshXml(const base::ListValue* args) {
@@ -496,7 +496,7 @@
   AllowJavascript();
 
   auto* service = GetBrowserSwitcherService(web_ui());
-  ResolveJavascriptCallback(args->GetList()[0],
+  ResolveJavascriptCallback(args->GetListDeprecated()[0],
                             base::Value(service->prefs().IsEnabled()));
 }
 
diff --git a/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc b/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
index 59f8f68..23b9e58 100644
--- a/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
+++ b/chrome/browser/ui/webui/certificate_provisioning_ui_handler.cc
@@ -228,7 +228,7 @@
 
 void CertificateProvisioningUiHandler::
     HandleRefreshCertificateProvisioningProcesses(const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
   AllowJavascript();
   RefreshCertificateProvisioningProcesses();
 }
@@ -236,13 +236,13 @@
 void CertificateProvisioningUiHandler::
     HandleTriggerCertificateProvisioningProcessUpdate(
         const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
   if (!args->is_list())
     return;
-  const base::Value& cert_profile_id = args->GetList()[0];
+  const base::Value& cert_profile_id = args->GetListDeprecated()[0];
   if (!cert_profile_id.is_string())
     return;
-  const base::Value& device_wide = args->GetList()[1];
+  const base::Value& device_wide = args->GetListDeprecated()[1];
   if (!device_wide.is_bool())
     return;
 
diff --git a/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc b/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc
index fa6123d..b79e4dd 100644
--- a/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc
+++ b/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc
@@ -105,7 +105,7 @@
     return;
   }
   if (value->is_list()) {
-    for (base::Value& child : value->GetList())
+    for (base::Value& child : value->GetListDeprecated())
       FormatDictRecurse(&child, messages);
     return;
   }
@@ -201,7 +201,7 @@
     if (!out_profile_ids)
       return;
     out_profile_ids->clear();
-    for (const base::Value& process : out_all_processes->GetList()) {
+    for (const base::Value& process : out_all_processes->GetListDeprecated()) {
       const std::string* profile_id = process.FindStringKey("certProfileId");
       ASSERT_TRUE(profile_id);
       out_profile_ids->push_back(*profile_id);
diff --git a/chrome/browser/ui/webui/certificate_viewer_webui.cc b/chrome/browser/ui/webui/certificate_viewer_webui.cc
index 752fa90..c6a9e0e 100644
--- a/chrome/browser/ui/webui/certificate_viewer_webui.cc
+++ b/chrome/browser/ui/webui/certificate_viewer_webui.cc
@@ -317,7 +317,7 @@
 
 void CertificateViewerDialogHandler::HandleExportCertificate(
     const base::ListValue* args) {
-  int cert_index = GetCertificateIndex(args->GetList()[0].GetInt());
+  int cert_index = GetCertificateIndex(args->GetListDeprecated()[0].GetInt());
   if (cert_index < 0)
     return;
 
@@ -332,8 +332,8 @@
 void CertificateViewerDialogHandler::HandleRequestCertificateFields(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
-  int cert_index = GetCertificateIndex(args->GetList()[1].GetInt());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  int cert_index = GetCertificateIndex(args->GetListDeprecated()[1].GetInt());
   if (cert_index < 0)
     return;
 
diff --git a/chrome/browser/ui/webui/certificates_handler.cc b/chrome/browser/ui/webui/certificates_handler.cc
index 6c87b7f..49951bcd 100644
--- a/chrome/browser/ui/webui/certificates_handler.cc
+++ b/chrome/browser/ui/webui/certificates_handler.cc
@@ -411,15 +411,15 @@
 }
 
 void CertificatesHandler::AssignWebUICallbackId(const base::ListValue* args) {
-  CHECK_LE(1U, args->GetList().size());
+  CHECK_LE(1U, args->GetListDeprecated().size());
   CHECK(webui_callback_id_.empty());
-  webui_callback_id_ = args->GetList()[0].GetString();
+  webui_callback_id_ = args->GetListDeprecated()[0].GetString();
 }
 
 void CertificatesHandler::HandleGetCATrust(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
   AssignWebUICallbackId(args);
 
   CertificateManagerModel::CertInfo* cert_info =
@@ -445,7 +445,7 @@
 }
 
 void CertificatesHandler::HandleEditCATrust(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(5U, list.size());
   AssignWebUICallbackId(args);
 
@@ -485,7 +485,7 @@
 }
 
 void CertificatesHandler::HandleExportPersonal(const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
   AssignWebUICallbackId(args);
 
   CertificateManagerModel::CertInfo* cert_info =
@@ -520,7 +520,7 @@
 
 void CertificatesHandler::HandleExportPersonalPasswordSelected(
     const base::ListValue* args) {
-  const base::Value::ConstListView args_list = args->GetList();
+  const base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(2U, args_list.size());
   AssignWebUICallbackId(args);
   password_ = UTF8ToUTF16(args_list[1].GetString());  // CHECKs if non-string.
@@ -582,7 +582,7 @@
     return;
   }
 
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(2U, list.size());
   AssignWebUICallbackId(args);
   use_hardware_backed_ = list[1].GetBool();
@@ -664,7 +664,7 @@
 
 void CertificatesHandler::HandleImportPersonalPasswordSelected(
     const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(2U, args_list.size());
   AssignWebUICallbackId(args);
   password_ = UTF8ToUTF16(args_list[1].GetString());  // CHECKs if non-string.
@@ -745,7 +745,7 @@
 }
 
 void CertificatesHandler::HandleImportServer(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   AssignWebUICallbackId(args);
 
   select_file_dialog_ = ui::SelectFileDialog::Create(
@@ -819,7 +819,7 @@
     return;
   }
 
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   AssignWebUICallbackId(args);
 
   select_file_dialog_ = ui::SelectFileDialog::Create(
@@ -877,7 +877,7 @@
 
 void CertificatesHandler::HandleImportCATrustSelected(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(4U, list.size());
   AssignWebUICallbackId(args);
 
@@ -924,7 +924,7 @@
 }
 
 void CertificatesHandler::HandleDeleteCertificate(const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
   AssignWebUICallbackId(args);
 
   CertificateManagerModel::CertInfo* cert_info =
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 b69fd9b..f39bedf 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -327,7 +327,8 @@
 #include "chrome/browser/ui/webui/connectors_internals/connectors_internals_ui.h"
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 #include "chrome/browser/ui/webui/app_settings/web_app_settings_ui.h"
 #endif
 
@@ -1163,6 +1164,9 @@
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
   if (url.host_piece() == chrome::kChromeUIBrowserSwitchHost)
     return &NewWebUI<BrowserSwitchUI>;
+#endif
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
   if (base::FeatureList::IsEnabled(features::kDesktopPWAsWebAppSettingsPage) &&
       url.host_piece() == chrome::kChromeUIWebAppSettingsHost) {
     return &NewWebUI<WebAppSettingsUI>;
diff --git a/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc b/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc
index 97219cf..e573fdb 100644
--- a/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/account_manager/account_migration_welcome_ui.cc
@@ -60,8 +60,8 @@
   void HandleReauthenticateAccount(const base::ListValue* args) {
     AllowJavascript();
 
-    CHECK(!args->GetList().empty());
-    const std::string& account_email = args->GetList()[0].GetString();
+    CHECK(!args->GetListDeprecated().empty());
+    const std::string& account_email = args->GetListDeprecated()[0].GetString();
 
     Profile* profile = Profile::FromWebUI(web_ui());
     ::GetAccountManagerFacade(profile->GetPath().value())
diff --git a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
index 9b07ce7..43233c9 100644
--- a/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/arc_graphics_tracing/arc_graphics_tracing_handler.cc
@@ -614,31 +614,31 @@
 
 void ArcGraphicsTracingHandler::HandleSetStopOnJank(
     const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
   DCHECK_EQ(ArcGraphicsTracingMode::kFull, mode_);
-  if (!args->GetList()[0].is_bool()) {
+  if (!args->GetListDeprecated()[0].is_bool()) {
     LOG(ERROR) << "Invalid input";
     return;
   }
-  stop_on_jank_ = args->GetList()[0].GetBool();
+  stop_on_jank_ = args->GetListDeprecated()[0].GetBool();
 }
 
 void ArcGraphicsTracingHandler::HandleSetMaxTime(const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
   DCHECK_EQ(ArcGraphicsTracingMode::kOverview, mode_);
 
-  if (!args->GetList()[0].is_int()) {
+  if (!args->GetListDeprecated()[0].is_int()) {
     LOG(ERROR) << "Invalid input";
     return;
   }
-  max_tracing_time_ = base::Seconds(args->GetList()[0].GetInt());
+  max_tracing_time_ = base::Seconds(args->GetListDeprecated()[0].GetInt());
   DCHECK_GE(max_tracing_time_, base::Seconds(1));
 }
 
 void ArcGraphicsTracingHandler::HandleLoadFromText(
     const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
-  if (!args->GetList()[0].is_string()) {
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
+  if (!args->GetListDeprecated()[0].is_string()) {
     LOG(ERROR) << "Invalid input";
     return;
   }
@@ -646,7 +646,7 @@
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
       base::BindOnce(&LoadGraphicsModel, mode_,
-                     std::move(args->GetList()[0].GetString())),
+                     std::move(args->GetListDeprecated()[0].GetString())),
       base::BindOnce(&ArcGraphicsTracingHandler::OnGraphicsModelReady,
                      weak_ptr_factory_.GetWeakPtr()));
 }
diff --git a/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc b/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
index 301015e..2ec7618 100644
--- a/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/arc_power_control/arc_power_control_handler.cc
@@ -197,14 +197,14 @@
 
 void ArcPowerControlHandler::HandleSetWakefulnessMode(
     const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
 
   if (!power_control_enabled_) {
     LOG(ERROR) << "Power control is not enabled";
     return;
   }
 
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     LOG(ERROR) << "Invalid input";
     return;
   }
@@ -213,7 +213,7 @@
       arc::ArcServiceManager::Get()->arc_bridge_service()->power();
   DCHECK(power);
 
-  const std::string mode = args->GetList()[0].GetString();
+  const std::string mode = args->GetListDeprecated()[0].GetString();
   if (mode == kWakenessfullWakeUp) {
     if (wakefulness_mode_ == arc::mojom::WakefulnessMode::ASLEEP) {
       arc::mojom::PowerInstance* const power_instance =
@@ -242,14 +242,14 @@
 }
 
 void ArcPowerControlHandler::HandleSetThrottling(const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
 
   if (!power_control_enabled_) {
     LOG(ERROR) << "Power control is not enabled";
     return;
   }
 
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     LOG(ERROR) << "Invalid input";
     return;
   }
@@ -262,7 +262,7 @@
     return;
   }
 
-  const std::string mode = args->GetList()[0].GetString();
+  const std::string mode = args->GetListDeprecated()[0].GetString();
   if (mode == kThrottlingDisable) {
     observer->SetActive(true);
     observer->SetEnforced(true);
@@ -279,12 +279,12 @@
 }
 
 void ArcPowerControlHandler::HandleStartTracing(const base::ListValue* args) {
-  DCHECK(!args->GetList().size());
+  DCHECK(!args->GetListDeprecated().size());
   StartTracing();
 }
 
 void ArcPowerControlHandler::HandleStopTracing(const base::ListValue* args) {
-  DCHECK(!args->GetList().size());
+  DCHECK(!args->GetListDeprecated().size());
   StopTracing();
 }
 
diff --git a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
index cf68da2..b022373e 100644
--- a/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/chromeos/edu_coexistence/edu_coexistence_login_handler_chromeos.cc
@@ -259,7 +259,7 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  initialize_edu_args_callback_ = args->GetList()[0].GetString();
+  initialize_edu_args_callback_ = args->GetListDeprecated()[0].GetString();
 
   if (in_error_state_) {
     FireWebUIListener(kOnErrorWebUIListener);
@@ -333,14 +333,15 @@
 }
 
 void EduCoexistenceLoginHandler::ConsentLogged(const base::ListValue* args) {
-  if (!args || args->GetList().size() == 0)
+  if (!args || args->GetListDeprecated().size() == 0)
     return;
 
   DCHECK(!in_error_state_);
 
-  account_added_callback_ = args->GetList()[0].GetString();
+  account_added_callback_ = args->GetListDeprecated()[0].GetString();
 
-  const base::Value::ConstListView& arguments = args->GetList()[1].GetList();
+  const base::Value::ConstListView& arguments =
+      args->GetListDeprecated()[1].GetList();
 
   edu_account_email_ = arguments[0].GetString();
   terms_of_service_version_number_ = arguments[1].GetString();
@@ -352,10 +353,10 @@
 
 void EduCoexistenceLoginHandler::OnError(const base::ListValue* args) {
   AllowJavascript();
-  if (!args || args->GetList().size() == 0)
+  if (!args || args->GetListDeprecated().size() == 0)
     return;
   in_error_state_ = true;
-  const base::Value::ConstListView& arguments = args->GetList();
+  const base::Value::ConstListView& arguments = args->GetListDeprecated();
   for (const base::Value& message : arguments) {
     DCHECK(message.is_string());
     LOG(ERROR) << message.GetString();
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc
index 3dda452..d177534 100644
--- a/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/confirm_password_change_handler.cc
@@ -53,7 +53,7 @@
 
 void ConfirmPasswordChangeHandler::HandleGetInitialState(
     const base::ListValue* params) {
-  const std::string callback_id = params->GetList()[0].GetString();
+  const std::string callback_id = params->GetListDeprecated()[0].GetString();
 
   base::Value state(base::Value::Type::DICTIONARY);
   state.SetBoolKey("showOldPasswordPrompt", scraped_old_password_.empty());
@@ -66,10 +66,10 @@
 
 void ConfirmPasswordChangeHandler::HandleChangePassword(
     const base::ListValue* params) {
-  const std::string old_password =
-      FirstNonEmpty(params->GetList()[0].GetString(), scraped_old_password_);
-  const std::string new_password =
-      FirstNonEmpty(params->GetList()[1].GetString(), scraped_new_password_);
+  const std::string old_password = FirstNonEmpty(
+      params->GetListDeprecated()[0].GetString(), scraped_old_password_);
+  const std::string new_password = FirstNonEmpty(
+      params->GetListDeprecated()[1].GetString(), scraped_new_password_);
   DCHECK(!old_password.empty() && !new_password.empty());
 
   InSessionPasswordChangeManager::Get()->ChangePassword(
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc
index a0984a5..5b1fc21 100644
--- a/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/password_change_handler.cc
@@ -45,8 +45,8 @@
 
 void PasswordChangeHandler::HandleChangePassword(
     const base::ListValue* params) {
-  const base::Value& old_passwords = params->GetList()[0];
-  const base::Value& new_passwords = params->GetList()[1];
+  const base::Value& old_passwords = params->GetListDeprecated()[0];
+  const base::Value& new_passwords = params->GetListDeprecated()[1];
   VLOG(4) << "Scraped " << old_passwords.GetList().size() << " old passwords";
   VLOG(4) << "Scraped " << new_passwords.GetList().size() << " new passwords";
 
diff --git a/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc b/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
index 4030125..66ab049 100644
--- a/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/in_session_password_change/urgent_password_expiry_notification_handler.cc
@@ -30,8 +30,8 @@
 
 void UrgentPasswordExpiryNotificationHandler::HandleGetTitleText(
     const base::ListValue* params) {
-  const std::string callback_id = params->GetList()[0].GetString();
-  const int ms_until_expiry = params->GetList()[1].GetInt();
+  const std::string callback_id = params->GetListDeprecated()[0].GetString();
+  const int ms_until_expiry = params->GetListDeprecated()[1].GetInt();
 
   const std::u16string title = PasswordExpiryNotification::GetTitleText(
       base::Milliseconds(ms_until_expiry));
diff --git a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc
index 116a53e..551d6ab 100644
--- a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc
@@ -21,7 +21,7 @@
   const PrefService* pref_service = profile->GetPrefs();
   return static_cast<int>(
       pref_service->Get(arc::prefs::kArcFastAppReinstallPackages)
-          ->GetList()
+          ->GetListDeprecated()
           .size());
 }
 
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index 7527006d..4548ae4 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -362,8 +362,8 @@
 
 void CoreOobeHandler::HandleGetPrimaryDisplayNameForTesting(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   cros_display_config_->GetDisplayUnitInfoList(
       false /* single_unified */,
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 73f4e45f..a7d3480 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -940,8 +940,9 @@
 
   std::string email;
   // `args` can be null if it's OOBE.
-  if (args && !args->GetList().empty() && args->GetList()[0].is_string()) {
-    email = args->GetList()[0].GetString();
+  if (args && !args->GetListDeprecated().empty() &&
+      args->GetListDeprecated()[0].is_string()) {
+    email = args->GetListDeprecated()[0].GetString();
   }
   populated_account_id_ = AccountId::FromUserEmail(email);
   OnShowAddUser();
diff --git a/chrome/browser/ui/webui/chromeos/login/l10n_util.cc b/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
index 47bafd7..eed65e4 100644
--- a/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
+++ b/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
@@ -393,8 +393,8 @@
 
 void AdjustUILanguageList(const std::string& selected,
                           base::ListValue* languages_list) {
-  for (size_t i = 0; i < languages_list->GetList().size(); ++i) {
-    base::Value& language_info = languages_list->GetList()[i];
+  for (size_t i = 0; i < languages_list->GetListDeprecated().size(); ++i) {
+    base::Value& language_info = languages_list->GetListDeprecated()[i];
     if (!language_info.is_dict())
       NOTREACHED();
 
diff --git a/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc b/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc
index 099a586..a538227 100644
--- a/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc
+++ b/chrome/browser/ui/webui/chromeos/login/l10n_util_unittest.cc
@@ -170,7 +170,7 @@
   VerifyOnlyUILanguages(*list);
 
   // (4 languages (except Irish) + divider) = 5 + all other languages
-  ASSERT_LE(5u, list->GetList().size());
+  ASSERT_LE(5u, list->GetListDeprecated().size());
 
   VerifyLanguageCode(*list, 0, "fr");
   VerifyLanguageCode(*list, 1, "en-US");
@@ -191,7 +191,7 @@
 
   VerifyOnlyUILanguages(*list);
 
-  ASSERT_LE(3u, list->GetList().size());
+  ASSERT_LE(3u, list->GetListDeprecated().size());
 
   VerifyLanguageCode(*list, 0, "it");
   VerifyLanguageCode(*list, 1, "de");
diff --git a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
index 0800640..b852346 100644
--- a/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/network_dropdown_handler.cc
@@ -68,9 +68,9 @@
 
 void NetworkDropdownHandler::HandleShowNetworkDetails(
     const base::ListValue* args) {
-  DCHECK_GE(args->GetList().size(), 2U);
-  std::string type = args->GetList()[0].GetString();
-  std::string guid = args->GetList()[1].GetString();
+  DCHECK_GE(args->GetListDeprecated().size(), 2U);
+  std::string type = args->GetListDeprecated()[0].GetString();
+  std::string guid = args->GetListDeprecated()[1].GetString();
   if (type == ::onc::network_type::kCellular) {
     // Make sure Cellular is enabled.
     NetworkStateHandler* handler =
@@ -87,8 +87,8 @@
 
 void NetworkDropdownHandler::HandleShowNetworkConfig(
     const base::ListValue* args) {
-  DCHECK(!args->GetList().empty());
-  std::string guid = args->GetList()[0].GetString();
+  DCHECK(!args->GetListDeprecated().empty());
+  std::string guid = args->GetListDeprecated()[0].GetString();
   chromeos::InternetConfigDialog::ShowDialogForNetworkId(
       guid, LoginDisplayHost::default_host()->GetNativeWindow());
 }
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index f9cf648e..3e7277a 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -161,7 +161,11 @@
 constexpr char kLoginJSPath[] = "login.js";
 constexpr char kOobeJSPath[] = "oobe.js";
 constexpr char kProductLogoPath[] = "product-logo.png";
-constexpr char kRecommendAppListViewJSPath[] = "recommend_app_list_view.js";
+// TODO(crbug.com/1261902): Remove.
+constexpr char kRecommendAppOldListViewJSPath[] =
+    "recommend_app_old_list_view.js";
+// TODO(crbug.com/1198865): Uncomment once feature flag switch is enabled.
+// constexpr char kRecommendAppListViewJSPath[] = "recommend_app_list_view.js";
 constexpr char kTestAPIJSPath[] = "test_api.js";
 constexpr char kTestAPIJsMPath[] = "test_api/test_api.m.js";
 constexpr char kWebviewSamlInjectedJSPath[] = "webview_saml_injected.js";
@@ -214,8 +218,8 @@
   source->AddResourcePath(kArcPlaystoreLogoPath,
                           IDR_ARC_SUPPORT_PLAYSTORE_LOGO);
 
-  source->AddResourcePath(kRecommendAppListViewJSPath,
-                          IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_JS);
+  source->AddResourcePath(kRecommendAppOldListViewJSPath,
+                          IDR_ARC_SUPPORT_RECOMMEND_APP_OLD_LIST_VIEW_JS);
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   source->AddResourcePath(kArcAppDownloadingVideoPath,
                           IDR_OOBE_ARC_APPS_DOWNLOADING_VIDEO);
diff --git a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
index ff3d9b99..67ba54dc 100644
--- a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.cc
@@ -142,9 +142,9 @@
   const ui::ResourceBundle& resource_bundle =
       ui::ResourceBundle::GetSharedInstance();
   std::string app_list_webview = resource_bundle.LoadDataResourceString(
-      IDR_ARC_SUPPORT_RECOMMEND_APP_LIST_VIEW_HTML);
-  CallJS("login.RecommendAppsScreen.setWebview", app_list_webview);
-  CallJS("login.RecommendAppsScreen.loadAppList", app_list);
+      IDR_ARC_SUPPORT_RECOMMEND_APP_OLD_LIST_VIEW_HTML);
+  CallJS("login.RecommendAppsOldScreen.setWebview", app_list_webview);
+  CallJS("login.RecommendAppsOldScreen.loadAppList", app_list);
 }
 
 void RecommendAppsScreenHandler::OnUserSkip() {
@@ -164,7 +164,7 @@
 
 void RecommendAppsScreenHandler::HandleInstall(const base::ListValue* args) {
   if (recommended_app_count_ != 0) {
-    int selected_app_count = static_cast<int>(args->GetList().size());
+    int selected_app_count = static_cast<int>(args->GetListDeprecated().size());
     int selected_recommended_percentage =
         100 * selected_app_count / recommended_app_count_;
     RecordUmaUserSelectionAppCount(selected_app_count);
@@ -173,7 +173,7 @@
 
   // If the user does not select any apps, we should skip the app downloading
   // screen.
-  if (args->GetList().empty()) {
+  if (args->GetListDeprecated().empty()) {
     RecordUmaScreenAction(RecommendAppsScreenAction::SELECTED_NONE);
     HandleSkip();
     return;
diff --git a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
index 5ff9ac4..ff29af9 100644
--- a/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/recommend_apps_screen_handler.h
@@ -19,7 +19,7 @@
 // WebUI representation.
 class RecommendAppsScreenView {
  public:
-  constexpr static StaticOobeScreenId kScreenId{"recommend-apps"};
+  constexpr static StaticOobeScreenId kScreenId{"recommend-apps-old"};
 
   virtual ~RecommendAppsScreenView() = default;
 
diff --git a/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc b/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
index 81703a77..5f915f9 100644
--- a/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/saml_challenge_key_handler.cc
@@ -44,12 +44,13 @@
     return false;
   }
 
-  if (patterns->GetList().size() >= kPatternsSizeWarningLevel) {
-    LOG(WARNING) << "Allowed urls list size is " << patterns->GetList().size()
+  if (patterns->GetListDeprecated().size() >= kPatternsSizeWarningLevel) {
+    LOG(WARNING) << "Allowed urls list size is "
+                 << patterns->GetListDeprecated().size()
                  << ". Check may be slow.";
   }
 
-  for (const base::Value& cur_pattern : patterns->GetList()) {
+  for (const base::Value& cur_pattern : patterns->GetListDeprecated()) {
     if (ContentSettingsPattern::FromString(cur_pattern.GetString())
             .Matches(url)) {
       return true;
diff --git a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
index eb20c7f..1b56e65 100644
--- a/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.cc
@@ -391,7 +391,7 @@
 
   base::ListValue timezone_list;
   std::unique_ptr<base::ListValue> timezones = system::GetTimezoneList();
-  base::Value::ConstListView timezones_view = timezones->GetList();
+  base::Value::ConstListView timezones_view = timezones->GetListDeprecated();
   for (size_t i = 0; i < timezones_view.size(); ++i) {
     CHECK(timezones_view[i].is_list());
     base::Value::ConstListView timezone = timezones_view[i].GetList();
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_logs_handler.cc b/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_logs_handler.cc
index 76001fd..3b2387b 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_logs_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_logs_handler.cc
@@ -60,7 +60,7 @@
 
 void MultideviceLogsHandler::HandleGetLogMessages(const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   base::Value list(base::Value::Type::LIST);
   for (const auto& log :
        *chromeos::multidevice::LogBuffer::GetInstance()->logs()) {
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc b/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc
index 1eb34d7..ac23d55 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/multidevice_internals/multidevice_internals_phone_hub_handler.cc
@@ -307,7 +307,7 @@
 }
 
 void MultidevicePhoneHubHandler::HandleEnableDnd(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool enabled = list[0].GetBool();
   PA_LOG(VERBOSE) << "Setting Do Not Disturb state to " << enabled;
@@ -318,7 +318,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetFindMyDeviceStatus(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 1u);
   int status_as_int = list[0].GetInt();
 
@@ -331,7 +331,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetTetherStatus(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 1u);
   int status_as_int = list[0].GetInt();
 
@@ -367,7 +367,7 @@
 void MultidevicePhoneHubHandler::HandleEnableFakePhoneHubManager(
     const base::ListValue* args) {
   AllowJavascript();
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool enabled = list[0].GetBool();
   if (enabled) {
@@ -379,7 +379,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetFeatureStatus(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 1u);
   int feature_as_int = list[0].GetInt();
 
@@ -390,7 +390,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetShowOnboardingFlow(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool show_onboarding_flow = list[0].GetBool();
   PA_LOG(VERBOSE) << "Setting show onboarding flow to " << show_onboarding_flow;
@@ -400,7 +400,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetFakePhoneName(
     const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_GE(args_list.size(), 1u);
   std::u16string phone_name = base::UTF8ToUTF16(args_list[0].GetString());
   fake_phone_hub_manager_->mutable_phone_model()->SetPhoneName(phone_name);
@@ -409,7 +409,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetFakePhoneStatus(
     const base::ListValue* args) {
-  const base::Value& phones_status_value = args->GetList()[0];
+  const base::Value& phones_status_value = args->GetListDeprecated()[0];
   CHECK(phones_status_value.is_dict());
 
   absl::optional<int> mobile_status_as_int =
@@ -469,7 +469,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetBrowserTabs(
     const base::ListValue* args) {
-  const base::Value& browser_tab_status_value = args->GetList()[0];
+  const base::Value& browser_tab_status_value = args->GetListDeprecated()[0];
   CHECK(browser_tab_status_value.is_dict());
   const base::DictionaryValue* browser_tab_status_dict =
       static_cast<const base::DictionaryValue*>(&browser_tab_status_value);
@@ -505,7 +505,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetNotification(
     const base::ListValue* args) {
-  const base::Value& notification_data_value = args->GetList()[0];
+  const base::Value& notification_data_value = args->GetListDeprecated()[0];
   CHECK(notification_data_value.is_dict());
 
   absl::optional<int> id = notification_data_value.FindIntKey("id");
@@ -581,7 +581,7 @@
 
 void MultidevicePhoneHubHandler::HandleRemoveNotification(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 1u);
   int notification_id = list[0].GetInt();
   fake_phone_hub_manager_->fake_notification_manager()->RemoveNotification(
@@ -613,7 +613,7 @@
 
 void MultidevicePhoneHubHandler::HandleSetFakeCameraRoll(
     const base::ListValue* args) {
-  const base::Value& camera_roll_dict = args->GetList()[0];
+  const base::Value& camera_roll_dict = args->GetListDeprecated()[0];
   CHECK(camera_roll_dict.is_dict());
 
   absl::optional<bool> is_camera_roll_enabled =
diff --git a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc
index eb54cf1..0280575e 100644
--- a/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/multidevice_setup/multidevice_setup_handler.cc
@@ -39,8 +39,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  DCHECK(!args->GetList().empty());
-  std::string callback_id = args->GetList()[0].GetString();
+  DCHECK(!args->GetListDeprecated().empty());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   const user_manager::User* user =
       chromeos::ProfileHelper::Get()->GetUserByProfile(
@@ -59,7 +59,7 @@
 
 void MultideviceSetupHandler::HandleOpenMultiDeviceSettings(
     const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   chrome::SettingsWindowManager::GetInstance()->ShowOSSettings(
       Profile::FromWebUI(web_ui()),
       chromeos::settings::mojom::kMultiDeviceFeaturesSubpagePath);
diff --git a/chrome/browser/ui/webui/chromeos/network_logs_message_handler.cc b/chrome/browser/ui/webui/chromeos/network_logs_message_handler.cc
index 6e27eb7..117f6243 100644
--- a/chrome/browser/ui/webui/chromeos/network_logs_message_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/network_logs_message_handler.cc
@@ -85,9 +85,9 @@
 }
 
 void NetworkLogsMessageHandler::OnStoreLogs(const base::ListValue* list) {
-  CHECK_EQ(2u, list->GetList().size());
-  std::string callback_id = list->GetList()[0].GetString();
-  const base::Value& options = list->GetList()[1];
+  CHECK_EQ(2u, list->GetListDeprecated().size());
+  std::string callback_id = list->GetListDeprecated()[0].GetString();
+  const base::Value& options = list->GetListDeprecated()[1];
   AllowJavascript();
 
   if (GetBoolOrFalse(options, "systemLogs")) {
@@ -180,9 +180,9 @@
 
 void NetworkLogsMessageHandler::OnSetShillDebugging(
     const base::ListValue* list) {
-  CHECK_EQ(2u, list->GetList().size());
-  std::string callback_id = list->GetList()[0].GetString();
-  std::string subsystem = list->GetList()[1].GetString();
+  CHECK_EQ(2u, list->GetListDeprecated().size());
+  std::string callback_id = list->GetListDeprecated()[0].GetString();
+  std::string subsystem = list->GetListDeprecated()[1].GetString();
   AllowJavascript();
   chromeos::DBusThreadManager::Get()->GetDebugDaemonClient()->SetDebugMode(
       subsystem,
diff --git a/chrome/browser/ui/webui/chromeos/network_ui.cc b/chrome/browser/ui/webui/chromeos/network_ui.cc
index 7b357aa..f5444b7 100644
--- a/chrome/browser/ui/webui/chromeos/network_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/network_ui.cc
@@ -197,9 +197,9 @@
   }
 
   void GetShillNetworkProperties(const base::ListValue* arg_list) {
-    CHECK_EQ(2u, arg_list->GetList().size());
-    std::string callback_id = arg_list->GetList()[0].GetString();
-    std::string guid = arg_list->GetList()[1].GetString();
+    CHECK_EQ(2u, arg_list->GetListDeprecated().size());
+    std::string callback_id = arg_list->GetListDeprecated()[0].GetString();
+    std::string guid = arg_list->GetListDeprecated()[1].GetString();
 
     std::string service_path;
     if (!GetServicePathFromGuid(guid, &service_path)) {
@@ -232,9 +232,9 @@
   }
 
   void GetShillDeviceProperties(const base::ListValue* arg_list) {
-    CHECK_EQ(2u, arg_list->GetList().size());
-    std::string callback_id = arg_list->GetList()[0].GetString();
-    std::string type = arg_list->GetList()[1].GetString();
+    CHECK_EQ(2u, arg_list->GetListDeprecated().size());
+    std::string callback_id = arg_list->GetListDeprecated()[0].GetString();
+    std::string type = arg_list->GetListDeprecated()[1].GetString();
 
     const DeviceState* device =
         NetworkHandler::Get()->network_state_handler()->GetDeviceStateByType(
@@ -251,8 +251,8 @@
   }
 
   void GetShillEthernetEAP(const base::ListValue* arg_list) {
-    CHECK_EQ(1u, arg_list->GetList().size());
-    std::string callback_id = arg_list->GetList()[0].GetString();
+    CHECK_EQ(1u, arg_list->GetListDeprecated().size());
+    std::string callback_id = arg_list->GetListDeprecated()[0].GetString();
 
     NetworkStateHandler::NetworkStateList list;
     NetworkHandler::Get()->network_state_handler()->GetNetworkListByType(
@@ -275,8 +275,8 @@
   }
 
   void OpenCellularActivationUi(const base::ListValue* arg_list) {
-    CHECK_EQ(1u, arg_list->GetList().size());
-    std::string callback_id = arg_list->GetList()[0].GetString();
+    CHECK_EQ(1u, arg_list->GetListDeprecated().size());
+    std::string callback_id = arg_list->GetListDeprecated()[0].GetString();
 
     const NetworkState* cellular_network =
         NetworkHandler::Get()->network_state_handler()->FirstNetworkByType(
@@ -302,15 +302,15 @@
   }
 
   void ShowNetworkDetails(const base::ListValue* arg_list) {
-    CHECK_EQ(1u, arg_list->GetList().size());
-    std::string guid = arg_list->GetList()[0].GetString();
+    CHECK_EQ(1u, arg_list->GetListDeprecated().size());
+    std::string guid = arg_list->GetListDeprecated()[0].GetString();
 
     InternetDetailDialog::ShowDialog(guid);
   }
 
   void ShowNetworkConfig(const base::ListValue* arg_list) {
-    CHECK_EQ(1u, arg_list->GetList().size());
-    std::string guid = arg_list->GetList()[0].GetString();
+    CHECK_EQ(1u, arg_list->GetListDeprecated().size());
+    std::string guid = arg_list->GetListDeprecated()[0].GetString();
 
     InternetConfigDialog::ShowDialogForNetworkId(guid);
   }
@@ -338,16 +338,16 @@
   }
 
   void GetHostname(const base::ListValue* arg_list) {
-    CHECK_EQ(1u, arg_list->GetList().size());
-    std::string callback_id = arg_list->GetList()[0].GetString();
+    CHECK_EQ(1u, arg_list->GetListDeprecated().size());
+    std::string callback_id = arg_list->GetListDeprecated()[0].GetString();
     std::string hostname =
         NetworkHandler::Get()->network_state_handler()->hostname();
     Respond(callback_id, base::Value(hostname));
   }
 
   void SetHostname(const base::ListValue* arg_list) {
-    CHECK_EQ(1u, arg_list->GetList().size());
-    std::string hostname = arg_list->GetList()[0].GetString();
+    CHECK_EQ(1u, arg_list->GetListDeprecated().size());
+    std::string hostname = arg_list->GetListDeprecated()[0].GetString();
     NET_LOG(USER) << "SET HOSTNAME: " << hostname;
     NetworkHandler::Get()->network_state_handler()->SetHostname(hostname);
   }
@@ -377,8 +377,8 @@
   }
 
   void AddNetwork(const base::ListValue* args) {
-    DCHECK(!args->GetList().empty());
-    std::string onc_type = args->GetList()[0].GetString();
+    DCHECK(!args->GetListDeprecated().empty());
+    std::string onc_type = args->GetListDeprecated()[0].GetString();
     InternetConfigDialog::ShowDialogForNetworkType(onc_type);
   }
 
diff --git a/chrome/browser/ui/webui/chromeos/onc_import_message_handler.cc b/chrome/browser/ui/webui/chromeos/onc_import_message_handler.cc
index 32c2b9b..43471d8 100644
--- a/chrome/browser/ui/webui/chromeos/onc_import_message_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/onc_import_message_handler.cc
@@ -61,9 +61,9 @@
 }
 
 void OncImportMessageHandler::OnImportONC(const base::ListValue* list) {
-  CHECK_EQ(2u, list->GetList().size());
-  std::string callback_id = list->GetList()[0].GetString();
-  std::string onc_blob = list->GetList()[1].GetString();
+  CHECK_EQ(2u, list->GetListDeprecated().size());
+  std::string callback_id = list->GetListDeprecated()[0].GetString();
+  std::string onc_blob = list->GetListDeprecated()[1].GetString();
   AllowJavascript();
 
   // TODO(https://crbug.com/1186373): Pass the `NssCertDatabaseGetter` to
diff --git a/chrome/browser/ui/webui/chromeos/power_ui.cc b/chrome/browser/ui/webui/chromeos/power_ui.cc
index f1b04ed..3255558 100644
--- a/chrome/browser/ui/webui/chromeos/power_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/power_ui.cc
@@ -108,7 +108,7 @@
   base::DictionaryValue data;
   data.SetKey("powerSupplyData", std::move(js_power_supply_data));
   data.SetKey("systemResumedData", std::move(js_system_resumed_data));
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, data);
 }
 
@@ -131,7 +131,7 @@
   base::DictionaryValue data;
   data.SetKey("idleStateData", std::move(js_idle_data));
   data.SetKey("systemResumedData", std::move(js_system_resumed_data));
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, data);
 }
 
@@ -154,15 +154,15 @@
   base::DictionaryValue data;
   data.SetKey("freqStateData", std::move(js_freq_data));
   data.SetKey("systemResumedData", std::move(js_system_resumed_data));
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, data);
 }
 
 void PowerMessageHandler::OnGetProcessUsageData(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   const std::vector<ProcessDataCollector::ProcessUsageData>& process_list =
       ProcessDataCollector::Get()->GetProcessUsages();
diff --git a/chrome/browser/ui/webui/chromeos/set_time_ui.cc b/chrome/browser/ui/webui/chromeos/set_time_ui.cc
index 68003af..da4186b 100644
--- a/chrome/browser/ui/webui/chromeos/set_time_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/set_time_ui.cc
@@ -103,7 +103,7 @@
   // new time. Expects the time as the number of seconds since the Unix
   // epoch, treated as a double.
   void OnSetTime(const base::ListValue* args) {
-    double seconds = args->GetList()[0].GetDouble();
+    double seconds = args->GetListDeprecated()[0].GetDouble();
     SystemClockClient::Get()->SetTime(static_cast<int64_t>(seconds));
   }
 
@@ -111,11 +111,12 @@
   // selects a new time zone. Expects the time zone ID as a string, as it
   // appears in the time zone option values.
   void OnSetTimezone(const base::ListValue* args) {
-    if (args->GetList().empty() || !args->GetList()[0].is_string()) {
+    if (args->GetListDeprecated().empty() ||
+        !args->GetListDeprecated()[0].is_string()) {
       NOTREACHED();
       return;
     }
-    std::string timezone_id = args->GetList()[0].GetString();
+    std::string timezone_id = args->GetListDeprecated()[0].GetString();
 
     Profile* profile = Profile::FromWebUI(web_ui());
     DCHECK(profile);
@@ -129,7 +130,7 @@
       return;
     }
 
-    double seconds = args->GetList()[0].GetDouble();
+    double seconds = args->GetListDeprecated()[0].GetDouble();
     AccountId account_id;
     bool is_user_logged_in = user_manager::UserManager::Get()->IsUserLoggedIn();
     if (is_user_logged_in) {
diff --git a/chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.cc b/chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.cc
index 62f5443..bfa99b6 100644
--- a/chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.cc
@@ -57,16 +57,17 @@
 }
 
 void SmbHandler::HandleSmbMount(const base::ListValue* args) {
-  CHECK_EQ(8U, args->GetList().size());
+  CHECK_EQ(8U, args->GetListDeprecated().size());
 
-  std::string callback_id = args->GetList()[0].GetString();
-  std::string mount_url = args->GetList()[1].GetString();
-  std::string mount_name = args->GetList()[2].GetString();
-  std::string username = args->GetList()[3].GetString();
-  std::string password = args->GetList()[4].GetString();
-  bool use_kerberos = args->GetList()[5].GetBool();
-  bool should_open_file_manager_after_mount = args->GetList()[6].GetBool();
-  bool save_credentials = args->GetList()[7].GetBool();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  std::string mount_url = args->GetListDeprecated()[1].GetString();
+  std::string mount_name = args->GetListDeprecated()[2].GetString();
+  std::string username = args->GetListDeprecated()[3].GetString();
+  std::string password = args->GetListDeprecated()[4].GetString();
+  bool use_kerberos = args->GetListDeprecated()[5].GetBool();
+  bool should_open_file_manager_after_mount =
+      args->GetListDeprecated()[6].GetBool();
+  bool save_credentials = args->GetListDeprecated()[7].GetBool();
 
   smb_client::SmbService* const service = GetSmbService(profile_);
   if (!service) {
@@ -127,11 +128,11 @@
 }
 
 void SmbHandler::HandleUpdateCredentials(const base::ListValue* args) {
-  CHECK_EQ(3U, args->GetList().size());
+  CHECK_EQ(3U, args->GetListDeprecated().size());
 
-  std::string mount_id = args->GetList()[0].GetString();
-  std::string username = args->GetList()[1].GetString();
-  std::string password = args->GetList()[2].GetString();
+  std::string mount_id = args->GetListDeprecated()[0].GetString();
+  std::string username = args->GetListDeprecated()[1].GetString();
+  std::string password = args->GetListDeprecated()[2].GetString();
 
   DCHECK(update_cred_callback_);
   std::move(update_cred_callback_).Run(username, password);
diff --git a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
index d8fb81c6..59876572 100644
--- a/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/sync/os_sync_handler.cc
@@ -83,8 +83,8 @@
 }
 
 void OSSyncHandler::HandleSetOsSyncDatatypes(const base::ListValue* args) {
-  CHECK_EQ(1u, args->GetList().size());
-  const base::Value& result_value = args->GetList()[0];
+  CHECK_EQ(1u, args->GetListDeprecated().size());
+  const base::Value& result_value = args->GetListDeprecated()[0];
   CHECK(result_value.is_dict());
   const base::DictionaryValue& result =
       base::Value::AsDictionaryValue(result_value);
diff --git a/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.cc b/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.cc
index d3bcf89..6421ab5f 100644
--- a/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.cc
@@ -215,7 +215,7 @@
   DCHECK(args);
 
   AllowJavascript();
-  base::Value::ConstListView list = args->GetList();
+  base::Value::ConstListView list = args->GetListDeprecated();
   if (list.size() != 1 || !list[0].is_string()) {
     NOTREACHED();
     return;
diff --git a/chrome/browser/ui/webui/commander/commander_handler.cc b/chrome/browser/ui/webui/commander/commander_handler.cc
index 33187dff..4b02716 100644
--- a/chrome/browser/ui/webui/commander/commander_handler.cc
+++ b/chrome/browser/ui/webui/commander/commander_handler.cc
@@ -67,17 +67,17 @@
 
 void CommanderHandler::HandleTextChanged(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1u, args->GetList().size());
-  std::string text = args->GetList()[0].GetString();
+  CHECK_EQ(1u, args->GetListDeprecated().size());
+  std::string text = args->GetListDeprecated()[0].GetString();
   if (delegate_)
     delegate_->OnTextChanged(base::UTF8ToUTF16(text));
 }
 
 void CommanderHandler::HandleOptionSelected(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2u, args->GetList().size());
-  int index = args->GetList()[0].GetInt();
-  int result_set_id = args->GetList()[1].GetInt();
+  CHECK_EQ(2u, args->GetListDeprecated().size());
+  int index = args->GetListDeprecated()[0].GetInt();
+  int result_set_id = args->GetListDeprecated()[1].GetInt();
   if (delegate_)
     delegate_->OnOptionSelected(index, result_set_id);
 }
@@ -96,8 +96,8 @@
 }
 
 void CommanderHandler::HandleHeightChanged(const base::ListValue* args) {
-  CHECK_EQ(1u, args->GetList().size());
-  int new_height = args->GetList()[0].GetInt();
+  CHECK_EQ(1u, args->GetListDeprecated().size());
+  int new_height = args->GetListDeprecated()[0].GetInt();
   if (delegate_)
     delegate_->OnHeightChanged(new_height);
 }
diff --git a/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc b/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc
index 481597f2..93bb460 100644
--- a/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/commander/commander_ui_browsertest.cc
@@ -153,19 +153,20 @@
   EXPECT_EQ("view-model-updated", call_data.arg1()->GetString());
 
   const base::Value* arg = call_data.arg2();
-  EXPECT_EQ(
-      "Test item",
-      arg->FindPath("options")->GetList()[0].FindPath("title")->GetString());
+  EXPECT_EQ("Test item", arg->FindPath("options")
+                             ->GetListDeprecated()[0]
+                             .FindPath("title")
+                             ->GetString());
   EXPECT_EQ(0, arg->FindPath("options")
-                   ->GetList()[0]
+                   ->GetListDeprecated()[0]
                    .FindPath("matchedRanges")
-                   ->GetList()[0]
+                   ->GetListDeprecated()[0]
                    .GetList()[0]
                    .GetInt());
   EXPECT_EQ(4, arg->FindPath("options")
-                   ->GetList()[0]
+                   ->GetListDeprecated()[0]
                    .FindPath("matchedRanges")
-                   ->GetList()[0]
+                   ->GetListDeprecated()[0]
                    .GetList()[1]
                    .GetInt());
   EXPECT_EQ(42, arg->FindPath("resultSetId")->GetInt());
diff --git a/chrome/browser/ui/webui/components/components_handler.cc b/chrome/browser/ui/webui/components/components_handler.cc
index bf219a1..5ea9f4f4 100644
--- a/chrome/browser/ui/webui/components/components_handler.cc
+++ b/chrome/browser/ui/webui/components/components_handler.cc
@@ -63,7 +63,7 @@
 void ComponentsHandler::HandleRequestComponentsData(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   base::DictionaryValue result;
   result.SetKey("components",
@@ -86,16 +86,16 @@
 // state e.g. If component state is currently updating then we need to disable
 // button. (https://code.google.com/p/chromium/issues/detail?id=272540)
 void ComponentsHandler::HandleCheckUpdate(const base::ListValue* args) {
-  if (args->GetList().size() != 1) {
+  if (args->GetListDeprecated().size() != 1) {
     NOTREACHED();
     return;
   }
 
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     NOTREACHED();
     return;
   }
-  const std::string& component_id = args->GetList()[0].GetString();
+  const std::string& component_id = args->GetListDeprecated()[0].GetString();
 
   OnDemandUpdate(component_id);
 }
diff --git a/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc b/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
index c3a0e206..f4a77de6 100644
--- a/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
+++ b/chrome/browser/ui/webui/conflicts/conflicts_data_fetcher.cc
@@ -479,7 +479,7 @@
   ModuleDatabase::GetInstance()->RemoveObserver(this);
 
   base::DictionaryValue results;
-  results.SetInteger("moduleCount", module_list_->GetList().size());
+  results.SetInteger("moduleCount", module_list_->GetListDeprecated().size());
   results.Set("moduleList", std::move(module_list_));
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/browser/ui/webui/conflicts/conflicts_handler.cc b/chrome/browser/ui/webui/conflicts/conflicts_handler.cc
index d1aa0e7..da26c87 100644
--- a/chrome/browser/ui/webui/conflicts/conflicts_handler.cc
+++ b/chrome/browser/ui/webui/conflicts/conflicts_handler.cc
@@ -28,7 +28,7 @@
 
 void ConflictsHandler::HandleRequestModuleList(const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
 
   // Make sure the JS doesn't call 'requestModuleList' more than once.
   // TODO(739291): It would be better to kill the renderer instead of the
diff --git a/chrome/browser/ui/webui/constrained_web_dialog_ui.cc b/chrome/browser/ui/webui/constrained_web_dialog_ui.cc
index 8c5ba47..f6098966f 100644
--- a/chrome/browser/ui/webui/constrained_web_dialog_ui.cc
+++ b/chrome/browser/ui/webui/constrained_web_dialog_ui.cc
@@ -93,9 +93,9 @@
     return;
 
   std::string json_retval;
-  if (!args->GetList().empty()) {
-    if (args->GetList()[0].is_string()) {
-      json_retval = args->GetList()[0].GetString();
+  if (!args->GetListDeprecated().empty()) {
+    if (args->GetListDeprecated()[0].is_string()) {
+      json_retval = args->GetListDeprecated()[0].GetString();
     } else {
       NOTREACHED() << "Could not read JSON argument";
     }
diff --git a/chrome/browser/ui/webui/device_log_ui.cc b/chrome/browser/ui/webui/device_log_ui.cc
index 117165a..fde9d08 100644
--- a/chrome/browser/ui/webui/device_log_ui.cc
+++ b/chrome/browser/ui/webui/device_log_ui.cc
@@ -47,7 +47,7 @@
  private:
   void GetLog(const base::ListValue* value) {
     AllowJavascript();
-    std::string callback_id = value->GetList()[0].GetString();
+    std::string callback_id = value->GetListDeprecated()[0].GetString();
     base::Value data(device_event_log::GetAsString(
         device_event_log::NEWEST_FIRST, "json", "",
         device_event_log::LOG_LEVEL_DEBUG, 0));
diff --git a/chrome/browser/ui/webui/domain_reliability_internals_ui.cc b/chrome/browser/ui/webui/domain_reliability_internals_ui.cc
index a1968e26..e8371b1 100644
--- a/chrome/browser/ui/webui/domain_reliability_internals_ui.cc
+++ b/chrome/browser/ui/webui/domain_reliability_internals_ui.cc
@@ -55,9 +55,9 @@
 
 void DomainReliabilityInternalsHandler::HandleUpdateData(
     const base::ListValue* args) {
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
   AllowJavascript();
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
 
   Profile* profile = Profile::FromWebUI(web_ui());
   network::mojom::NetworkContext* network_context =
diff --git a/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc b/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc
index 824507f2..b17f35f8 100644
--- a/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc
+++ b/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc
@@ -91,7 +91,7 @@
 void DownloadInternalsUIMessageHandler::HandleGetServiceStatus(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id,
                             download_service_->GetLogger()->GetServiceStatus());
 }
@@ -99,15 +99,16 @@
 void DownloadInternalsUIMessageHandler::HandleGetServiceDownloads(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id, download_service_->GetLogger()->GetServiceDownloads());
 }
 
 void DownloadInternalsUIMessageHandler::HandleStartDownload(
     const base::ListValue* args) {
-  CHECK_GT(args->GetList().size(), 1u) << "Missing argument download URL.";
-  GURL url = GURL(args->GetList()[1].GetString());
+  CHECK_GT(args->GetListDeprecated().size(), 1u)
+      << "Missing argument download URL.";
+  GURL url = GURL(args->GetListDeprecated()[1].GetString());
   if (!url.is_valid()) {
     LOG(WARNING) << "Can't parse download URL, try to enter a valid URL.";
     return;
diff --git a/chrome/browser/ui/webui/extensions/ash/kiosk_apps_handler.cc b/chrome/browser/ui/webui/extensions/ash/kiosk_apps_handler.cc
index 40b41e4..3738c21 100644
--- a/chrome/browser/ui/webui/extensions/ash/kiosk_apps_handler.cc
+++ b/chrome/browser/ui/webui/extensions/ash/kiosk_apps_handler.cc
@@ -242,8 +242,8 @@
 
 void KioskAppsHandler::HandleInitializeKioskAppSettings(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   AllowJavascript();
   KioskAppManager::Get()->GetConsumerKioskAutoLaunchStatus(
@@ -252,8 +252,8 @@
 }
 
 void KioskAppsHandler::HandleGetKioskAppSettings(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   ResolveJavascriptCallback(base::Value(callback_id), *GetSettingsDictionary());
 }
@@ -263,7 +263,7 @@
   if (!initialized_ || !is_kiosk_enabled_)
     return;
 
-  const std::string& input = args->GetList()[0].GetString();
+  const std::string& input = args->GetListDeprecated()[0].GetString();
 
   std::string app_id;
   if (!ExtractsAppIdFromInput(input, &app_id)) {
@@ -278,7 +278,7 @@
   if (!initialized_ || !is_kiosk_enabled_)
     return;
 
-  const std::string& app_id = args->GetList()[0].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
 
   kiosk_app_manager_->RemoveApp(app_id, owner_settings_service_);
 }
@@ -288,7 +288,7 @@
   if (!initialized_ || !is_kiosk_enabled_ || !is_auto_launch_enabled_)
     return;
 
-  const std::string& app_id = args->GetList()[0].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
 
   kiosk_app_manager_->SetAutoLaunchApp(app_id, owner_settings_service_);
 }
@@ -298,7 +298,7 @@
   if (!initialized_ || !is_kiosk_enabled_ || !is_auto_launch_enabled_)
     return;
 
-  const std::string& app_id = args->GetList()[0].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
 
   std::string startup_app_id = kiosk_app_manager_->GetAutoLaunchApp();
   if (startup_app_id != app_id)
@@ -312,7 +312,7 @@
   if (!initialized_ || !is_kiosk_enabled_)
     return;
 
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool disable_bailout_shortcut = list[0].GetBool();
 
diff --git a/chrome/browser/ui/webui/extensions/extensions_internals_source.cc b/chrome/browser/ui/webui/extensions/extensions_internals_source.cc
index a0d0583..bd7eea9 100644
--- a/chrome/browser/ui/webui/extensions/extensions_internals_source.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_internals_source.cc
@@ -441,7 +441,7 @@
   }
 
   // Move all of the entries from the map into the output data.
-  for (auto& output_entry : data->GetList()) {
+  for (auto& output_entry : data->GetListDeprecated()) {
     const base::Value* const value = output_entry.FindKey(kInternalsIdKey);
     CHECK(value && value->is_string());
     const auto it = listeners_map.find(value->GetString());
diff --git a/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc b/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc
index 0b7ae5f..6716a708 100644
--- a/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc
+++ b/chrome/browser/ui/webui/extensions/extensions_internals_unittest.cc
@@ -67,9 +67,9 @@
   auto extensions_list = base::JSONReader::Read(source.WriteToString());
   ASSERT_TRUE(extensions_list) << "Failed to parse extensions internals json.";
 
-  EXPECT_EQ(extensions_list->GetList().size(), 1U);
+  EXPECT_EQ(extensions_list->GetListDeprecated().size(), 1U);
 
-  base::Value* extension_1 = &extensions_list->GetList()[0];
+  base::Value* extension_1 = &extensions_list->GetListDeprecated()[0];
   ASSERT_TRUE(extension_1->is_dict());
   base::Value* permissions = extension_1->FindDictKey("permissions");
   ASSERT_TRUE(permissions);
@@ -80,19 +80,25 @@
 
   base::Value* active = permissions->FindDictKey("active");
   ASSERT_NE(active->FindListKey("api"), nullptr);
-  EXPECT_EQ(active->FindListKey("api")->GetList()[0].GetString(), "activeTab");
+  EXPECT_EQ(active->FindListKey("api")->GetListDeprecated()[0].GetString(),
+            "activeTab");
   ASSERT_NE(active->FindListKey("manifest"), nullptr);
-  EXPECT_TRUE(
-      active->FindListKey("manifest")->GetList()[0].FindBoolKey("automation"));
+  EXPECT_TRUE(active->FindListKey("manifest")
+                  ->GetListDeprecated()[0]
+                  .FindBoolKey("automation"));
   ASSERT_NE(active->FindListKey("explicit_hosts"), nullptr);
-  EXPECT_EQ(active->FindListKey("explicit_hosts")->GetList()[0].GetString(),
-            "https://example.com/*");
+  EXPECT_EQ(
+      active->FindListKey("explicit_hosts")->GetListDeprecated()[0].GetString(),
+      "https://example.com/*");
   ASSERT_NE(active->FindListKey("scriptable_hosts"), nullptr);
-  EXPECT_EQ(active->FindListKey("scriptable_hosts")->GetList()[0].GetString(),
+  EXPECT_EQ(active->FindListKey("scriptable_hosts")
+                ->GetListDeprecated()[0]
+                .GetString(),
             "https://chromium.org/foo");
 
   base::Value* optional = permissions->FindDictKey("optional");
-  EXPECT_EQ(optional->FindListKey("api")->GetList()[0].GetString(), "storage");
+  EXPECT_EQ(optional->FindListKey("api")->GetListDeprecated()[0].GetString(),
+            "storage");
 }
 
 // Test that tab-specific permissions show up correctly in the JSON returned by
@@ -110,7 +116,7 @@
   auto extensions_list = base::JSONReader::Read(source.WriteToString());
   ASSERT_TRUE(extensions_list) << "Failed to parse extensions internals json.";
   base::Value* permissions =
-      extensions_list->GetList()[0].FindDictKey("permissions");
+      extensions_list->GetListDeprecated()[0].FindDictKey("permissions");
 
   // Check that initially there is no tab-scpecific data.
   EXPECT_EQ(permissions->FindDictKey("tab_specific")->DictSize(), 0U);
@@ -127,7 +133,8 @@
   extension->permissions_data()->UpdateTabSpecificPermissions(1,
                                                               tab_permissions);
   extensions_list = base::JSONReader::Read(source.WriteToString());
-  permissions = extensions_list->GetList()[0].FindDictKey("permissions");
+  permissions =
+      extensions_list->GetListDeprecated()[0].FindDictKey("permissions");
 
   // Check the tab specific data is present now.
   base::Value* tab_specific = permissions->FindDictKey("tab_specific");
@@ -135,17 +142,17 @@
   EXPECT_EQ(tab_specific->DictSize(), 1U);
   EXPECT_EQ(tab_specific->FindDictKey("1")
                 ->FindListKey("explicit_hosts")
-                ->GetList()[0]
+                ->GetListDeprecated()[0]
                 .GetString(),
             "https://google.com/*");
   EXPECT_EQ(tab_specific->FindDictKey("1")
                 ->FindListKey("scriptable_hosts")
-                ->GetList()[0]
+                ->GetListDeprecated()[0]
                 .GetString(),
             "https://google.com/*");
   EXPECT_EQ(tab_specific->FindDictKey("1")
                 ->FindListKey("api")
-                ->GetList()[0]
+                ->GetListDeprecated()[0]
                 .GetString(),
             "tabs");
 }
@@ -167,33 +174,33 @@
   auto extensions_list = base::JSONReader::Read(source.WriteToString());
   ASSERT_TRUE(extensions_list) << "Failed to parse extensions internals json.";
   base::Value* permissions =
-      extensions_list->GetList()[0].FindDictKey("permissions");
+      extensions_list->GetListDeprecated()[0].FindDictKey("permissions");
 
   // Check the host is initially in active hosts and there are no withheld
   // entries.
   EXPECT_EQ(permissions->FindDictKey("active")
                 ->FindListKey("explicit_hosts")
-                ->GetList()[0]
+                ->GetListDeprecated()[0]
                 .GetString(),
             "https://example.com/*");
   EXPECT_EQ(permissions->FindDictKey("withheld")
                 ->FindListKey("api")
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             0U);
   EXPECT_EQ(permissions->FindDictKey("withheld")
                 ->FindListKey("manifest")
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             0U);
   EXPECT_EQ(permissions->FindDictKey("withheld")
                 ->FindListKey("explicit_hosts")
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             0U);
   EXPECT_EQ(permissions->FindDictKey("withheld")
                 ->FindListKey("scriptable_hosts")
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             0U);
 
@@ -201,17 +208,18 @@
   extensions::ScriptingPermissionsModifier modifier(profile(), extension);
   modifier.SetWithholdHostPermissions(true);
   extensions_list = base::JSONReader::Read(source.WriteToString());
-  permissions = extensions_list->GetList()[0].FindDictKey("permissions");
+  permissions =
+      extensions_list->GetListDeprecated()[0].FindDictKey("permissions");
 
   // Check the host that was active is now withheld.
   EXPECT_EQ(permissions->FindDictKey("active")
                 ->FindListKey("explicit_hosts")
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             0U);
   EXPECT_EQ(permissions->FindDictKey("withheld")
                 ->FindListKey("explicit_hosts")
-                ->GetList()[0]
+                ->GetListDeprecated()[0]
                 .GetString(),
             "https://example.com/*");
 }
diff --git a/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc b/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
index 40ebae4..fbb6b095 100644
--- a/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/family_link_user_internals/family_link_user_internals_message_handler.cc
@@ -161,7 +161,7 @@
 
 void FamilyLinkUserInternalsMessageHandler::HandleRegisterForEvents(
     const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   AllowJavascript();
   if (scoped_observation_.IsObserving())
     return;
@@ -176,11 +176,12 @@
 
 void FamilyLinkUserInternalsMessageHandler::HandleTryURL(
     const base::ListValue* args) {
-  DCHECK_EQ(2u, args->GetList().size());
-  if (!args->GetList()[0].is_string() || !args->GetList()[1].is_string())
+  DCHECK_EQ(2u, args->GetListDeprecated().size());
+  if (!args->GetListDeprecated()[0].is_string() ||
+      !args->GetListDeprecated()[1].is_string())
     return;
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& url_str = args->GetList()[1].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& url_str = args->GetListDeprecated()[1].GetString();
 
   GURL url = url_formatter::FixupURL(url_str, std::string());
   if (!url.is_valid())
diff --git a/chrome/browser/ui/webui/flags/flags_ui_handler.cc b/chrome/browser/ui/webui/flags/flags_ui_handler.cc
index 15dd57e..3378ab19 100644
--- a/chrome/browser/ui/webui/flags/flags_ui_handler.cc
+++ b/chrome/browser/ui/webui/flags/flags_ui_handler.cc
@@ -71,7 +71,7 @@
 void FlagsUIHandler::HandleRequestExperimentalFeatures(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   experimental_features_callback_id_ = callback_id.GetString();
   // Bail out if the handler hasn't been initialized yet. The request will be
@@ -134,16 +134,18 @@
 void FlagsUIHandler::HandleEnableExperimentalFeatureMessage(
     const base::ListValue* args) {
   DCHECK(flags_storage_);
-  DCHECK_EQ(2u, args->GetList().size());
-  if (args->GetList().size() != 2)
+  DCHECK_EQ(2u, args->GetListDeprecated().size());
+  if (args->GetListDeprecated().size() != 2)
     return;
 
-  if (!args->GetList()[0].is_string() || !args->GetList()[1].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string() ||
+      !args->GetListDeprecated()[1].is_string()) {
     NOTREACHED();
     return;
   }
-  const std::string& entry_internal_name = args->GetList()[0].GetString();
-  const std::string& enable_str = args->GetList()[1].GetString();
+  const std::string& entry_internal_name =
+      args->GetListDeprecated()[0].GetString();
+  const std::string& enable_str = args->GetListDeprecated()[1].GetString();
   if (entry_internal_name.empty()) {
     NOTREACHED();
     return;
@@ -156,17 +158,19 @@
 void FlagsUIHandler::HandleSetOriginListFlagMessage(
     const base::ListValue* args) {
   DCHECK(flags_storage_);
-  if (args->GetList().size() != 2) {
+  if (args->GetListDeprecated().size() != 2) {
     NOTREACHED();
     return;
   }
 
-  if (!args->GetList()[0].is_string() || !args->GetList()[1].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string() ||
+      !args->GetListDeprecated()[1].is_string()) {
     NOTREACHED();
     return;
   }
-  const std::string& entry_internal_name = args->GetList()[0].GetString();
-  const std::string& value_str = args->GetList()[1].GetString();
+  const std::string& entry_internal_name =
+      args->GetListDeprecated()[0].GetString();
+  const std::string& value_str = args->GetListDeprecated()[1].GetString();
   if (entry_internal_name.empty()) {
     NOTREACHED();
     return;
diff --git a/chrome/browser/ui/webui/gcm_internals_ui.cc b/chrome/browser/ui/webui/gcm_internals_ui.cc
index cc7c40d..6c275a9 100644
--- a/chrome/browser/ui/webui/gcm_internals_ui.cc
+++ b/chrome/browser/ui/webui/gcm_internals_ui.cc
@@ -80,7 +80,7 @@
 void GcmInternalsUIMessageHandler::RequestAllInfo(
     const base::ListValue* args) {
   AllowJavascript();
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   if (list.size() != 1) {
     NOTREACHED();
     return;
@@ -106,7 +106,7 @@
 }
 
 void GcmInternalsUIMessageHandler::SetRecording(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   if (list.size() != 1) {
     NOTREACHED();
     return;
diff --git a/chrome/browser/ui/webui/help/help_utils_chromeos.cc b/chrome/browser/ui/webui/help/help_utils_chromeos.cc
index baeb212..95d1eac9 100644
--- a/chrome/browser/ui/webui/help/help_utils_chromeos.cc
+++ b/chrome/browser/ui/webui/help/help_utils_chromeos.cc
@@ -32,7 +32,7 @@
   if (!types_value)
     return default_update_over_cellular_allowed;
   CHECK(types_value->is_list());
-  const auto& list = types_value->GetList();
+  const auto& list = types_value->GetListDeprecated();
   for (size_t i = 0; i < list.size(); ++i) {
     if (!list[i].is_int()) {
       LOG(WARNING) << "Can't parse connection type #" << i;
diff --git a/chrome/browser/ui/webui/history/browsing_history_handler.cc b/chrome/browser/ui/webui/history/browsing_history_handler.cc
index 867d4fb9..c1b287ed 100644
--- a/chrome/browser/ui/webui/history/browsing_history_handler.cc
+++ b/chrome/browser/ui/webui/history/browsing_history_handler.cc
@@ -351,7 +351,7 @@
 
 void BrowsingHistoryHandler::HandleQueryHistory(const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   if (!initial_results_.is_none()) {
     ResolveJavascriptCallback(callback_id, std::move(initial_results_));
     initial_results_ = base::Value();
@@ -374,9 +374,9 @@
   // - the text to search for (may be empty)
   // - the maximum number of results to return (may be 0, meaning that there
   //   is no maximum).
-  const base::Value& search_text = args->GetList()[1];
+  const base::Value& search_text = args->GetListDeprecated()[1];
 
-  const base::Value& count = args->GetList()[2];
+  const base::Value& count = args->GetListDeprecated()[2];
   if (!count.is_int()) {
     NOTREACHED() << "Failed to convert argument 2.";
     return;
@@ -395,8 +395,8 @@
 
 void BrowsingHistoryHandler::HandleQueryHistoryContinuation(
     const base::ListValue* args) {
-  CHECK(args->GetList().size() == 1);
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK(args->GetListDeprecated().size() == 1);
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   // Cancel the previous query if it is still in flight.
   if (!query_history_callback_id_.empty()) {
     RejectJavascriptCallback(base::Value(query_history_callback_id_),
@@ -409,13 +409,13 @@
 }
 
 void BrowsingHistoryHandler::HandleRemoveVisits(const base::ListValue* args) {
-  CHECK(args->GetList().size() == 2);
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK(args->GetListDeprecated().size() == 2);
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   CHECK(remove_visits_callback_.empty());
   remove_visits_callback_ = callback_id.GetString();
 
   std::vector<BrowsingHistoryService::HistoryEntry> items_to_remove;
-  const base::Value& items = args->GetList()[1];
+  const base::Value& items = args->GetListDeprecated()[1];
   base::Value::ConstListView list = items.GetList();
   items_to_remove.reserve(list.size());
   for (size_t i = 0; i < list.size(); ++i) {
@@ -432,7 +432,7 @@
       return;
     }
 
-    base::Value::ConstListView timestamps = timestamps_ptr->GetList();
+    base::Value::ConstListView timestamps = timestamps_ptr->GetListDeprecated();
     DCHECK_GT(timestamps.size(), 0U);
     BrowsingHistoryService::HistoryEntry entry;
     entry.url = GURL(*url_ptr);
diff --git a/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc b/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc
index 50da2fa..bee48dc9 100644
--- a/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc
+++ b/chrome/browser/ui/webui/history/browsing_history_handler_unittest.cc
@@ -299,7 +299,7 @@
   const base::Value* list = arg3->FindListKey("value");
   ASSERT_TRUE(list->is_list());
 
-  const base::Value& first_entry = list->GetList()[0];
+  const base::Value& first_entry = list->GetListDeprecated()[0];
   ASSERT_TRUE(first_entry.is_dict());
 
   const std::string* title = first_entry.FindStringKey("title");
diff --git a/chrome/browser/ui/webui/history/foreign_session_handler.cc b/chrome/browser/ui/webui/history/foreign_session_handler.cc
index 8faf9ee..63c126a 100644
--- a/chrome/browser/ui/webui/history/foreign_session_handler.cc
+++ b/chrome/browser/ui/webui/history/foreign_session_handler.cc
@@ -291,7 +291,7 @@
     const base::ListValue* args) {
   AllowJavascript();
   CHECK(!initial_session_list_.is_none());
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, std::move(initial_session_list_));
 
   // Clear the initial list so that it will be reset in AllowJavascript if the
@@ -358,30 +358,32 @@
 
 void ForeignSessionHandler::HandleOpenForeignSession(
     const base::ListValue* args) {
-  size_t num_args = args->GetList().size();
+  size_t num_args = args->GetListDeprecated().size();
   // Expect either 1 or 8 args. For restoring an entire session, only
   // one argument is required -- the session tag. To restore a tab,
   // the additional args required are the window id, the tab id,
   // and 4 properties of the event object (button, altKey, ctrlKey,
   // metaKey, shiftKey) for determining how to open the tab.
   if (num_args != 8U && num_args != 1U) {
-    LOG(ERROR) << "openForeignSession called with " << args->GetList().size()
-               << " arguments.";
+    LOG(ERROR) << "openForeignSession called with "
+               << args->GetListDeprecated().size() << " arguments.";
     return;
   }
 
   // Extract the session tag (always provided).
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     LOG(ERROR) << "Failed to extract session tag.";
     return;
   }
-  const std::string& session_string_value = args->GetList()[0].GetString();
+  const std::string& session_string_value =
+      args->GetListDeprecated()[0].GetString();
 
   // Extract window number.
   int window_num = -1;
   if (num_args >= 2 &&
-      (!args->GetList()[1].is_string() ||
-       !base::StringToInt(args->GetList()[1].GetString(), &window_num))) {
+      (!args->GetListDeprecated()[1].is_string() ||
+       !base::StringToInt(args->GetListDeprecated()[1].GetString(),
+                          &window_num))) {
     LOG(ERROR) << "Failed to extract window number.";
     return;
   }
@@ -389,8 +391,9 @@
   // Extract tab id.
   SessionID::id_type tab_id_value = 0;
   if (num_args >= 3 &&
-      (!args->GetList()[2].is_string() ||
-       !base::StringToInt(args->GetList()[2].GetString(), &tab_id_value))) {
+      (!args->GetListDeprecated()[2].is_string() ||
+       !base::StringToInt(args->GetListDeprecated()[2].GetString(),
+                          &tab_id_value))) {
     LOG(ERROR) << "Failed to extract tab SessionID.";
     return;
   }
@@ -407,17 +410,17 @@
 
 void ForeignSessionHandler::HandleDeleteForeignSession(
     const base::ListValue* args) {
-  if (args->GetList().size() != 1U) {
+  if (args->GetListDeprecated().size() != 1U) {
     LOG(ERROR) << "Wrong number of args to deleteForeignSession";
     return;
   }
 
   // Get the session tag argument (required).
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     LOG(ERROR) << "Unable to extract session tag";
     return;
   }
-  const std::string& session_tag = args->GetList()[0].GetString();
+  const std::string& session_tag = args->GetListDeprecated()[0].GetString();
 
   sync_sessions::OpenTabsUIDelegate* open_tabs =
       GetOpenTabsUIDelegate(web_ui());
@@ -427,18 +430,18 @@
 
 void ForeignSessionHandler::HandleSetForeignSessionCollapsed(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   if (list.size() != 2U) {
     LOG(ERROR) << "Wrong number of args to setForeignSessionCollapsed";
     return;
   }
 
   // Get the session tag argument (required).
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     LOG(ERROR) << "Unable to extract session tag";
     return;
   }
-  const std::string& session_tag = args->GetList()[0].GetString();
+  const std::string& session_tag = args->GetListDeprecated()[0].GetString();
 
   if (!list[1].is_bool()) {
     LOG(ERROR) << "Unable to extract boolean argument";
diff --git a/chrome/browser/ui/webui/history/navigation_handler.cc b/chrome/browser/ui/webui/history/navigation_handler.cc
index f0f27bab..71337fe 100644
--- a/chrome/browser/ui/webui/history/navigation_handler.cc
+++ b/chrome/browser/ui/webui/history/navigation_handler.cc
@@ -26,7 +26,7 @@
 }
 
 void NavigationHandler::HandleNavigateToUrl(const base::ListValue* args) {
-  base::Value::ConstListView list = args->GetList();
+  base::Value::ConstListView list = args->GetListDeprecated();
   const std::string& url_string = list[0].GetString();
   const std::string& target_string = list[1].GetString();
   double button = list[2].GetDouble();
diff --git a/chrome/browser/ui/webui/identity_internals_ui.cc b/chrome/browser/ui/webui/identity_internals_ui.cc
index 0551b1c..0e2736f 100644
--- a/chrome/browser/ui/webui/identity_internals_ui.cc
+++ b/chrome/browser/ui/webui/identity_internals_ui.cc
@@ -228,7 +228,7 @@
 
 void IdentityInternalsUIMessageHandler::GetInfoForAllTokens(
     const base::ListValue* args) {
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
   CHECK(!callback_id.empty());
 
   AllowJavascript();
@@ -262,17 +262,19 @@
 
 void IdentityInternalsUIMessageHandler::RevokeToken(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   const std::string& callback_id = list[0].GetString();
   CHECK(!callback_id.empty());
   std::string extension_id;
   std::string access_token;
   if (!list.empty() && list[kRevokeTokenExtensionOffset].is_string()) {
-    extension_id = args->GetList()[kRevokeTokenExtensionOffset].GetString();
+    extension_id =
+        args->GetListDeprecated()[kRevokeTokenExtensionOffset].GetString();
   }
   if (list.size() > kRevokeTokenTokenOffset &&
       list[kRevokeTokenTokenOffset].is_string()) {
-    access_token = args->GetList()[kRevokeTokenTokenOffset].GetString();
+    access_token =
+        args->GetListDeprecated()[kRevokeTokenTokenOffset].GetString();
   }
 
   token_revokers_.push_back(std::make_unique<IdentityInternalsTokenRevoker>(
diff --git a/chrome/browser/ui/webui/inspect_ui.cc b/chrome/browser/ui/webui/inspect_ui.cc
index 339aae8..e9d7235 100644
--- a/chrome/browser/ui/webui/inspect_ui.cc
+++ b/chrome/browser/ui/webui/inspect_ui.cc
@@ -281,24 +281,24 @@
                             std::string* arg0,
                             std::string* arg1,
                             std::string* arg2 = 0) {
-  int arg_size = args->GetList().size();
+  int arg_size = args->GetListDeprecated().size();
   if (arg0) {
-    if (arg_size < 1 || !args->GetList()[0].is_string()) {
+    if (arg_size < 1 || !args->GetListDeprecated()[0].is_string()) {
       return false;
     }
-    *arg0 = args->GetList()[0].GetString();
+    *arg0 = args->GetListDeprecated()[0].GetString();
   }
   if (arg1) {
-    if (arg_size < 2 || !args->GetList()[1].is_string()) {
+    if (arg_size < 2 || !args->GetListDeprecated()[1].is_string()) {
       return false;
     }
-    *arg1 = args->GetList()[1].GetString();
+    *arg1 = args->GetListDeprecated()[1].GetString();
   }
   if (arg2) {
-    if (arg_size < 3 || !args->GetList()[2].is_string()) {
+    if (arg_size < 3 || !args->GetListDeprecated()[2].is_string()) {
       return false;
     }
-    *arg2 = args->GetList()[2].GetString();
+    *arg2 = args->GetListDeprecated()[2].GetString();
   }
   return true;
 }
@@ -372,7 +372,7 @@
   if (!profile)
     return;
 
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   if (list.size() == 1 && list[0].is_bool())
     profile->GetPrefs()->SetBoolean(pref_name, list[0].GetBool());
 }
@@ -383,8 +383,8 @@
   if (!profile)
     return;
 
-  if (args->GetList().size() == 1) {
-    const base::Value& src = args->GetList()[0];
+  if (args->GetListDeprecated().size() == 1) {
+    const base::Value& src = args->GetListDeprecated()[0];
     if (src.is_dict())
       profile->GetPrefs()->Set(prefs::kDevToolsPortForwardingConfig, src);
   }
@@ -396,7 +396,7 @@
   if (!profile)
     return;
 
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   if (args_list.size() == 1u && args_list[0].is_list())
     profile->GetPrefs()->Set(prefs::kDevToolsTCPDiscoveryConfig, args_list[0]);
 }
diff --git a/chrome/browser/ui/webui/internals/lens/lens_internals_ui_message_handler.cc b/chrome/browser/ui/webui/internals/lens/lens_internals_ui_message_handler.cc
index b26a0c7..ee99348 100644
--- a/chrome/browser/ui/webui/internals/lens/lens_internals_ui_message_handler.cc
+++ b/chrome/browser/ui/webui/internals/lens/lens_internals_ui_message_handler.cc
@@ -45,7 +45,7 @@
 
   Java_LensDebugBridge_startProactiveDebugMode(env);
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, base::Value());
 }
 
@@ -72,7 +72,7 @@
         base::Value(row_as_list_storage));
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id,
                             base::Value(debug_data_as_vector_of_values));
 }
@@ -83,6 +83,6 @@
 
   Java_LensDebugBridge_stopProactiveDebugMode(env);
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, base::Value());
 }
diff --git a/chrome/browser/ui/webui/internals/notifications/notifications_internals_ui_message_handler.cc b/chrome/browser/ui/webui/internals/notifications/notifications_internals_ui_message_handler.cc
index fba36bf..350beab 100644
--- a/chrome/browser/ui/webui/internals/notifications/notifications_internals_ui_message_handler.cc
+++ b/chrome/browser/ui/webui/internals/notifications/notifications_internals_ui_message_handler.cc
@@ -36,15 +36,15 @@
 
 void NotificationsInternalsUIMessageHandler::HandleScheduleNotification(
     const base::ListValue* args) {
-  CHECK_EQ(args->GetList().size(), 3u);
+  CHECK_EQ(args->GetListDeprecated().size(), 3u);
   notifications::ScheduleParams schedule_params;
   schedule_params.deliver_time_start = base::Time::Now();
   schedule_params.deliver_time_end = base::Time::Now() + base::Minutes(5);
   notifications::NotificationData data;
   // TOOD(hesen): Enable adding icons from notifications-internals HTML.
-  data.custom_data.emplace("url", args->GetList()[0].GetString());
-  data.title = base::UTF8ToUTF16(args->GetList()[1].GetString());
-  data.message = base::UTF8ToUTF16(args->GetList()[2].GetString());
+  data.custom_data.emplace("url", args->GetListDeprecated()[0].GetString());
+  data.title = base::UTF8ToUTF16(args->GetListDeprecated()[1].GetString());
+  data.message = base::UTF8ToUTF16(args->GetListDeprecated()[2].GetString());
   auto params = std::make_unique<notifications::NotificationParams>(
       notifications::SchedulerClientType::kWebUI, std::move(data),
       std::move(schedule_params));
diff --git a/chrome/browser/ui/webui/internals/query_tiles/query_tiles_internals_ui_message_handler.cc b/chrome/browser/ui/webui/internals/query_tiles/query_tiles_internals_ui_message_handler.cc
index ac976626..ee28e7b 100644
--- a/chrome/browser/ui/webui/internals/query_tiles/query_tiles_internals_ui_message_handler.cc
+++ b/chrome/browser/ui/webui/internals/query_tiles/query_tiles_internals_ui_message_handler.cc
@@ -58,7 +58,7 @@
 void QueryTilesInternalsUIMessageHandler::HandleGetTileData(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id,
                             tile_service_->GetLogger()->GetTileData());
 }
@@ -66,7 +66,7 @@
 void QueryTilesInternalsUIMessageHandler::HandleGetServiceStatus(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id,
                             tile_service_->GetLogger()->GetServiceStatus());
 }
@@ -86,8 +86,9 @@
 void QueryTilesInternalsUIMessageHandler::HandleSetServerUrl(
     const base::ListValue* args) {
   AllowJavascript();
-  DCHECK_EQ(args->GetList().size(), 1u) << "Missing argument server URL.";
-  tile_service_->SetServerUrl(args->GetList()[0].GetString());
+  DCHECK_EQ(args->GetListDeprecated().size(), 1u)
+      << "Missing argument server URL.";
+  tile_service_->SetServerUrl(args->GetListDeprecated()[0].GetString());
 }
 
 void QueryTilesInternalsUIMessageHandler::OnServiceStatusChanged(
diff --git a/chrome/browser/ui/webui/management/management_ui.cc b/chrome/browser/ui/webui/management/management_ui.cc
index d7128acd..91109d6 100644
--- a/chrome/browser/ui/webui/management/management_ui.cc
+++ b/chrome/browser/ui/webui/management/management_ui.cc
@@ -126,6 +126,8 @@
     {kManagementOnBulkDataEntryEvent, IDS_MANAGEMENT_TEXT_ENTERED_EVENT},
     {kManagementOnBulkDataEntryVisibleData,
      IDS_MANAGEMENT_TEXT_ENTERED_VISIBLE_DATA},
+    {kManagementOnPrintEvent, IDS_MANAGEMENT_PAGE_PRINTED_EVENT},
+    {kManagementOnPrintVisibleData, IDS_MANAGEMENT_PAGE_PRINTED_VISIBLE_DATA},
     {kManagementOnPageVisitedEvent, IDS_MANAGEMENT_PAGE_VISITED_EVENT},
     {kManagementOnPageVisitedVisibleData,
      IDS_MANAGEMENT_PAGE_VISITED_VISIBLE_DATA},
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.cc b/chrome/browser/ui/webui/management/management_ui_handler.cc
index 667906239..70b4c7b 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler.cc
@@ -138,6 +138,8 @@
 const char kManagementOnBulkDataEntryEvent[] = "managementOnBulkDataEntryEvent";
 const char kManagementOnBulkDataEntryVisibleData[] =
     "managementOnBulkDataEntryVisibleData";
+const char kManagementOnPrintEvent[] = "managementOnPrintEvent";
+const char kManagementOnPrintVisibleData[] = "managementOnPrintVisibleData";
 
 const char kManagementOnPageVisitedEvent[] = "managementOnPageVisitedEvent";
 const char kManagementOnPageVisitedVisibleData[] =
@@ -799,6 +801,8 @@
        kManagementOnFileDownloadedVisibleData},
       {enterprise_connectors::BULK_DATA_ENTRY, kManagementOnBulkDataEntryEvent,
        kManagementOnBulkDataEntryVisibleData},
+      {enterprise_connectors::PRINT, kManagementOnPrintEvent,
+       kManagementOnPrintVisibleData},
   };
   auto* connectors_service =
       enterprise_connectors::ConnectorsServiceFactory::GetForBrowserContext(
@@ -979,14 +983,14 @@
   base::UmaHistogramCounts1000(kPowerfulExtensionsCountHistogram,
                                powerful_extensions.GetList().size());
 
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             powerful_extensions);
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void ManagementUIHandler::HandleGetLocalTrustRootsInfo(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   base::Value trust_roots_configured(false);
   AllowJavascript();
 
@@ -996,7 +1000,7 @@
   if (policy_service && policy_service->has_policy_certificates())
     trust_roots_configured = base::Value(true);
 
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             trust_roots_configured);
 }
 
@@ -1019,18 +1023,18 @@
   AddDeviceReportingInfo(&report_sources, collector, syslog_uploader,
                          Profile::FromWebUI(web_ui()));
 
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             report_sources);
 }
 
 void ManagementUIHandler::HandleGetPluginVmDataCollectionStatus(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   base::Value plugin_vm_data_collection_enabled(
       Profile::FromWebUI(web_ui())->GetPrefs()->GetBoolean(
           plugin_vm::prefs::kPluginVmDataCollectionAllowed));
   AllowJavascript();
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             plugin_vm_data_collection_enabled);
 }
 
@@ -1040,7 +1044,7 @@
     const base::ListValue* args) {
   AllowJavascript();
   auto result = GetContextualManagedData(Profile::FromWebUI(web_ui()));
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             std::move(result));
 }
 
@@ -1048,7 +1052,7 @@
     const base::ListValue* args) {
   AllowJavascript();
   ResolveJavascriptCallback(
-      args->GetList()[0] /* callback_id */,
+      args->GetListDeprecated()[0] /* callback_id */,
       GetThreatProtectionInfo(Profile::FromWebUI(web_ui())));
 }
 
@@ -1057,7 +1061,7 @@
   AllowJavascript();
 
   ResolveJavascriptCallback(
-      args->GetList()[0] /* callback_id */,
+      args->GetListDeprecated()[0] /* callback_id */,
       GetManagedWebsitesInfo(Profile::FromWebUI(web_ui())));
 }
 
@@ -1066,7 +1070,7 @@
   base::Value report_sources(base::Value::Type::LIST);
   AllowJavascript();
   AddReportingInfo(&report_sources);
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             report_sources);
 }
 
diff --git a/chrome/browser/ui/webui/management/management_ui_handler.h b/chrome/browser/ui/webui/management/management_ui_handler.h
index 2d9841b..73bf32d 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler.h
+++ b/chrome/browser/ui/webui/management/management_ui_handler.h
@@ -68,6 +68,8 @@
 extern const char kManagementOnFileDownloadedVisibleData[];
 extern const char kManagementOnBulkDataEntryEvent[];
 extern const char kManagementOnBulkDataEntryVisibleData[];
+extern const char kManagementOnPrintEvent[];
+extern const char kManagementOnPrintVisibleData[];
 extern const char kManagementOnPageVisitedEvent[];
 extern const char kManagementOnPageVisitedVisibleData[];
 
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
index 95e2c91..79969fc 100644
--- a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
+++ b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -1283,7 +1283,8 @@
   auto info = handler_.GetThreatProtectionInfo(profile_no_domain.get());
   ASSERT_TRUE(info.is_dict());
   threat_protection_info = &base::Value::AsDictionaryValue(info);
-  EXPECT_TRUE(threat_protection_info->FindListKey("info")->GetList().empty());
+  EXPECT_TRUE(
+      threat_protection_info->FindListKey("info")->GetListDeprecated().empty());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_MANAGEMENT_THREAT_PROTECTION_DESCRIPTION),
       base::UTF8ToUTF16(*threat_protection_info->FindStringKey("description")));
@@ -1295,6 +1296,8 @@
                           "[]", chrome_policies);
   SetConnectorPolicyValue(policy::key::kOnBulkDataEntryEnterpriseConnector,
                           "[]", chrome_policies);
+  SetConnectorPolicyValue(policy::key::kOnPrintEnterpriseConnector, "[]",
+                          chrome_policies);
   SetConnectorPolicyValue(policy::key::kOnSecurityEventEnterpriseConnector,
                           "[]", chrome_policies);
   profile_no_domain->GetPrefs()->SetInteger(
@@ -1303,7 +1306,8 @@
   info = handler_.GetThreatProtectionInfo(profile_no_domain.get());
   ASSERT_TRUE(info.is_dict());
   threat_protection_info = &base::Value::AsDictionaryValue(info);
-  EXPECT_TRUE(threat_protection_info->FindListKey("info")->GetList().empty());
+  EXPECT_TRUE(
+      threat_protection_info->FindListKey("info")->GetListDeprecated().empty());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_MANAGEMENT_THREAT_PROTECTION_DESCRIPTION),
       base::UTF8ToUTF16(*threat_protection_info->FindStringKey("description")));
@@ -1320,6 +1324,9 @@
   safe_browsing::SetAnalysisConnector(profile_no_domain->GetPrefs(),
                                       enterprise_connectors::BULK_DATA_ENTRY,
                                       "[{\"service_provider\":\"google\"}]");
+  safe_browsing::SetAnalysisConnector(profile_no_domain->GetPrefs(),
+                                      enterprise_connectors::PRINT,
+                                      "[{\"service_provider\":\"google\"}]");
   safe_browsing::SetOnSecurityEventReporting(profile_no_domain->GetPrefs(),
                                              true);
   profile_no_domain->GetPrefs()->SetInteger(
@@ -1331,7 +1338,8 @@
   info = handler_.GetThreatProtectionInfo(profile_no_domain.get());
   ASSERT_TRUE(info.is_dict());
   threat_protection_info = &base::Value::AsDictionaryValue(info);
-  EXPECT_TRUE(threat_protection_info->FindListKey("info")->GetList().empty());
+  EXPECT_TRUE(
+      threat_protection_info->FindListKey("info")->GetListDeprecated().empty());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_MANAGEMENT_THREAT_PROTECTION_DESCRIPTION),
       base::UTF8ToUTF16(*threat_protection_info->FindStringKey("description")));
@@ -1344,7 +1352,9 @@
   info = handler_.GetThreatProtectionInfo(profile_no_domain.get());
   ASSERT_TRUE(info.is_dict());
   threat_protection_info = &base::Value::AsDictionaryValue(info);
-  EXPECT_EQ(5u, threat_protection_info->FindListKey("info")->GetList().size());
+  EXPECT_EQ(
+      6u,
+      threat_protection_info->FindListKey("info")->GetListDeprecated().size());
   EXPECT_EQ(
       l10n_util::GetStringUTF16(IDS_MANAGEMENT_THREAT_PROTECTION_DESCRIPTION),
       base::UTF8ToUTF16(*threat_protection_info->FindStringKey("description")));
@@ -1370,6 +1380,12 @@
   }
   {
     base::Value value(base::Value::Type::DICTIONARY);
+    value.SetStringKey("title", kManagementOnPrintEvent);
+    value.SetStringKey("permission", kManagementOnPrintVisibleData);
+    expected_info.Append(std::move(value));
+  }
+  {
+    base::Value value(base::Value::Type::DICTIONARY);
     value.SetStringKey("title", kManagementEnterpriseReportingEvent);
     value.SetStringKey("permission", kManagementEnterpriseReportingVisibleData);
     expected_info.Append(std::move(value));
diff --git a/chrome/browser/ui/webui/media/webrtc_logs_ui.cc b/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
index 9d60670..bb8eac9 100644
--- a/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
+++ b/chrome/browser/ui/webui/media/webrtc_logs_ui.cc
@@ -193,7 +193,7 @@
 
 void WebRtcLogsDOMHandler::HandleRequestWebRtcLogs(
     const base::ListValue* args) {
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   AllowJavascript();
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   LoadWebRtcTextLogs(callback_id);
diff --git a/chrome/browser/ui/webui/media_router/media_router_internals_webui_message_handler.cc b/chrome/browser/ui/webui/media_router/media_router_internals_webui_message_handler.cc
index dc24f8dd..50f3538 100644
--- a/chrome/browser/ui/webui/media_router/media_router_internals_webui_message_handler.cc
+++ b/chrome/browser/ui/webui/media_router/media_router_internals_webui_message_handler.cc
@@ -54,21 +54,22 @@
 void MediaRouterInternalsWebUIMessageHandler::HandleGetState(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, router_->GetState());
 }
 
 void MediaRouterInternalsWebUIMessageHandler::HandleGetProviderState(
     const base::ListValue* args) {
   AllowJavascript();
-  base::Value callback_id = args->GetList()[0].Clone();
-  if (args->GetList().size() != 2 || !args->GetList()[1].is_string()) {
+  base::Value callback_id = args->GetListDeprecated()[0].Clone();
+  if (args->GetListDeprecated().size() != 2 ||
+      !args->GetListDeprecated()[1].is_string()) {
     RejectJavascriptCallback(callback_id, base::Value("Invalid arguments"));
     return;
   }
 
   absl::optional<mojom::MediaRouteProviderId> provider_id =
-      ProviderIdFromString(args->GetList()[1].GetString());
+      ProviderIdFromString(args->GetListDeprecated()[1].GetString());
   if (!provider_id) {
     RejectJavascriptCallback(callback_id,
                              base::Value("Unknown MediaRouteProviderId"));
@@ -83,7 +84,7 @@
 void MediaRouterInternalsWebUIMessageHandler::HandleGetLogs(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, router_->GetLogs());
 }
 
diff --git a/chrome/browser/ui/webui/memory_internals_ui.cc b/chrome/browser/ui/webui/memory_internals_ui.cc
index c793ee0..f4b2b94 100644
--- a/chrome/browser/ui/webui/memory_internals_ui.cc
+++ b/chrome/browser/ui/webui/memory_internals_ui.cc
@@ -207,7 +207,7 @@
 void MemoryInternalsDOMHandler::HandleRequestProcessList(
     const base::ListValue* args) {
   AllowJavascript();
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   std::vector<base::Value> result;
 
@@ -282,10 +282,10 @@
 void MemoryInternalsDOMHandler::HandleStartProfiling(
     const base::ListValue* args) {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-  if (!args->is_list() || args->GetList().size() != 1)
+  if (!args->is_list() || args->GetListDeprecated().size() != 1)
     return;
 
-  base::ProcessId pid = args->GetList()[0].GetInt();
+  base::ProcessId pid = args->GetListDeprecated()[0].GetInt();
   heap_profiling::Supervisor* supervisor =
       heap_profiling::Supervisor::GetInstance();
   if (supervisor->HasStarted()) {
diff --git a/chrome/browser/ui/webui/metrics_handler.cc b/chrome/browser/ui/webui/metrics_handler.cc
index 31b3b202..197e8c1 100644
--- a/chrome/browser/ui/webui/metrics_handler.cc
+++ b/chrome/browser/ui/webui/metrics_handler.cc
@@ -53,7 +53,7 @@
 }
 
 void MetricsHandler::HandleRecordInHistogram(const base::ListValue* args) {
-  base::Value::ConstListView list = args->GetList();
+  base::Value::ConstListView list = args->GetListDeprecated();
   const std::string& histogram_name = list[0].GetString();
   int int_value = static_cast<int>(list[1].GetDouble());
   int int_boundary_value = static_cast<int>(list[2].GetDouble());
@@ -77,7 +77,7 @@
 }
 
 void MetricsHandler::HandleRecordBooleanHistogram(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   if (list.size() < 2 || !list[0].is_string() || !list[1].is_bool()) {
     NOTREACHED();
     return;
@@ -91,8 +91,8 @@
 }
 
 void MetricsHandler::HandleRecordTime(const base::ListValue* args) {
-  const std::string& histogram_name = args->GetList()[0].GetString();
-  double value = args->GetList()[1].GetDouble();
+  const std::string& histogram_name = args->GetListDeprecated()[0].GetString();
+  double value = args->GetListDeprecated()[1].GetDouble();
 
   DCHECK_GE(value, 0);
 
@@ -105,8 +105,8 @@
 }
 
 void MetricsHandler::HandleRecordMediumTime(const base::ListValue* args) {
-  const std::string& histogram_name = args->GetList()[0].GetString();
-  double value = args->GetList()[1].GetDouble();
+  const std::string& histogram_name = args->GetListDeprecated()[0].GetString();
+  double value = args->GetListDeprecated()[1].GetDouble();
 
   DCHECK_GE(value, 0);
 
diff --git a/chrome/browser/ui/webui/nacl_ui.cc b/chrome/browser/ui/webui/nacl_ui.cc
index 0b2a7ec9..38486c4 100644
--- a/chrome/browser/ui/webui/nacl_ui.cc
+++ b/chrome/browser/ui/webui/nacl_ui.cc
@@ -296,8 +296,8 @@
 
 void NaClDomHandler::HandleRequestNaClInfo(const base::ListValue* args) {
   CHECK(callback_id_.empty());
-  CHECK_EQ(1U, args->GetList().size());
-  callback_id_ = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  callback_id_ = args->GetListDeprecated()[0].GetString();
 
   if (!has_plugin_info_) {
     PluginService::GetInstance()->GetPlugins(base::BindOnce(
diff --git a/chrome/browser/ui/webui/nearby_internals/nearby_internals_logs_handler.cc b/chrome/browser/ui/webui/nearby_internals/nearby_internals_logs_handler.cc
index 807d5b3..a9eb3ea1 100644
--- a/chrome/browser/ui/webui/nearby_internals/nearby_internals_logs_handler.cc
+++ b/chrome/browser/ui/webui/nearby_internals/nearby_internals_logs_handler.cc
@@ -53,7 +53,7 @@
 void NearbyInternalsLogsHandler::HandleGetLogMessages(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   base::Value list(base::Value::Type::LIST);
   for (const auto& log : *LogBuffer::GetInstance()->logs()) {
     list.Append(LogMessageToDictionary(log));
diff --git a/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc b/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
index 1706764..1148013 100644
--- a/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
+++ b/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
@@ -313,7 +313,7 @@
     return;
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusCodeToDictionary(
@@ -331,7 +331,7 @@
     return;
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusCodeToDictionary(
@@ -349,7 +349,7 @@
     return;
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusCodeToDictionary(service_->UnregisterSendSurface(this, this),
@@ -365,7 +365,7 @@
     return;
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusCodeToDictionary(
@@ -383,7 +383,7 @@
     return;
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusCodeToDictionary(
@@ -401,7 +401,7 @@
     return;
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusCodeToDictionary(service_->UnregisterReceiveSurface(this),
@@ -467,7 +467,7 @@
     return;
   }
 
-  std::string share_target_id = args->GetList()[1].GetString();
+  std::string share_target_id = args->GetListDeprecated()[1].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     NS_LOG(ERROR) << "Invalid ShareTarget ID " << share_target_id
@@ -480,7 +480,7 @@
       TextAttachment::Type::kText, kPayloadExample, /*title=*/absl::nullopt,
       /*mime_type=*/absl::nullopt));
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusCodeToDictionary(
@@ -496,7 +496,7 @@
     return;
   }
 
-  std::string share_target_id = args->GetList()[0].GetString();
+  std::string share_target_id = args->GetListDeprecated()[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     NS_LOG(ERROR) << "Invalid ShareTarget ID " << share_target_id
@@ -518,7 +518,7 @@
     return;
   }
 
-  std::string share_target_id = args->GetList()[0].GetString();
+  std::string share_target_id = args->GetListDeprecated()[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     NS_LOG(ERROR) << "Invalid ShareTarget ID " << share_target_id
@@ -539,7 +539,7 @@
     return;
   }
 
-  std::string share_target_id = args->GetList()[0].GetString();
+  std::string share_target_id = args->GetListDeprecated()[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     NS_LOG(ERROR) << "Invalid ShareTarget ID " << share_target_id
@@ -561,7 +561,7 @@
     return;
   }
 
-  std::string share_target_id = args->GetList()[0].GetString();
+  std::string share_target_id = args->GetListDeprecated()[0].GetString();
   auto it = id_to_share_target_map_.find(share_target_id);
   if (it == id_to_share_target_map_.end()) {
     NS_LOG(ERROR) << "Invalid ShareTarget ID " << share_target_id
@@ -583,7 +583,7 @@
     return;
   }
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       StatusBooleansToDictionary(
diff --git a/chrome/browser/ui/webui/nearby_internals/quick_pair/quick_pair_handler.cc b/chrome/browser/ui/webui/nearby_internals/quick_pair/quick_pair_handler.cc
index 12ea66e2..5cb01bf 100644
--- a/chrome/browser/ui/webui/nearby_internals/quick_pair/quick_pair_handler.cc
+++ b/chrome/browser/ui/webui/nearby_internals/quick_pair/quick_pair_handler.cc
@@ -3816,7 +3816,7 @@
 
 void QuickPairHandler::HandleGetLogMessages(const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   base::Value list(base::Value::Type::LIST);
   for (const auto& log : *ash::quick_pair::LogBuffer::GetInstance()->logs()) {
     list.Append(LogMessageToDictionary(log));
diff --git a/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc b/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc
index 04381712..7eaf433 100644
--- a/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc
+++ b/chrome/browser/ui/webui/nearby_share/nearby_share_dialog_ui.cc
@@ -132,7 +132,7 @@
   if (!sharesheet_controller_)
     return;
 
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(1u, args_list.size());
   CHECK_GE(args_list[0].GetInt(), 0u);
   CHECK_LE(args_list[0].GetInt(), static_cast<int>(CloseReason::kMax));
diff --git a/chrome/browser/ui/webui/net_export_ui.cc b/chrome/browser/ui/webui/net_export_ui.cc
index c5e3430..12edced 100644
--- a/chrome/browser/ui/webui/net_export_ui.cc
+++ b/chrome/browser/ui/webui/net_export_ui.cc
@@ -217,7 +217,7 @@
 void NetExportMessageHandler::OnStartNetLog(const base::ListValue* list) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  base::Value::ConstListView params = list->GetList();
+  base::Value::ConstListView params = list->GetListDeprecated();
 
   // Determine the capture mode.
   capture_mode_ = net::NetLogCaptureMode::kDefault;
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
index f7749b2..f2caf2b 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui.cc
@@ -172,7 +172,7 @@
 void NetInternalsMessageHandler::OnDomainSecurityPolicyDelete(
     const base::ListValue* list) {
   // |list| should be: [<domain to query>].
-  const std::string* domain = list->GetList()[0].GetIfString();
+  const std::string* domain = list->GetListDeprecated()[0].GetIfString();
   DCHECK(domain);
   if (!base::IsStringASCII(*domain)) {
     // There cannot be a unicode entry in the HSTS set.
@@ -183,8 +183,8 @@
 }
 
 void NetInternalsMessageHandler::OnHSTSQuery(const base::ListValue* list) {
-  const std::string* callback_id = list->GetList()[0].GetIfString();
-  const std::string* domain = list->GetList()[1].GetIfString();
+  const std::string* callback_id = list->GetListDeprecated()[0].GetIfString();
+  const std::string* domain = list->GetListDeprecated()[1].GetIfString();
   DCHECK(callback_id && domain);
 
   AllowJavascript();
@@ -201,11 +201,11 @@
 }
 
 void NetInternalsMessageHandler::OnHSTSAdd(const base::ListValue* list) {
-  const auto list_view = list->GetList();
+  const auto list_view = list->GetListDeprecated();
   DCHECK_GE(2u, list_view.size());
 
   // |list| should be: [<domain to query>, <STS include subdomains>]
-  const std::string* domain = list->GetList()[0].GetIfString();
+  const std::string* domain = list->GetListDeprecated()[0].GetIfString();
   DCHECK(domain);
   if (!base::IsStringASCII(*domain)) {
     // Silently fail. The user will get a helpful error if they query for the
@@ -220,8 +220,8 @@
 }
 
 void NetInternalsMessageHandler::OnExpectCTQuery(const base::ListValue* list) {
-  const std::string* callback_id = list->GetList()[0].GetIfString();
-  const std::string* domain = list->GetList()[1].GetIfString();
+  const std::string* callback_id = list->GetListDeprecated()[0].GetIfString();
+  const std::string* domain = list->GetListDeprecated()[1].GetIfString();
   DCHECK(callback_id && domain);
 
   url::Origin origin = url::Origin::Create(GURL("https://" + *domain));
@@ -237,7 +237,7 @@
 
 void NetInternalsMessageHandler::OnExpectCTAdd(const base::ListValue* list) {
   // |list| should be: [<domain to add>, <report URI>, <enforce>].
-  const std::string* domain = list->GetList()[0].GetIfString();
+  const std::string* domain = list->GetListDeprecated()[0].GetIfString();
   DCHECK(domain);
   if (!base::IsStringASCII(*domain)) {
     // Silently fail. The user will get a helpful error if they query for the
@@ -245,8 +245,9 @@
     return;
   }
 
-  const std::string* report_uri_str = list->GetList()[1].GetIfString();
-  absl::optional<bool> enforce = list->GetList()[2].GetIfBool();
+  const std::string* report_uri_str =
+      list->GetListDeprecated()[1].GetIfString();
+  absl::optional<bool> enforce = list->GetListDeprecated()[2].GetIfBool();
   DCHECK(report_uri_str && enforce);
 
   url::Origin origin = url::Origin::Create(GURL("https://" + *domain));
@@ -261,8 +262,9 @@
 
 void NetInternalsMessageHandler::OnExpectCTTestReport(
     const base::ListValue* list) {
-  const std::string* callback_id = list->GetList()[0].GetIfString();
-  const std::string* report_uri_str = list->GetList()[1].GetIfString();
+  const std::string* callback_id = list->GetListDeprecated()[0].GetIfString();
+  const std::string* report_uri_str =
+      list->GetListDeprecated()[1].GetIfString();
   DCHECK(callback_id && report_uri_str);
   GURL report_uri(*report_uri_str);
   AllowJavascript();
diff --git a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
index a00c455..e6049754 100644
--- a/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/net_internals/net_internals_ui_browsertest.cc
@@ -201,7 +201,7 @@
 void NetInternalsTest::MessageHandler::GetTestServerURL(
     const base::ListValue* list_value) {
   ASSERT_TRUE(net_internals_test_->StartTestServer());
-  const std::string& path = list_value->GetList()[0].GetString();
+  const std::string& path = list_value->GetListDeprecated()[0].GetString();
   GURL url = net_internals_test_->embedded_test_server()->GetURL(path);
   base::Value url_value(url.spec());
   RunJavascriptCallback(&url_value);
@@ -219,7 +219,7 @@
 
 void NetInternalsTest::MessageHandler::DnsLookup(
     const base::ListValue* list_value) {
-  const auto& list = list_value->GetList();
+  const auto& list = list_value->GetListDeprecated();
   ASSERT_GE(2u, list.size());
   ASSERT_TRUE(list[0].is_string());
   ASSERT_TRUE(list[1].is_bool());
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
index b2554a3..f3a0c21 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -172,6 +172,8 @@
   theme->most_visited = std::move(most_visited);
 
   auto search_box = realbox::mojom::SearchBoxTheme::New();
+  search_box->ntp_bg =
+      theme_provider->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND);
   search_box->bg =
       GetOmniboxColor(theme_provider, OmniboxPart::LOCATION_BAR_BACKGROUND);
   search_box->icon = GetOmniboxColor(theme_provider, OmniboxPart::RESULTS_ICON);
@@ -279,7 +281,7 @@
     auto* parts = middle_slot.value().FindListPath("part");
     if (parts) {
       std::vector<new_tab_page::mojom::PromoPartPtr> mojom_parts;
-      for (const base::Value& part : parts->GetList()) {
+      for (const base::Value& part : parts->GetListDeprecated()) {
         if (part.FindKey("image")) {
           auto mojom_image = new_tab_page::mojom::PromoImagePart::New();
           auto* image_url = part.FindStringPath("image.image_url");
@@ -584,7 +586,7 @@
   ListPrefUpdate update(profile_->GetPrefs(), prefs::kNtpDisabledModules);
   base::Value module_id_value(module_id);
   if (disabled) {
-    if (!base::Contains(update->GetList(), module_id_value))
+    if (!base::Contains(update->GetListDeprecated(), module_id_value))
       update->Append(std::move(module_id_value));
   } else {
     update->EraseListValue(module_id_value);
@@ -599,7 +601,7 @@
   if (!profile_->GetPrefs()->IsManagedPreference(prefs::kNtpModulesVisible)) {
     const auto* module_ids_value =
         profile_->GetPrefs()->GetList(prefs::kNtpDisabledModules);
-    for (const auto& id : module_ids_value->GetList()) {
+    for (const auto& id : module_ids_value->GetListDeprecated()) {
       module_ids.push_back(id.GetString());
     }
   }
@@ -632,7 +634,7 @@
   if (base::FeatureList::IsEnabled(ntp_features::kNtpModulesDragAndDrop)) {
     const auto* module_ids_value =
         profile_->GetPrefs()->GetList(prefs::kNtpModulesOrder);
-    for (const auto& id : module_ids_value->GetList()) {
+    for (const auto& id : module_ids_value->GetListDeprecated()) {
       module_ids.push_back(id.GetString());
     }
   }
diff --git a/chrome/browser/ui/webui/ntp/app_icon_webui_handler.cc b/chrome/browser/ui/webui/ntp/app_icon_webui_handler.cc
index 812508e..3893aed 100644
--- a/chrome/browser/ui/webui/ntp/app_icon_webui_handler.cc
+++ b/chrome/browser/ui/webui/ntp/app_icon_webui_handler.cc
@@ -45,7 +45,7 @@
 
 void AppIconWebUIHandler::HandleGetAppIconDominantColor(
     const base::ListValue* args) {
-  const std::string& extension_id = args->GetList()[0].GetString();
+  const std::string& extension_id = args->GetListDeprecated()[0].GetString();
 
   Profile* profile = Profile::FromWebUI(web_ui());
   extensions::ExtensionRegistry* extension_registry =
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
index 426de10..ed9a966 100644
--- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -291,7 +291,8 @@
           : kRunOnOsLoginModeWindowed;
   value->SetString("runOnOsLoginMode", runOnOsLoginModeString);
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
   // Show settings instead of App info for locally installed web apps.
   if (base::FeatureList::IsEnabled(features::kDesktopPWAsWebAppSettingsPage) &&
       is_locally_installed) {
@@ -643,7 +644,7 @@
   dictionary->Set("apps", std::move(installed_extensions));
 
   const base::Value* app_page_names = prefs->GetList(prefs::kNtpAppPageNames);
-  if (!app_page_names || !app_page_names->GetList().size()) {
+  if (!app_page_names || !app_page_names->GetListDeprecated().size()) {
     ListPrefUpdate update(prefs, prefs::kNtpAppPageNames);
     base::Value* list = update.Get();
     list->Append(l10n_util::GetStringUTF16(IDS_APP_DEFAULT_PAGE_NAME));
@@ -732,8 +733,8 @@
 }
 
 void AppLauncherHandler::HandleLaunchApp(const base::ListValue* args) {
-  const std::string& extension_id = args->GetList()[0].GetString();
-  double source = args->GetList()[1].GetDouble();
+  const std::string& extension_id = args->GetListDeprecated()[0].GetString();
+  double source = args->GetListDeprecated()[1].GetDouble();
   GURL override_url;
 
   extension_misc::AppLaunchBucket launch_bucket =
@@ -779,16 +780,18 @@
   }
 
   WindowOpenDisposition disposition =
-      args->GetList().size() > 3 ? webui::GetDispositionFromClick(args, 3)
-                                 : WindowOpenDisposition::CURRENT_TAB;
+      args->GetListDeprecated().size() > 3
+          ? webui::GetDispositionFromClick(args, 3)
+          : WindowOpenDisposition::CURRENT_TAB;
   if (extension_id != extensions::kWebStoreAppId) {
     CHECK_NE(launch_bucket, extension_misc::APP_LAUNCH_BUCKET_INVALID);
     extensions::RecordAppLaunchType(launch_bucket, type);
   } else {
     extensions::RecordWebStoreLaunch();
 
-    if (args->GetList().size() > 2) {
-      const std::string& source_value = args->GetList()[2].GetString();
+    if (args->GetListDeprecated().size() > 2) {
+      const std::string& source_value =
+          args->GetListDeprecated()[2].GetString();
       if (!source_value.empty()) {
         override_url = net::AppendQueryParameter(
             full_launch_url, extension_urls::kWebstoreSourceField,
@@ -840,8 +843,8 @@
 }
 
 void AppLauncherHandler::HandleSetLaunchType(const base::ListValue* args) {
-  const std::string& app_id = args->GetList()[0].GetString();
-  double launch_type_double = args->GetList()[1].GetDouble();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
+  double launch_type_double = args->GetListDeprecated()[1].GetDouble();
   extensions::LaunchType launch_type =
       static_cast<extensions::LaunchType>(static_cast<int>(launch_type_double));
 
@@ -884,7 +887,7 @@
 }
 
 void AppLauncherHandler::HandleUninstallApp(const base::ListValue* args) {
-  const std::string& extension_id = args->GetList()[0].GetString();
+  const std::string& extension_id = args->GetListDeprecated()[0].GetString();
 
   if (web_app_provider_->registrar().IsInstalled(extension_id) &&
       !IsYoutubeExtension(extension_id)) {
@@ -906,7 +909,7 @@
         weak_ptr_factory_.GetWeakPtr());
 
     extension_id_prompting_ = extension_id;
-    const auto& list = args->GetList();
+    const auto& list = args->GetListDeprecated();
     const bool dont_confirm =
         list.size() >= 2 && list[1].is_bool() && list[1].GetBool();
     if (dont_confirm) {
@@ -944,7 +947,7 @@
 
   extension_id_prompting_ = extension_id;
 
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   const bool dont_confirm =
       list.size() >= 2 && list[1].is_bool() && list[1].GetBool();
   if (dont_confirm) {
@@ -962,7 +965,7 @@
 }
 
 void AppLauncherHandler::HandleCreateAppShortcut(const base::ListValue* args) {
-  const std::string& app_id = args->GetList()[0].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
 
   if (web_app_provider_->registrar().IsInstalled(app_id) &&
       !IsYoutubeExtension(app_id)) {
@@ -997,7 +1000,7 @@
 }
 
 void AppLauncherHandler::HandleInstallAppLocally(const base::ListValue* args) {
-  const std::string& app_id = args->GetList()[0].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
 
   if (!web_app_provider_->registrar().IsInstalled(app_id))
     return;
@@ -1009,11 +1012,12 @@
 }
 
 void AppLauncherHandler::HandleShowAppInfo(const base::ListValue* args) {
-  const std::string& extension_id = args->GetList()[0].GetString();
+  const std::string& extension_id = args->GetListDeprecated()[0].GetString();
 
   if (web_app_provider_->registrar().IsInstalled(extension_id) &&
       !IsYoutubeExtension(extension_id)) {
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
     if (base::FeatureList::IsEnabled(
             features::kDesktopPWAsWebAppSettingsPage)) {
       chrome::ShowWebAppSettings(
@@ -1043,7 +1047,7 @@
 }
 
 void AppLauncherHandler::HandleReorderApps(const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(args_list.size(), 2u);
 
   const std::string& dragged_app_id = args_list[0].GetString();
@@ -1073,8 +1077,8 @@
 void AppLauncherHandler::HandleSetPageIndex(const base::ListValue* args) {
   AppSorting* app_sorting =
       ExtensionSystem::Get(extension_service_->profile())->app_sorting();
-  const std::string& extension_id = args->GetList()[0].GetString();
-  double page_index = args->GetList()[1].GetDouble();
+  const std::string& extension_id = args->GetListDeprecated()[0].GetString();
+  double page_index = args->GetListDeprecated()[1].GetDouble();
   const syncer::StringOrdinal& page_ordinal =
       app_sorting->PageIntegerAsStringOrdinal(static_cast<size_t>(page_index));
 
@@ -1084,22 +1088,23 @@
 }
 
 void AppLauncherHandler::HandleSaveAppPageName(const base::ListValue* args) {
-  const std::string& name = args->GetList()[0].GetString();
-  size_t page_index = static_cast<size_t>(args->GetList()[1].GetDouble());
+  const std::string& name = args->GetListDeprecated()[0].GetString();
+  size_t page_index =
+      static_cast<size_t>(args->GetListDeprecated()[1].GetDouble());
 
   base::AutoReset<bool> auto_reset(&ignore_changes_, true);
   PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
   ListPrefUpdate update(prefs, prefs::kNtpAppPageNames);
   base::Value* list = update.Get();
-  if (page_index < list->GetList().size()) {
-    list->GetList()[page_index] = base::Value(name);
+  if (page_index < list->GetListDeprecated().size()) {
+    list->GetListDeprecated()[page_index] = base::Value(name);
   } else {
     list->Append(name);
   }
 }
 
 void AppLauncherHandler::HandleGenerateAppForLink(const base::ListValue* args) {
-  base::Value::ConstListView list = args->GetList();
+  base::Value::ConstListView list = args->GetListDeprecated();
   GURL launch_url(list[0].GetString());
   // Do not install app for invalid url.
   if (!launch_url.SchemeIsHTTPOrHTTPS())
@@ -1139,7 +1144,7 @@
 }
 
 void AppLauncherHandler::HandlePageSelected(const base::ListValue* args) {
-  double index_double = args->GetList()[0].GetDouble();
+  double index_double = args->GetListDeprecated()[0].GetDouble();
   int index = static_cast<int>(index_double);
 
   PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
@@ -1150,8 +1155,8 @@
   if (!base::FeatureList::IsEnabled(features::kDesktopPWAsRunOnOsLogin))
     return;
 
-  const std::string& app_id = args->GetList()[0].GetString();
-  const std::string& mode_string = args->GetList()[1].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
+  const std::string& mode_string = args->GetListDeprecated()[1].GetString();
   web_app::RunOnOsLoginMode mode;
 
   if (mode_string == kRunOnOsLoginModeNotRun) {
diff --git a/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc b/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
index f3db3b3..2469455 100644
--- a/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
+++ b/chrome/browser/ui/webui/ntp/cookie_controls_handler.cc
@@ -52,7 +52,7 @@
 
 void CookieControlsHandler::HandleCookieControlsToggleChanged(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool checked = list[0].GetBool();
   service_->HandleCookieControlsToggleChanged(checked);
diff --git a/chrome/browser/ui/webui/ntp/core_app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/core_app_launcher_handler.cc
index 00f5c8d2..355d758 100644
--- a/chrome/browser/ui/webui/ntp/core_app_launcher_handler.cc
+++ b/chrome/browser/ui/webui/ntp/core_app_launcher_handler.cc
@@ -29,8 +29,8 @@
 
 void CoreAppLauncherHandler::HandleRecordAppLaunchByUrl(
     const base::ListValue* args) {
-  const std::string& url = args->GetList()[0].GetString();
-  double source = args->GetList()[1].GetDouble();
+  const std::string& url = args->GetListDeprecated()[0].GetString();
+  double source = args->GetListDeprecated()[1].GetDouble();
 
   extension_misc::AppLaunchBucket bucket =
       static_cast<extension_misc::AppLaunchBucket>(static_cast<int>(source));
diff --git a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
index 2a050e7..e699c648 100644
--- a/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
+++ b/chrome/browser/ui/webui/offline/offline_internals_ui_message_handler.cc
@@ -88,7 +88,7 @@
 
 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedPages(
     const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(2u, args_list.size());
   std::string callback_id = args_list[0].GetString();
 
@@ -112,7 +112,7 @@
 
 void OfflineInternalsUIMessageHandler::HandleDeleteSelectedRequests(
     const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(2u, args_list.size());
   std::string callback_id = args_list[0].GetString();
 
@@ -204,7 +204,7 @@
 void OfflineInternalsUIMessageHandler::HandleGetRequestQueue(
     const base::ListValue* args) {
   AllowJavascript();
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   if (request_coordinator_) {
     request_coordinator_->GetAllRequests(base::BindOnce(
@@ -219,7 +219,7 @@
 void OfflineInternalsUIMessageHandler::HandleGetStoredPages(
     const base::ListValue* args) {
   AllowJavascript();
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   if (offline_page_model_) {
     offline_page_model_->GetAllPages(base::BindOnce(
@@ -234,7 +234,7 @@
 void OfflineInternalsUIMessageHandler::HandleSetRecordPageModel(
     const base::ListValue* args) {
   AllowJavascript();
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool should_record = list[0].GetBool();
   if (offline_page_model_)
@@ -244,7 +244,7 @@
 void OfflineInternalsUIMessageHandler::HandleGetNetworkStatus(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   ResolveJavascriptCallback(
       callback_id,
@@ -255,7 +255,7 @@
 void OfflineInternalsUIMessageHandler::HandleScheduleNwake(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   if (prefetch_service_) {
     prefetch_service_->ForceRefreshSuggestions();
@@ -271,7 +271,7 @@
 void OfflineInternalsUIMessageHandler::HandleCancelNwake(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   if (prefetch_service_) {
     prefetch_service_->GetPrefetchBackgroundTaskHandler()
@@ -286,7 +286,7 @@
 void OfflineInternalsUIMessageHandler::HandleGeneratePageBundle(
     const base::ListValue* args) {
   AllowJavascript();
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   if (!prefetch_service_) {
     RejectJavascriptCallback(base::Value(callback_id),
@@ -294,7 +294,7 @@
     return;
   }
 
-  const std::string& data = args->GetList()[1].GetString();
+  const std::string& data = args->GetListDeprecated()[1].GetString();
   std::vector<std::string> page_urls = base::SplitStringUsingSubstr(
       data, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
   std::vector<offline_pages::PrefetchURL> prefetch_urls;
@@ -337,7 +337,7 @@
 void OfflineInternalsUIMessageHandler::HandleGetOperation(
     const base::ListValue* args) {
   AllowJavascript();
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   if (!prefetch_service_) {
     RejectJavascriptCallback(base::Value(callback_id),
@@ -345,7 +345,7 @@
     return;
   }
 
-  std::string name = args->GetList()[1].GetString();
+  std::string name = args->GetListDeprecated()[1].GetString();
   base::TrimWhitespaceASCII(name, base::TRIM_ALL, &name);
 
   prefetch_service_->GetPrefetchDispatcher()
@@ -357,7 +357,7 @@
 void OfflineInternalsUIMessageHandler::HandleDownloadArchive(
     const base::ListValue* args) {
   AllowJavascript();
-  std::string name = args->GetList()[0].GetString();
+  std::string name = args->GetListDeprecated()[0].GetString();
   base::TrimWhitespaceASCII(name, base::TRIM_ALL, &name);
 
   if (prefetch_service_) {
@@ -369,7 +369,7 @@
 void OfflineInternalsUIMessageHandler::HandleSetRecordRequestQueue(
     const base::ListValue* args) {
   AllowJavascript();
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool should_record = list[0].GetBool();
   if (request_coordinator_)
@@ -379,7 +379,7 @@
 void OfflineInternalsUIMessageHandler::HandleSetRecordPrefetchService(
     const base::ListValue* args) {
   AllowJavascript();
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool should_record = list[0].GetBool();
   if (prefetch_service_)
@@ -390,15 +390,15 @@
     const base::ListValue* args) {
   AllowJavascript();
   PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
-  DCHECK(!args->GetList().empty());
-  bool enabled = args->GetList()[0].GetBool();
+  DCHECK(!args->GetListDeprecated().empty());
+  bool enabled = args->GetListDeprecated()[0].GetBool();
   offline_pages::prefetch_prefs::SetLimitlessPrefetchingEnabled(prefs, enabled);
 }
 
 void OfflineInternalsUIMessageHandler::HandleGetLimitlessPrefetchingEnabled(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
   bool enabled =
@@ -412,19 +412,20 @@
   AllowJavascript();
   PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
 
-  if (args->GetList().size() != 1) {
+  if (args->GetListDeprecated().size() != 1) {
     DLOG(ERROR) << "Expected 1 argument to setPrefetchTesting header but got "
-                << args->GetList().size();
+                << args->GetListDeprecated().size();
     return;
   }
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     DLOG(ERROR) << "Expected argument to be string but got "
-                << base::Value::GetTypeName(args->GetList()[0].type());
+                << base::Value::GetTypeName(
+                       args->GetListDeprecated()[0].type());
     return;
   }
 
   offline_pages::prefetch_prefs::SetPrefetchTestingHeader(
-      prefs, args->GetList()[0].GetString());
+      prefs, args->GetListDeprecated()[0].GetString());
 
   if (prefetch_service_)
     prefetch_service_->SetEnabledByServer(prefs, true);
@@ -433,20 +434,21 @@
 void OfflineInternalsUIMessageHandler::HandleGetPrefetchTestingHeader(
     const base::ListValue* args) {
   AllowJavascript();
-  if (args->GetList().size() != 1) {
+  if (args->GetListDeprecated().size() != 1) {
     DLOG(ERROR) << "Expected 1 argument to getPrefetchTestingHeader but got "
-                << args->GetList().size();
+                << args->GetListDeprecated().size();
     return;
   }
-  if (!args->GetList()[0].is_string()) {
+  if (!args->GetListDeprecated()[0].is_string()) {
     DLOG(ERROR) << "Expected callback_id to be a string but got "
-                << base::Value::GetTypeName(args->GetList()[0].type());
+                << base::Value::GetTypeName(
+                       args->GetListDeprecated()[0].type());
     return;
   }
 
   PrefService* prefs = Profile::FromWebUI(web_ui())->GetPrefs();
   ResolveJavascriptCallback(
-      args->GetList()[0],
+      args->GetListDeprecated()[0],
       base::Value(offline_pages::prefetch_prefs::GetPrefetchTestingHeader(prefs)
 
                       ));
@@ -455,7 +457,7 @@
 void OfflineInternalsUIMessageHandler::HandleGetLoggingState(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   base::DictionaryValue result;
   result.SetBoolean("modelIsLogging",
@@ -477,7 +479,7 @@
 void OfflineInternalsUIMessageHandler::HandleGetEventLogs(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   std::vector<std::string> logs;
   if (offline_page_model_)
@@ -498,10 +500,10 @@
 
 void OfflineInternalsUIMessageHandler::HandleAddToRequestQueue(
     const base::ListValue* args) {
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   if (request_coordinator_) {
-    const std::string& url = args->GetList()[1].GetString();
+    const std::string& url = args->GetListDeprecated()[1].GetString();
 
     // To be visible in Downloads UI, these items need a well-formed GUID
     // and AsyncNamespace in their ClientId.
diff --git a/chrome/browser/ui/webui/plural_string_handler.cc b/chrome/browser/ui/webui/plural_string_handler.cc
index 40ddc34..d5f7c41 100644
--- a/chrome/browser/ui/webui/plural_string_handler.cc
+++ b/chrome/browser/ui/webui/plural_string_handler.cc
@@ -41,7 +41,7 @@
 
 void PluralStringHandler::HandleGetPluralString(const base::ListValue* args) {
   AllowJavascript();
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(3U, list.size());
 
   const base::Value& callback_id = list[0];
@@ -66,7 +66,7 @@
 void PluralStringHandler::GetPluralStringTuple(const base::ListValue* args,
                                                int string_tuple_id) {
   AllowJavascript();
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(5U, list.size());
 
   const base::Value& callback_id = list[0];
diff --git a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
index 18d1141..5a55b8b9 100644
--- a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
@@ -321,7 +321,7 @@
   absl::optional<base::Value> value_ptr = base::JSONReader::Read(json);
   ASSERT_TRUE(value_ptr);
   ASSERT_TRUE(value_ptr->is_list());
-  base::Value::ConstListView actual_policies = value_ptr->GetList();
+  base::Value::ConstListView actual_policies = value_ptr->GetListDeprecated();
 
   // Verify that the cells contain the expected strings for all policies.
   ASSERT_EQ(expected_policies.size(), actual_policies.size());
diff --git a/chrome/browser/ui/webui/predictors/predictors_handler.cc b/chrome/browser/ui/webui/predictors/predictors_handler.cc
index c84cd50c7..9a3876c 100644
--- a/chrome/browser/ui/webui/predictors/predictors_handler.cc
+++ b/chrome/browser/ui/webui/predictors/predictors_handler.cc
@@ -69,7 +69,8 @@
     dict.Set("db", std::move(db));
   }
 
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */, dict);
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
+                            dict);
 }
 
 void PredictorsHandler::RequestResourcePrefetchPredictorDb(
@@ -97,7 +98,8 @@
     }
   }
 
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */, dict);
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
+                            dict);
 }
 
 void PredictorsHandler::AddOriginDataMapToListValue(
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
index 62854ec..cc844c7 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -366,7 +366,7 @@
   DCHECK_GT(pending_enumeration_count_, 0);
   pending_enumeration_count_--;
   std::unique_ptr<base::ListValue> list = printer_list.Build();
-  if (!list->GetList().empty())
+  if (!list->GetListDeprecated().empty())
     callback.Run(*list);
   if (pending_enumeration_count_ == 0)
     std::move(done_callback_).Run();
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
index b5b9155..ef59767 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler_unittest.cc
@@ -626,7 +626,7 @@
   EXPECT_EQ(1u, call_count);
   EXPECT_FALSE(is_done);
   EXPECT_TRUE(printers.get());
-  EXPECT_EQ(2u, printers->GetList().size());
+  EXPECT_EQ(2u, printers->GetListDeprecated().size());
   std::unique_ptr<base::DictionaryValue> extension_1_entry(
       DictionaryBuilder()
           .Set("id", base::StringPrintf("provisional-usb:%s:%s",
@@ -647,8 +647,10 @@
           .Set("extensionId", extension_2->id())
           .Set("provisional", true)
           .Build());
-  EXPECT_TRUE(base::Contains(printers->GetList(), *extension_1_entry));
-  EXPECT_TRUE(base::Contains(printers->GetList(), *extension_2_entry));
+  EXPECT_TRUE(
+      base::Contains(printers->GetListDeprecated(), *extension_1_entry));
+  EXPECT_TRUE(
+      base::Contains(printers->GetListDeprecated(), *extension_2_entry));
 
   fake_api->TriggerNextGetPrintersCallback(base::ListValue(), true);
 
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 029a4ee..4212f04 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -560,8 +560,9 @@
     return;
 
   std::vector<mojom::PrinterType> deny_list;
-  deny_list.reserve(deny_list_from_prefs->GetList().size());
-  for (const base::Value& deny_list_value : deny_list_from_prefs->GetList()) {
+  deny_list.reserve(deny_list_from_prefs->GetListDeprecated().size());
+  for (const base::Value& deny_list_value :
+       deny_list_from_prefs->GetListDeprecated()) {
     const std::string& deny_list_str = deny_list_value.GetString();
     mojom::PrinterType printer_type;
     if (deny_list_str == "extension")
@@ -622,7 +623,7 @@
 }
 
 void PrintPreviewHandler::HandleGetPrinters(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 2u);
   std::string callback_id = list[0].GetString();
   CHECK(!callback_id.empty());
@@ -653,7 +654,7 @@
 
 void PrintPreviewHandler::HandleGetPrinterCapabilities(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   // Validate that we have a valid callback_id
   if (list.size() < 1 || !list[0].is_string() || list[0].GetString().empty()) {
     RejectJavascriptCallback(base::Value(""), base::Value());
@@ -692,15 +693,15 @@
 }
 
 void PrintPreviewHandler::HandleGetPreview(const base::ListValue* args) {
-  DCHECK_EQ(2U, args->GetList().size());
+  DCHECK_EQ(2U, args->GetListDeprecated().size());
   std::string callback_id;
   std::string json_str;
 
   // All of the conditions below should be guaranteed by the print preview
   // javascript.
-  callback_id = args->GetList()[0].GetString();
+  callback_id = args->GetListDeprecated()[0].GetString();
   CHECK(!callback_id.empty());
-  json_str = args->GetList()[1].GetString();
+  json_str = args->GetListDeprecated()[1].GetString();
   base::Value settings = GetSettingsDictionary(json_str);
   CHECK(settings.is_dict());
   int request_id = settings.FindIntKey(kPreviewRequestID).value();
@@ -766,11 +767,11 @@
 void PrintPreviewHandler::HandlePrint(const base::ListValue* args) {
   ReportRegeneratePreviewRequestCountBeforePrint(
       regenerate_preview_request_count_);
-  CHECK(args->GetList()[0].is_string());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK(args->GetListDeprecated()[0].is_string());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   CHECK(!callback_id.empty());
-  CHECK(args->GetList()[1].is_string());
-  std::string json_str = args->GetList()[1].GetString();
+  CHECK(args->GetListDeprecated()[1].is_string());
+  std::string json_str = args->GetListDeprecated()[1].GetString();
 
   base::Value settings = GetSettingsDictionary(json_str);
   if (!settings.is_dict()) {
@@ -842,8 +843,8 @@
   std::string data_to_save;
   PrintPreviewStickySettings* sticky_settings =
       PrintPreviewStickySettings::GetInstance();
-  if (args->GetList()[0].is_string())
-    data_to_save = args->GetList()[0].GetString();
+  if (args->GetListDeprecated()[0].is_string())
+    data_to_save = args->GetListDeprecated()[0].GetString();
   if (!data_to_save.empty())
     sticky_settings->StoreAppState(data_to_save);
   sticky_settings->SaveInPrefs(GetPrefs());
@@ -935,8 +936,8 @@
 
 void PrintPreviewHandler::HandleGetInitialSettings(
     const base::ListValue* args) {
-  CHECK(args->GetList()[0].is_string());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK(args->GetListDeprecated()[0].is_string());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   CHECK(!callback_id.empty());
 
   AllowJavascript();
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc
index b594f43..0bb26df 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos.cc
@@ -181,9 +181,10 @@
 
 void PrintPreviewHandlerChromeOS::HandleGrantExtensionPrinterAccess(
     const base::ListValue* args) {
-  DCHECK(args->GetList()[0].is_string() && args->GetList()[1].is_string());
-  std::string callback_id = args->GetList()[0].GetString();
-  std::string printer_id = args->GetList()[1].GetString();
+  DCHECK(args->GetListDeprecated()[0].is_string() &&
+         args->GetListDeprecated()[1].is_string());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  std::string printer_id = args->GetListDeprecated()[1].GetString();
   DCHECK(!callback_id.empty());
   MaybeAllowJavascript();
 
@@ -201,9 +202,10 @@
   std::string callback_id;
   std::string printer_name;
   MaybeAllowJavascript();
-  if (args->GetList()[0].is_string() && args->GetList()[1].is_string()) {
-    callback_id = args->GetList()[0].GetString();
-    printer_name = args->GetList()[1].GetString();
+  if (args->GetListDeprecated()[0].is_string() &&
+      args->GetListDeprecated()[1].is_string()) {
+    callback_id = args->GetListDeprecated()[0].GetString();
+    printer_name = args->GetListDeprecated()[1].GetString();
   }
 
   if (callback_id.empty() || printer_name.empty()) {
@@ -221,9 +223,9 @@
 
 void PrintPreviewHandlerChromeOS::HandleGetAccessToken(
     const base::ListValue* args) {
-  DCHECK(args->GetList()[0].is_string());
+  DCHECK(args->GetListDeprecated()[0].is_string());
 
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   DCHECK(!callback_id.empty());
   MaybeAllowJavascript();
 
@@ -236,11 +238,11 @@
 
 void PrintPreviewHandlerChromeOS::HandleGetEulaUrl(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
   MaybeAllowJavascript();
 
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& destination_id = args->GetList()[1].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& destination_id = args->GetListDeprecated()[1].GetString();
 
   PrinterHandler* handler = GetPrinterHandler(mojom::PrinterType::kLocal);
   handler->StartGetEulaUrl(
@@ -325,10 +327,10 @@
 
 void PrintPreviewHandlerChromeOS::HandleRequestPrinterStatusUpdate(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
 
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& printer_id = args->GetList()[1].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& printer_id = args->GetListDeprecated()[1].GetString();
 
   MaybeAllowJavascript();
   PrinterHandler* handler = GetPrinterHandler(mojom::PrinterType::kLocal);
@@ -340,9 +342,9 @@
 
 void PrintPreviewHandlerChromeOS::HandleChoosePrintServers(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
 
-  const base::Value& val = args->GetList()[0];
+  const base::Value& val = args->GetListDeprecated()[0];
   std::vector<std::string> print_server_ids;
   for (const auto& id : val.GetList()) {
     print_server_ids.push_back(id.GetString());
@@ -358,8 +360,8 @@
 
 void PrintPreviewHandlerChromeOS::HandleGetPrintServersConfig(
     const base::ListValue* args) {
-  CHECK(args->GetList()[0].is_string());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK(args->GetListDeprecated()[0].is_string());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   CHECK(!callback_id.empty());
   MaybeAllowJavascript();
   if (!local_printer_) {
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos_unittest.cc
index 55c46df..05c11d2d 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_chromeos_unittest.cc
@@ -233,7 +233,7 @@
   auto* call_data = web_ui()->call_data().back().get();
   AssertWebUIEventFired(*call_data, "print-servers-config-changed");
   base::Value::ConstListView printer_list =
-      call_data->arg2()->FindListKey("printServers")->GetList();
+      call_data->arg2()->FindListKey("printServers")->GetListDeprecated();
   bool is_single_server_fetching_mode =
       call_data->arg2()->FindBoolKey("isSingleServerFetchingMode").value();
 
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 4b9d5d2..136bfe5 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -648,7 +648,8 @@
         static_cast<mojom::PrinterType>(add_data.arg2()->GetInt());
     EXPECT_EQ(expected_type, type);
     ASSERT_TRUE(add_data.arg3());
-    base::Value::ConstListView printer_list = add_data.arg3()->GetList();
+    base::Value::ConstListView printer_list =
+        add_data.arg3()->GetListDeprecated();
     ASSERT_EQ(printer_list.size(), 1u);
     EXPECT_TRUE(printer_list[0].FindKeyOfType("printer_name",
                                               base::Value::Type::STRING));
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc b/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc
index 3ebe206..638e806 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_metrics.cc
@@ -53,7 +53,7 @@
   const base::Value* page_range_array =
       preview_settings.FindKey(kSettingPageRange);
   if (page_range_array && page_range_array->is_list() &&
-      !page_range_array->GetList().empty()) {
+      !page_range_array->GetListDeprecated().empty()) {
     ReportPrintSettingHistogram(PrintSettingsBuckets::kPageRange);
   }
 
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
index a3cbcbe..54fd11a4 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_utils.cc
@@ -101,7 +101,7 @@
     return true;
   const base::Value* options_list =
       select_cap->FindKeyOfType(kOptionKey, base::Value::Type::LIST);
-  if (!options_list || options_list->GetList().empty() ||
+  if (!options_list || options_list->GetListDeprecated().empty() ||
       GetFilteredList(options_list, ValueIsNull).GetList().empty()) {
     return true;
   }
@@ -138,12 +138,12 @@
     bool is_vendor_capability = key == kVendorCapabilityKey;
     list_value->EraseListValueIf(is_vendor_capability ? VendorCapabilityInvalid
                                                       : ValueIsNull);
-    if (list_value->GetList().empty())  // leave out empty lists.
+    if (list_value->GetListDeprecated().empty())  // leave out empty lists.
       continue;
 
     if (is_vendor_capability) {
       // Need to also filter the individual capability lists.
-      for (auto& vendor_option : list_value->GetList()) {
+      for (auto& vendor_option : list_value->GetListDeprecated()) {
         if (*vendor_option.FindStringKey(kTypeKey) != kSelectString)
           continue;
 
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc
index 7548378..df4888a 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_utils_unittest.cc
@@ -95,7 +95,8 @@
 }
 
 bool HasValidEntry(const base::Value* list) {
-  return list && !list->GetList().empty() && !ValidList(list).GetList().empty();
+  return list && !list->GetListDeprecated().empty() &&
+         !ValidList(list).GetList().empty();
 }
 
 void CompareStringKeys(const base::Value& expected,
@@ -107,9 +108,12 @@
 
 void ValidateList(const base::Value* list_out, const base::Value* input_list) {
   auto input_list_valid = ValidList(input_list);
-  ASSERT_EQ(list_out->GetList().size(), input_list_valid.GetList().size());
-  for (size_t index = 0; index < list_out->GetList().size(); index++) {
-    EXPECT_EQ(list_out->GetList()[index], input_list_valid.GetList()[index]);
+  ASSERT_EQ(list_out->GetListDeprecated().size(),
+            input_list_valid.GetList().size());
+  for (size_t index = 0; index < list_out->GetListDeprecated().size();
+       index++) {
+    EXPECT_EQ(list_out->GetListDeprecated()[index],
+              input_list_valid.GetList()[index]);
   }
 }
 
@@ -162,8 +166,9 @@
 
   ASSERT_TRUE(vendor_capability_out);
   size_t index = 0;
-  base::Value::ConstListView output_list = vendor_capability_out->GetList();
-  for (const auto& input_entry : input_vendor_caps->GetList()) {
+  base::Value::ConstListView output_list =
+      vendor_capability_out->GetListDeprecated();
+  for (const auto& input_entry : input_vendor_caps->GetListDeprecated()) {
     if (!HasValidEntry(
             input_entry
                 .FindKeyOfType(kSelectCapKey, base::Value::Type::DICTIONARY)
@@ -266,7 +271,7 @@
   base::DictionaryValue printer = GetCapabilitiesFull();
   base::Value* select_cap_0 =
       printer.FindKeyOfType(kVendorCapability, base::Value::Type::LIST)
-          ->GetList()[0]
+          ->GetListDeprecated()[0]
           .FindKeyOfType(kSelectCapKey, base::Value::Type::DICTIONARY);
   select_cap_0->RemoveKey(kOptionKey);
   base::Value::ListStorage option_list;
@@ -283,7 +288,7 @@
   base::DictionaryValue printer = GetCapabilitiesFull();
   base::Value* vendor_dictionary =
       printer.FindKeyOfType(kVendorCapability, base::Value::Type::LIST)
-          ->GetList()[0]
+          ->GetListDeprecated()[0]
           .FindKeyOfType(kSelectCapKey, base::Value::Type::DICTIONARY);
   vendor_dictionary->RemoveKey(kOptionKey);
   base::Value::ListStorage pages_per_sheet;
diff --git a/chrome/browser/ui/webui/realbox/realbox.mojom b/chrome/browser/ui/webui/realbox/realbox.mojom
index 16ceea4..910a682 100644
--- a/chrome/browser/ui/webui/realbox/realbox.mojom
+++ b/chrome/browser/ui/webui/realbox/realbox.mojom
@@ -95,6 +95,7 @@
   skia.mojom.SkColor bg;
   skia.mojom.SkColor icon;
   skia.mojom.SkColor icon_selected;
+  skia.mojom.SkColor ntp_bg;
   skia.mojom.SkColor placeholder;
   skia.mojom.SkColor results_bg;
   skia.mojom.SkColor results_bg_hovered;
diff --git a/chrome/browser/ui/webui/realbox/realbox_handler.cc b/chrome/browser/ui/webui/realbox/realbox_handler.cc
index 05adedd..c33894d 100644
--- a/chrome/browser/ui/webui/realbox/realbox_handler.cc
+++ b/chrome/browser/ui/webui/realbox/realbox_handler.cc
@@ -288,6 +288,11 @@
       {"showSuggestions", IDS_TOOLTIP_HEADER_SHOW_SUGGESTIONS_BUTTON}};
   source->AddLocalizedStrings(kStrings);
 
+  source->AddInteger(
+      "realboxMatchOmniboxThemeVariant",
+      base::GetFieldTrialParamByFeatureAsInt(
+          ntp_features::kRealboxMatchOmniboxTheme,
+          ntp_features::kRealboxMatchOmniboxThemeVariantParam, 0));
   source->AddBoolean(
       "realboxMatchOmniboxTheme",
       base::FeatureList::IsEnabled(ntp_features::kRealboxMatchOmniboxTheme));
diff --git a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
index 5e33842..570f887 100644
--- a/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
+++ b/chrome/browser/ui/webui/sandbox/sandbox_handler.cc
@@ -116,8 +116,8 @@
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  CHECK_EQ(1U, args->GetList().size());
-  sandbox_diagnostics_callback_id_ = args->GetList()[0].Clone();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  sandbox_diagnostics_callback_id_ = args->GetListDeprecated()[0].Clone();
 
   AllowJavascript();
 
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 56041037..c7b4f215 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -425,7 +425,7 @@
 #endif
 
 void AboutHandler::HandleOpenFeedbackDialog(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   Browser* browser =
       chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
   chrome::OpenFeedbackDialog(browser,
@@ -433,7 +433,7 @@
 }
 
 void AboutHandler::HandleOpenHelpPage(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   Browser* browser =
       chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
   chrome::ShowHelp(browser, chrome::HELP_SOURCE_WEBUI);
@@ -441,18 +441,18 @@
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 void AboutHandler::HandleOpenDiagnostics(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   chrome::ShowDiagnosticsApp(profile_);
 }
 
 void AboutHandler::HandleOpenFirmwareUpdates(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   chrome::ShowFirmwareUpdatesApp(profile_);
 }
 
 void AboutHandler::HandleCheckInternetConnection(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   chromeos::NetworkStateHandler* network_state_handler =
       chromeos::NetworkHandler::Get()->network_state_handler();
@@ -463,7 +463,7 @@
 }
 
 void AboutHandler::HandleLaunchReleaseNotes(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   // We can always show the release notes since the Help app caches it, or can
   // show an appropriate error state (e.g. No internet connection).
   base::RecordAction(base::UserMetricsAction("ReleaseNotes.LaunchedAboutPage"));
@@ -472,26 +472,27 @@
 }
 
 void AboutHandler::HandleOpenOsHelpPage(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   Browser* browser =
       chrome::FindBrowserWithWebContents(web_ui()->GetWebContents());
   chrome::ShowHelp(browser, chrome::HELP_SOURCE_WEBUI_CHROME_OS);
 }
 
 void AboutHandler::HandleSetChannel(const base::ListValue* args) {
-  DCHECK(args->GetList().size() == 2);
+  DCHECK(args->GetListDeprecated().size() == 2);
 
   if (!CanChangeChannel(profile_)) {
     LOG(WARNING) << "Non-owner tried to change release track.";
     return;
   }
 
-  if (!args->GetList()[0].is_string() || !args->GetList()[1].is_bool()) {
+  if (!args->GetListDeprecated()[0].is_string() ||
+      !args->GetListDeprecated()[1].is_bool()) {
     LOG(ERROR) << "Can't parse SetChannel() args";
     return;
   }
-  const std::string& channel = args->GetList()[0].GetString();
-  const bool& is_powerwash_allowed = args->GetList()[1].GetBool();
+  const std::string& channel = args->GetListDeprecated()[0].GetString();
+  const bool& is_powerwash_allowed = args->GetListDeprecated()[1].GetBool();
 
   version_updater_->SetChannel(channel, is_powerwash_allowed);
   if (user_manager::UserManager::Get()->IsCurrentUserOwner()) {
@@ -504,8 +505,8 @@
 }
 
 void AboutHandler::HandleGetVersionInfo(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
       base::BindOnce(&GetVersionInfo),
@@ -520,8 +521,8 @@
 }
 
 void AboutHandler::HandleGetRegulatoryInfo(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_VISIBLE},
@@ -531,8 +532,8 @@
 }
 
 void AboutHandler::HandleGetChannelInfo(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
   version_updater_->GetChannel(
       true /* get current channel */,
       base::BindOnce(&AboutHandler::OnGetCurrentChannel,
@@ -540,8 +541,8 @@
 }
 
 void AboutHandler::HandleCanChangeChannel(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
   ResolveJavascriptCallback(base::Value(callback_id),
                             base::Value(CanChangeChannel(profile_)));
 }
@@ -578,10 +579,11 @@
 
 void AboutHandler::HandleRequestUpdateOverCellular(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
 
-  const std::string& update_version = args->GetList()[0].GetString();
-  const std::string& update_size_string = args->GetList()[1].GetString();
+  const std::string& update_version = args->GetListDeprecated()[0].GetString();
+  const std::string& update_size_string =
+      args->GetListDeprecated()[1].GetString();
   int64_t update_size;
   CHECK(base::StringToInt64(update_size_string, &update_size));
 
@@ -612,8 +614,8 @@
 }
 
 void AboutHandler::HandleGetEndOfLifeInfo(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
   version_updater_->GetEolInfo(base::BindOnce(&AboutHandler::OnGetEndOfLifeInfo,
                                               weak_factory_.GetWeakPtr(),
                                               callback_id));
diff --git a/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc b/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc
index d9a40d1a..be58a12 100644
--- a/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc
+++ b/chrome/browser/ui/webui/settings/browser_lifetime_handler.cc
@@ -112,7 +112,7 @@
 
 void BrowserLifetimeHandler::HandleFactoryReset(
     const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(1U, args_list.size());
   bool tpm_firmware_update_requested = args_list[0].GetBool();
 
@@ -145,7 +145,7 @@
 void BrowserLifetimeHandler::HandleGetRelaunchConfirmationDialogDescription(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   size_t incognito_count = BrowserList::GetIncognitoBrowserCount();
   base::Value description;
   if (incognito_count > 0) {
@@ -158,7 +158,7 @@
 void BrowserLifetimeHandler::HandleShouldShowRelaunchConfirmationDialog(
     const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   base::Value result = base::Value(BrowserList::GetIncognitoBrowserCount() > 0);
   ResolveJavascriptCallback(callback_id, result);
 }
diff --git a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
index 258053a..3da4afd6 100644
--- a/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
+++ b/chrome/browser/ui/webui/settings/chrome_cleanup_handler_win.cc
@@ -191,7 +191,7 @@
 
 void ChromeCleanupHandler::HandleRegisterChromeCleanerObserver(
     const base::ListValue* args) {
-  DCHECK_EQ(0U, args->GetList().size());
+  DCHECK_EQ(0U, args->GetListDeprecated().size());
 
   base::RecordAction(
       base::UserMetricsAction("SoftwareReporter.CleanupWebui_Shown"));
@@ -202,10 +202,10 @@
 }
 
 void ChromeCleanupHandler::HandleStartScanning(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   bool allow_logs_upload = false;
-  if (args->GetList()[0].is_bool())
-    allow_logs_upload = args->GetList()[0].GetBool();
+  if (args->GetListDeprecated()[0].is_bool())
+    allow_logs_upload = args->GetListDeprecated()[0].GetBool();
 
   // If this operation is not allowed the UI should be disabled.
   CHECK(controller_->IsAllowedByPolicy());
@@ -220,7 +220,7 @@
 }
 
 void ChromeCleanupHandler::HandleRestartComputer(const base::ListValue* args) {
-  DCHECK_EQ(0U, args->GetList().size());
+  DCHECK_EQ(0U, args->GetListDeprecated().size());
 
   base::RecordAction(
       base::UserMetricsAction("SoftwareReporter.CleanupWebui_RestartComputer"));
@@ -229,10 +229,10 @@
 }
 
 void ChromeCleanupHandler::HandleStartCleanup(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   bool allow_logs_upload = false;
-  if (args->GetList()[0].is_bool())
-    allow_logs_upload = args->GetList()[0].GetBool();
+  if (args->GetListDeprecated()[0].is_bool())
+    allow_logs_upload = args->GetListDeprecated()[0].GetBool();
 
   // The state is propagated to all open tabs and should be consistent.
   DCHECK_EQ(controller_->logs_enabled(profile_), allow_logs_upload);
@@ -251,10 +251,10 @@
 
 void ChromeCleanupHandler::HandleNotifyShowDetails(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   bool details_section_visible = false;
-  if (args->GetList()[0].is_bool())
-    details_section_visible = args->GetList()[0].GetBool();
+  if (args->GetListDeprecated()[0].is_bool())
+    details_section_visible = args->GetListDeprecated()[0].GetBool();
 
   if (details_section_visible) {
     base::RecordAction(
@@ -267,7 +267,7 @@
 
 void ChromeCleanupHandler::HandleNotifyChromeCleanupLearnMoreClicked(
     const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
 
   base::RecordAction(
       base::UserMetricsAction("SoftwareReporter.CleanupWebui_LearnMore"));
@@ -289,7 +289,7 @@
 
 void ChromeCleanupHandler::GetPluralString(int id,
                                            const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(2U, list.size());
 
   std::string callback_id = list[0].GetString();
diff --git a/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc b/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc
index d8fa758..bce5dad4 100644
--- a/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/accessibility_handler.cc
@@ -97,19 +97,19 @@
 
 void AccessibilityHandler::HandleSetStartupSoundEnabled(
     const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
   bool enabled = false;
-  if (args->GetList()[0].is_bool())
-    enabled = args->GetList()[0].GetBool();
+  if (args->GetListDeprecated()[0].is_bool())
+    enabled = args->GetListDeprecated()[0].GetBool();
   AccessibilityManager::Get()->SetStartupSoundEnabled(enabled);
 }
 
 void AccessibilityHandler::HandleRecordSelectedShowShelfNavigationButtonsValue(
     const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
   bool enabled = false;
-  if (args->GetList()[0].is_bool())
-    enabled = args->GetList()[0].GetBool();
+  if (args->GetListDeprecated()[0].is_bool())
+    enabled = args->GetListDeprecated()[0].GetBool();
 
   a11y_nav_buttons_toggle_metrics_reporter_timer_.Start(
       FROM_HERE, base::Seconds(10),
diff --git a/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_browsertest.cc b/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_browsertest.cc
index 4dd0703b..2563940 100644
--- a/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/accessibility_handler_browsertest.cc
@@ -111,7 +111,7 @@
           listener == expected_listener) {
         if (!data->arg2()->is_list())
           return false;
-        *argument = data->arg2()->GetList();
+        *argument = data->arg2()->GetListDeprecated();
         return true;
       }
     }
diff --git a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
index ad588ef..121e0c81 100644
--- a/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/account_manager_handler_browsertest.cc
@@ -304,7 +304,8 @@
   ASSERT_TRUE(call_data.arg2()->GetBool());
 
   // Get results from JS callback.
-  const base::span<const base::Value> result = call_data.arg3()->GetList();
+  const base::span<const base::Value> result =
+      call_data.arg3()->GetListDeprecated();
   ASSERT_EQ(account_manager_accounts.size(), result.size());
 
   // Check first (device) account.
@@ -353,7 +354,8 @@
   ASSERT_TRUE(call_data.arg2()->GetBool());
 
   // Get results from JS callback.
-  const base::span<const base::Value> result = call_data.arg3()->GetList();
+  const base::span<const base::Value> result =
+      call_data.arg3()->GetListDeprecated();
   ASSERT_EQ(account_manager_accounts.size(), result.size());
 
   // Check first (device) account.
@@ -539,7 +541,8 @@
   ASSERT_TRUE(call_data.arg2()->GetBool());
 
   // Get results from JS callback.
-  const base::span<const base::Value> result = call_data.arg3()->GetList();
+  const base::span<const base::Value> result =
+      call_data.arg3()->GetListDeprecated();
   ASSERT_EQ(account_manager_accounts.size(), result.size());
 
   // The value for the device account should be always `true`.
@@ -611,7 +614,7 @@
   // Get results from JS callback.
   const content::TestWebUI::CallData& call_data = *web_ui()->call_data().back();
   const base::span<const base::Value> accounts_dict =
-      call_data.arg3()->GetList();
+      call_data.arg3()->GetListDeprecated();
   absl::optional<const base::Value> secondary_1_dict =
       FindAccountDictByEmail(accounts_dict, kSecondaryAccount1Email);
   ASSERT_TRUE(secondary_1_dict.has_value());
diff --git a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
index 4e39889..848bb5702 100644
--- a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.cc
@@ -234,7 +234,7 @@
       // For Google Photos, we will populate the |selected_album_ids| with IDs
       // of selected albums.
       settings_->selected_album_ids.clear();
-      for (const auto& album : albums->GetList()) {
+      for (const auto& album : albums->GetListDeprecated()) {
         const base::Value* album_id = album.FindKey("albumId");
         const std::string& id = album_id->GetString();
         ash::PersonalAlbum* personal_album = FindPersonalAlbumById(id);
@@ -259,11 +259,11 @@
       for (auto& art_setting : settings_->art_settings) {
         const std::string& album_id = art_setting.album_id;
         auto it = std::find_if(
-            albums->GetList().begin(), albums->GetList().end(),
-            [&album_id](const auto& album) {
+            albums->GetListDeprecated().begin(),
+            albums->GetListDeprecated().end(), [&album_id](const auto& album) {
               return album.FindKey("albumId")->GetString() == album_id;
             });
-        const bool checked = it != albums->GetList().end();
+        const bool checked = it != albums->GetListDeprecated().end();
         art_setting.enabled = checked;
         // A setting must be visible to be enabled.
         if (art_setting.enabled)
diff --git a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler_unittest.cc
index 8ceb7e1..11595110 100644
--- a/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler_unittest.cc
@@ -241,14 +241,14 @@
     EXPECT_EQ(static_cast<int>(topic_source), topic_source_value->GetInt());
 
     const base::Value* albums = dictionary->FindKey("albums");
-    EXPECT_EQ(2U, albums->GetList().size());
+    EXPECT_EQ(2U, albums->GetListDeprecated().size());
 
     const base::DictionaryValue* album0;
-    albums->GetList()[0].GetAsDictionary(&album0);
+    albums->GetListDeprecated()[0].GetAsDictionary(&album0);
     EXPECT_EQ("0", album0->FindKey("albumId")->GetString());
 
     const base::DictionaryValue* album1;
-    albums->GetList()[1].GetAsDictionary(&album1);
+    albums->GetListDeprecated()[1].GetAsDictionary(&album1);
     EXPECT_EQ("1", album1->FindKey("albumId")->GetString());
 
     if (topic_source == ash::AmbientModeTopicSource::kGooglePhotos) {
diff --git a/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc b/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc
index f0747240..a3b1ce87 100644
--- a/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/android_apps_handler.cc
@@ -105,10 +105,10 @@
 }
 
 void AndroidAppsHandler::ShowAndroidAppsSettings(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   bool activated_from_keyboard = false;
-  if (args->GetList()[0].is_bool())
-    activated_from_keyboard = args->GetList()[0].GetBool();
+  if (args->GetListDeprecated()[0].is_bool())
+    activated_from_keyboard = args->GetListDeprecated()[0].GetBool();
   int flags = activated_from_keyboard ? ui::EF_NONE : ui::EF_LEFT_MOUSE_BUTTON;
 
   app_service_proxy_->Launch(
diff --git a/chrome/browser/ui/webui/settings/chromeos/bluetooth_handler.cc b/chrome/browser/ui/webui/settings/chromeos/bluetooth_handler.cc
index 752d4c6..91f54a6 100644
--- a/chrome/browser/ui/webui/settings/chromeos/bluetooth_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/bluetooth_handler.cc
@@ -47,9 +47,9 @@
 void BluetoothHandler::HandleIsDeviceBlockedByPolicy(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& address = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& address = args->GetListDeprecated()[1].GetString();
 
   if (!bluetooth_adapter_) {
     BLUETOOTH_LOG(EVENT) << "Bluetooth adapter not available.";
diff --git a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
index 8d3070c..de5c95ee 100644
--- a/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/change_picture_handler.cc
@@ -165,7 +165,7 @@
 }
 
 void ChangePictureHandler::HandleChooseFile(const base::ListValue* args) {
-  DCHECK(args && args->GetList().empty());
+  DCHECK(args && args->GetListDeprecated().empty());
   select_file_dialog_ = ui::SelectFileDialog::Create(
       this,
       std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents()));
@@ -187,7 +187,7 @@
 }
 
 void ChangePictureHandler::HandleDiscardPhoto(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   AccessibilityManager::Get()->PlayEarcon(
       Sound::kObjectDelete, PlaySoundOption::kOnlyIfSpokenFeedbackEnabled);
 }
@@ -197,9 +197,10 @@
   AccessibilityManager::Get()->PlayEarcon(
       Sound::kCameraSnap, PlaySoundOption::kOnlyIfSpokenFeedbackEnabled);
 
-  if (!args || args->GetList().size() != 1 || !args->GetList()[0].is_string())
+  if (!args || args->GetListDeprecated().size() != 1 ||
+      !args->GetListDeprecated()[0].is_string())
     NOTREACHED();
-  const std::string& image_url = args->GetList()[0].GetString();
+  const std::string& image_url = args->GetListDeprecated()[0].GetString();
   DCHECK(!image_url.empty());
 
   std::string raw_data;
@@ -222,7 +223,7 @@
 }
 
 void ChangePictureHandler::HandlePageInitialized(const base::ListValue* args) {
-  DCHECK(args && args->GetList().empty());
+  DCHECK(args && args->GetListDeprecated().empty());
 
   AllowJavascript();
 
@@ -319,13 +320,14 @@
 }
 
 void ChangePictureHandler::HandleSelectImage(const base::ListValue* args) {
-  if (!args || args->GetList().size() != 2 || !args->GetList()[0].is_string() ||
-      !args->GetList()[1].is_string()) {
+  if (!args || args->GetListDeprecated().size() != 2 ||
+      !args->GetListDeprecated()[0].is_string() ||
+      !args->GetListDeprecated()[1].is_string()) {
     NOTREACHED();
     return;
   }
-  const std::string& image_url = args->GetList()[0].GetString();
-  const std::string& image_type = args->GetList()[1].GetString();
+  const std::string& image_url = args->GetListDeprecated()[0].GetString();
+  const std::string& image_type = args->GetListDeprecated()[1].GetString();
   // |image_url| may be empty unless |image_type| is "default".
   DCHECK(!image_type.empty());
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
index 0326594..26f3d51b 100644
--- a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
@@ -764,7 +764,7 @@
   base::Value::ConstListView containers =
       profile_->GetPrefs()
           ->GetList(crostini::prefs::kCrostiniContainers)
-          ->GetList();
+          ->GetListDeprecated();
 
   for (const auto& dict : containers) {
     crostini::ContainerId container_id(dict);
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index af5096d..e69cdcf 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -373,8 +373,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   std::vector<Printer> printers =
       printers_manager_->GetPrinters(PrinterClass::kSaved);
@@ -387,8 +387,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   std::vector<Printer> printers =
       printers_manager_->GetPrinters(PrinterClass::kEnterprise);
@@ -398,10 +398,10 @@
 }
 
 void CupsPrintersHandler::HandleUpdateCupsPrinter(const base::ListValue* args) {
-  CHECK_EQ(3U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& printer_id = args->GetList()[1].GetString();
-  const std::string& printer_name = args->GetList()[2].GetString();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& printer_id = args->GetListDeprecated()[1].GetString();
+  const std::string& printer_name = args->GetListDeprecated()[2].GetString();
 
   Printer printer(printer_id);
   printer.set_display_name(printer_name);
@@ -426,7 +426,7 @@
 void CupsPrintersHandler::HandleRemoveCupsPrinter(const base::ListValue* args) {
   PRINTER_LOG(USER) << "Removing printer";
   // Printer name also expected in 2nd parameter.
-  const std::string& printer_id = args->GetList()[0].GetString();
+  const std::string& printer_id = args->GetListDeprecated()[0].GetString();
   auto printer = printers_manager_->GetPrinter(printer_id);
   if (!printer)
     return;
@@ -447,18 +447,19 @@
 
 void CupsPrintersHandler::HandleGetPrinterInfo(const base::ListValue* args) {
   DCHECK(args);
-  if (args->GetList().empty() || !args->GetList()[0].is_string()) {
+  if (args->GetListDeprecated().empty() ||
+      !args->GetListDeprecated()[0].is_string()) {
     NOTREACHED() << "Expected request for a promise";
     return;
   }
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
-  if (args->GetList().size() < 2u) {
+  if (args->GetListDeprecated().size() < 2u) {
     NOTREACHED() << "Dictionary missing";
     return;
   }
 
-  const base::Value& printer_value = args->GetList()[1];
+  const base::Value& printer_value = args->GetListDeprecated()[1];
   if (!printer_value.is_dict()) {
     NOTREACHED() << "Dictionary missing";
     return;
@@ -630,9 +631,9 @@
 
 void CupsPrintersHandler::AddOrReconfigurePrinter(const base::ListValue* args,
                                                   bool is_printer_edit) {
-  CHECK_EQ(2U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
-  const base::Value& printer_value = args->GetList()[1];
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  const base::Value& printer_value = args->GetListDeprecated()[1];
   CHECK(printer_value.is_dict());
   const base::DictionaryValue& printer_dict =
       base::Value::AsDictionaryValue(printer_value);
@@ -838,8 +839,8 @@
 void CupsPrintersHandler::HandleGetCupsPrinterManufacturers(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
   ppd_provider_->ResolveManufacturers(
       base::BindOnce(&CupsPrintersHandler::ResolveManufacturersDone,
                      weak_factory_.GetWeakPtr(), callback_id));
@@ -848,9 +849,9 @@
 void CupsPrintersHandler::HandleGetCupsPrinterModels(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& manufacturer = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& manufacturer = args->GetListDeprecated()[1].GetString();
 
   // Empty manufacturer queries may be triggered as a part of the ui
   // initialization, and should just return empty results.
@@ -869,8 +870,8 @@
 }
 
 void CupsPrintersHandler::HandleSelectPPDFile(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  webui_callback_id_ = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  webui_callback_id_ = args->GetListDeprecated()[0].GetString();
 
   base::FilePath downloads_path =
       DownloadPrefs::FromDownloadManager(profile_->GetDownloadManager())
@@ -984,7 +985,7 @@
 
 void CupsPrintersHandler::HandleSetUpCancel(const base::ListValue* args) {
   PRINTER_LOG(DEBUG) << "Printer setup cancelled";
-  const base::Value& printer_value = args->GetList()[0];
+  const base::Value& printer_value = args->GetListDeprecated()[0];
   CHECK(printer_value.is_dict());
 
   std::unique_ptr<Printer> printer =
@@ -1037,9 +1038,9 @@
   }
 
   PRINTER_LOG(DEBUG) << "Discovered printers updating. Automatic: "
-                     << automatic_printers_list->GetList().size()
+                     << automatic_printers_list->GetListDeprecated().size()
                      << " Discovered: "
-                     << discovered_printers_list->GetList().size();
+                     << discovered_printers_list->GetListDeprecated().size();
   FireWebUIListener("on-nearby-printers-changed", *automatic_printers_list,
                     *discovered_printers_list);
 }
@@ -1047,9 +1048,9 @@
 void CupsPrintersHandler::HandleAddDiscoveredPrinter(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& printer_id = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& printer_id = args->GetListDeprecated()[1].GetString();
 
   PRINTER_LOG(USER) << "Adding discovered printer";
   absl::optional<Printer> printer = printers_manager_->GetPrinter(printer_id);
@@ -1111,9 +1112,9 @@
 void CupsPrintersHandler::HandleGetPrinterPpdManufacturerAndModel(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& printer_id = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& printer_id = args->GetListDeprecated()[1].GetString();
 
   auto printer = printers_manager_->GetPrinter(printer_id);
   if (!printer) {
@@ -1143,10 +1144,10 @@
 }
 
 void CupsPrintersHandler::HandleGetEulaUrl(const base::ListValue* args) {
-  CHECK_EQ(3U, args->GetList().size());
-  const std::string callback_id = args->GetList()[0].GetString();
-  const std::string ppd_manufacturer = args->GetList()[1].GetString();
-  const std::string ppd_model = args->GetList()[2].GetString();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  const std::string callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string ppd_manufacturer = args->GetListDeprecated()[1].GetString();
+  const std::string ppd_model = args->GetListDeprecated()[2].GetString();
 
   auto resolved_printers_it = resolved_printers_.find(ppd_manufacturer);
   if (resolved_printers_it == resolved_printers_.end()) {
@@ -1221,9 +1222,9 @@
 }
 
 void CupsPrintersHandler::HandleQueryPrintServer(const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& server_url = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& server_url = args->GetListDeprecated()[1].GetString();
 
   absl::optional<GURL> converted_server_url =
       GenerateServerPrinterUrlWithValidScheme(server_url);
@@ -1302,12 +1303,12 @@
 
 void CupsPrintersHandler::HandleOpenPrintManagementApp(
     const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   chrome::ShowPrintManagementApp(profile_);
 }
 
 void CupsPrintersHandler::HandleOpenScanningApp(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   chrome::ShowScanningApp(profile_);
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
index 52e28d4..406c3fb 100644
--- a/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/date_time_handler.cc
@@ -126,8 +126,8 @@
 void DateTimeHandler::HandleGetTimeZones(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, *system::GetTimezoneList());
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc
index b1545481..5dab7bf 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_display_handler.cc
@@ -40,8 +40,10 @@
 
   int64_t display_id;
 
-  if (args->GetList().empty() || !args->GetList()[0].is_string() ||
-      !base::StringToInt64(args->GetList()[0].GetString(), &display_id)) {
+  if (args->GetListDeprecated().empty() ||
+      !args->GetListDeprecated()[0].is_string() ||
+      !base::StringToInt64(args->GetListDeprecated()[0].GetString(),
+                           &display_id)) {
     cros_display_config_->HighlightDisplay(display::kInvalidDisplayId);
     return;
   }
@@ -50,10 +52,10 @@
 }
 
 void DisplayHandler::HandleDragDisplayDelta(const base::ListValue* args) {
-  DCHECK_EQ(3U, args->GetList().size());
+  DCHECK_EQ(3U, args->GetListDeprecated().size());
   AllowJavascript();
 
-  const auto& args_list = args->GetList();
+  const auto& args_list = args->GetListDeprecated();
   const std::string& display_id_str = args_list[0].GetString();
   int32_t delta_x = static_cast<int32_t>(args_list[1].GetInt());
   int32_t delta_y = static_cast<int32_t>(args_list[2].GetInt());
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_name_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_name_handler.cc
index efb820b..bce9295 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_name_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_name_handler.cc
@@ -65,8 +65,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  DCHECK_EQ(2U, args->GetList().size());
-  const base::Value::ConstListView args_list = args->GetList();
+  DCHECK_EQ(2U, args->GetListDeprecated().size());
+  const base::Value::ConstListView args_list = args->GetListDeprecated();
   const std::string callback_id = args_list[0].GetString();
   const std::string name_from_user = args_list[1].GetString();
   DeviceNameStore::SetDeviceNameResult result =
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
index e0ad3a4..d2d45cc 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
@@ -217,7 +217,7 @@
 void PowerHandler::HandleSetPowerSource(const base::ListValue* args) {
   AllowJavascript();
 
-  const std::string& id = args->GetList()[0].GetString();
+  const std::string& id = args->GetListDeprecated()[0].GetString();
   chromeos::PowerManagerClient::Get()->SetPowerSource(id);
 }
 
@@ -230,7 +230,7 @@
 void PowerHandler::HandleSetIdleBehavior(const base::ListValue* args) {
   AllowJavascript();
 
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 2u);
   int value = list[0].GetInt();
   bool when_on_ac = list[1].GetBool();
@@ -280,7 +280,7 @@
 void PowerHandler::HandleSetLidClosedBehavior(const base::ListValue* args) {
   AllowJavascript();
 
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 1u);
   int value = list[0].GetInt();
   switch (static_cast<PowerPolicyController::Action>(value)) {
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
index 981bd0d..6caa5e6 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
@@ -121,7 +121,7 @@
 
 void StylusHandler::HandleSetPreferredNoteTakingApp(
     const base::ListValue* args) {
-  const std::string& app_id = args->GetList()[0].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
 
   // Sanity check: make sure that the ID we got back from WebUI is in the
   // currently-available set.
@@ -137,8 +137,8 @@
 void StylusHandler::HandleSetPreferredNoteTakingAppEnabledOnLockScreen(
     const base::ListValue* args) {
   bool enabled = false;
-  CHECK(args->GetList()[0].is_bool());
-  enabled = args->GetList()[0].GetBool();
+  CHECK(args->GetListDeprecated()[0].is_bool());
+  enabled = args->GetListDeprecated()[0].GetBool();
 
   NoteTakingHelper::Get()->SetPreferredAppEnabledOnLockScreen(
       Profile::FromWebUI(web_ui()), enabled);
@@ -157,8 +157,9 @@
 }
 
 void StylusHandler::HandleShowPlayStoreApps(const base::ListValue* args) {
-  const std::string& apps_url =
-      !args->GetList().empty() ? args->GetList()[0].GetString() : "";
+  const std::string& apps_url = !args->GetListDeprecated().empty()
+                                    ? args->GetListDeprecated()[0].GetString()
+                                    : "";
   Profile* profile = Profile::FromWebUI(web_ui());
   if (!arc::IsArcAllowedForProfile(profile)) {
     VLOG(1) << "ARC is not enabled for this profile";
diff --git a/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc b/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
index 6a44f6d2e..a5da4397 100644
--- a/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
@@ -160,8 +160,8 @@
 
 void FingerprintHandler::HandleGetFingerprintsList(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   AllowJavascript();
   fp_service_->GetRecordsForUser(
@@ -189,8 +189,8 @@
 }
 
 void FingerprintHandler::HandleGetNumFingerprints(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   int fingerprints_num =
       profile_->GetPrefs()->GetInteger(prefs::kQuickUnlockFingerprintRecord);
@@ -203,7 +203,7 @@
 void FingerprintHandler::HandleStartEnroll(const base::ListValue* args) {
   AllowJavascript();
 
-  const std::string& auth_token = args->GetList()[0].GetString();
+  const std::string& auth_token = args->GetListDeprecated()[0].GetString();
 
   // Auth token expiration will trigger password prompt.
   // Silently fail if auth token is incorrect.
@@ -240,7 +240,7 @@
 }
 
 void FingerprintHandler::HandleGetEnrollmentLabel(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(2U, list.size());
   std::string callback_id = list[0].GetString();
   int index = list[1].GetInt();
@@ -260,7 +260,7 @@
 }
 
 void FingerprintHandler::HandleRemoveEnrollment(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(2U, list.size());
   std::string callback_id = list[0].GetString();
   int index = list[1].GetInt();
@@ -283,7 +283,7 @@
 
 void FingerprintHandler::HandleChangeEnrollmentLabel(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(3U, list.size());
 
   std::string callback_id = list[0].GetString();
diff --git a/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc b/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc
index 24d39de..05725bee 100644
--- a/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.cc
@@ -72,20 +72,20 @@
 
 void GoogleAssistantHandler::HandleShowGoogleAssistantSettings(
     const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
   ash::AssistantController::Get()->OpenAssistantSettings();
 }
 
 void GoogleAssistantHandler::HandleRetrainVoiceModel(
     const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
   chromeos::AssistantOptInDialog::Show(ash::FlowType::kSpeakerIdRetrain,
                                        base::DoNothing());
 }
 
 void GoogleAssistantHandler::HandleSyncVoiceModelStatus(
     const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
 
   auto* settings = assistant::AssistantSettings::Get();
   if (settings)
@@ -93,7 +93,7 @@
 }
 
 void GoogleAssistantHandler::HandleInitialized(const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
   AllowJavascript();
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc b/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc
index 3a41c046..c594213 100644
--- a/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/guest_os_handler.cc
@@ -75,11 +75,11 @@
 void GuestOsHandler::HandleGetGuestOsSharedPathsDisplayText(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   base::Value texts(base::Value::Type::LIST);
-  for (const auto& path : args->GetList()[1].GetList()) {
+  for (const auto& path : args->GetListDeprecated()[1].GetList()) {
     texts.Append(file_manager::util::GetPathDisplayTextForSettings(
         profile_, path.GetString()));
   }
@@ -88,10 +88,10 @@
 
 void GuestOsHandler::HandleRemoveGuestOsSharedPath(
     const base::ListValue* args) {
-  CHECK_EQ(3U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
-  std::string vm_name = args->GetList()[1].GetString();
-  std::string path = args->GetList()[2].GetString();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  std::string vm_name = args->GetListDeprecated()[1].GetString();
+  std::string path = args->GetListDeprecated()[2].GetString();
 
   guest_os::GuestOsSharePath::GetForProfile(profile_)->UnsharePath(
       vm_name, base::FilePath(path),
@@ -119,8 +119,8 @@
 
 void GuestOsHandler::HandleSetGuestOsUsbDeviceShared(
     const base::ListValue* args) {
-  CHECK_EQ(3U, args->GetList().size());
-  const auto& args_list = args->GetList();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  const auto& args_list = args->GetListDeprecated();
   const std::string& vm_name = args_list[0].GetString();
   const std::string& guid = args_list[1].GetString();
   bool shared = args_list[2].GetBool();
diff --git a/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc b/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc
index 1a7aad0d..bed3051b 100644
--- a/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/internet_handler.cc
@@ -110,11 +110,12 @@
 }
 
 void InternetHandler::AddThirdPartyVpn(const base::ListValue* args) {
-  if (args->GetList().size() < 1 || !args->GetList()[0].is_string()) {
+  if (args->GetListDeprecated().size() < 1 ||
+      !args->GetListDeprecated()[0].is_string()) {
     NOTREACHED() << "Invalid args for: " << kAddThirdPartyVpnMessage;
     return;
   }
-  const std::string& app_id = args->GetList()[0].GetString();
+  const std::string& app_id = args->GetListDeprecated()[0].GetString();
   if (app_id.empty()) {
     NET_LOG(ERROR) << "Empty app id for " << kAddThirdPartyVpnMessage;
     return;
@@ -146,11 +147,12 @@
 }
 
 void InternetHandler::ConfigureThirdPartyVpn(const base::ListValue* args) {
-  if (args->GetList().size() < 1 || !args->GetList()[0].is_string()) {
+  if (args->GetListDeprecated().size() < 1 ||
+      !args->GetListDeprecated()[0].is_string()) {
     NOTREACHED() << "Invalid args for: " << kConfigureThirdPartyVpnMessage;
     return;
   }
-  const std::string& guid = args->GetList()[0].GetString();
+  const std::string& guid = args->GetListDeprecated()[0].GetString();
   if (profile_ != GetProfileForPrimaryUser()) {
     NET_LOG(ERROR) << "Only the primary user can configure VPNs";
     return;
@@ -206,20 +208,22 @@
 }
 
 void InternetHandler::ShowCarrierAccountDetail(const base::ListValue* args) {
-  if (args->GetList().size() < 1 || !args->GetList()[0].is_string()) {
+  if (args->GetListDeprecated().size() < 1 ||
+      !args->GetListDeprecated()[0].is_string()) {
     NOTREACHED() << "Invalid args for: " << kShowCarrierAccountDetail;
     return;
   }
-  const std::string& guid = args->GetList()[0].GetString();
+  const std::string& guid = args->GetListDeprecated()[0].GetString();
   chromeos::NetworkConnect::Get()->ShowCarrierAccountDetail(guid);
 }
 
 void InternetHandler::ShowCellularSetupUI(const base::ListValue* args) {
-  if (args->GetList().size() < 1 || !args->GetList()[0].is_string()) {
+  if (args->GetListDeprecated().size() < 1 ||
+      !args->GetListDeprecated()[0].is_string()) {
     NOTREACHED() << "Invalid args for: " << kConfigureThirdPartyVpnMessage;
     return;
   }
-  const std::string& guid = args->GetList()[0].GetString();
+  const std::string& guid = args->GetListDeprecated()[0].GetString();
   chromeos::NetworkConnect::Get()->ShowMobileSetup(guid);
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/internet_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/internet_handler_unittest.cc
index bfc60cb5..6c69ef6 100644
--- a/chrome/browser/ui/webui/settings/chromeos/internet_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/internet_handler_unittest.cc
@@ -75,7 +75,8 @@
     EXPECT_EQ(kSendDeviceNamesMessageType, last_call_data->arg1()->GetString());
 
     std::vector<std::string> actual_device_names;
-    for (const auto& device_name_value : last_call_data->arg2()->GetList())
+    for (const auto& device_name_value :
+         last_call_data->arg2()->GetListDeprecated())
       actual_device_names.push_back(device_name_value.GetString());
     EXPECT_EQ(expected_device_names, actual_device_names);
   }
diff --git a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
index 36f43595..817e32a7 100644
--- a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
@@ -227,8 +227,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   if (!kerberos_credentials_manager_->IsKerberosEnabled()) {
     ResolveJavascriptCallback(base::Value(callback_id), base::Value());
@@ -291,13 +291,13 @@
   //   - Prevent account changes when Kerberos is disabled.
   //   - Remove all accounts when Kerberos is disabled.
 
-  CHECK_EQ(6U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& principal_name = args->GetList()[1].GetString();
-  const std::string& password = args->GetList()[2].GetString();
-  const bool remember_password = args->GetList()[3].GetBool();
-  const std::string& config = args->GetList()[4].GetString();
-  const bool allow_existing = args->GetList()[5].GetBool();
+  CHECK_EQ(6U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& principal_name = args->GetListDeprecated()[1].GetString();
+  const std::string& password = args->GetListDeprecated()[2].GetString();
+  const bool remember_password = args->GetListDeprecated()[3].GetBool();
+  const std::string& config = args->GetListDeprecated()[4].GetString();
+  const bool allow_existing = args->GetListDeprecated()[5].GetBool();
 
   if (!kerberos_credentials_manager_->IsKerberosEnabled()) {
     ResolveJavascriptCallback(base::Value(callback_id),
@@ -323,9 +323,9 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& principal_name = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& principal_name = args->GetListDeprecated()[1].GetString();
 
   if (!kerberos_credentials_manager_->IsKerberosEnabled()) {
     ResolveJavascriptCallback(base::Value(callback_id),
@@ -348,9 +348,9 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& krb5conf = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& krb5conf = args->GetListDeprecated()[1].GetString();
 
   if (!kerberos_credentials_manager_->IsKerberosEnabled()) {
     ResolveJavascriptCallback(base::Value(callback_id),
@@ -383,8 +383,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& principal_name = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& principal_name = args->GetListDeprecated()[0].GetString();
 
   kerberos_credentials_manager_->SetActiveAccount(principal_name);
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
index ebcfed6..01b022b7 100644
--- a/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_handler.cc
@@ -301,7 +301,7 @@
 
 void MultideviceHandler::HandleShowMultiDeviceSetupDialog(
     const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   multidevice_setup::MultiDeviceSetupDialog::Show();
 }
 
@@ -310,7 +310,7 @@
   // loaded, so it should be the one to allow JS calls.
   AllowJavascript();
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   DCHECK(callback_id.is_string());
 
   std::unique_ptr<base::DictionaryValue> page_content_dictionary =
@@ -324,7 +324,7 @@
 
 void MultideviceHandler::HandleSetFeatureEnabledState(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   DCHECK_GE(list.size(), 3u);
   std::string callback_id = list[0].GetString();
 
@@ -357,25 +357,25 @@
 }
 
 void MultideviceHandler::HandleRemoveHostDevice(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   multidevice_setup_client_->RemoveHostDevice();
 }
 
 void MultideviceHandler::HandleRetryPendingHostSetup(
     const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   multidevice_setup_client_->RetrySetHostNow(
       base::BindOnce(&OnRetrySetHostNowResult));
 }
 
 void MultideviceHandler::HandleSetUpAndroidSms(const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   android_sms_app_manager_->SetUpAndLaunchAndroidSmsApp();
 }
 
 void MultideviceHandler::HandleGetSmartLockSignInEnabled(
     const base::ListValue* args) {
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   CHECK(callback_id.is_string());
 
   bool signInEnabled = prefs_->GetBoolean(
@@ -386,13 +386,13 @@
 void MultideviceHandler::HandleSetSmartLockSignInEnabled(
     const base::ListValue* args) {
   bool enabled = false;
-  if (args->GetList()[0].is_bool())
-    enabled = args->GetList()[0].GetBool();
+  if (args->GetListDeprecated()[0].is_bool())
+    enabled = args->GetListDeprecated()[0].GetBool();
 
-  const bool auth_token_present =
-      args->GetList().size() >= 2 && args->GetList()[1].is_string();
+  const bool auth_token_present = args->GetListDeprecated().size() >= 2 &&
+                                  args->GetListDeprecated()[1].is_string();
   const std::string& auth_token =
-      auth_token_present ? args->GetList()[1].GetString() : "";
+      auth_token_present ? args->GetListDeprecated()[1].GetString() : "";
 
   // Either the user is disabling sign-in, or they are enabling it and the auth
   // token must be present.
@@ -408,7 +408,7 @@
 
 void MultideviceHandler::HandleGetSmartLockSignInAllowed(
     const base::ListValue* args) {
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   CHECK(callback_id.is_string());
 
   bool sign_in_allowed =
@@ -443,7 +443,7 @@
 }
 
 void MultideviceHandler::HandleGetAndroidSmsInfo(const base::ListValue* args) {
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   ResolveJavascriptCallback(callback_id, *GenerateAndroidSmsInfo());
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc b/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
index 839e5ef1..1ad2942 100644
--- a/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.cc
@@ -53,13 +53,13 @@
 
 void ParentalControlsHandler::HandleShowAddSupervisionDialog(
     const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
   AddSupervisionDialog::Show();
 }
 
 void ParentalControlsHandler::HandleLaunchFamilyLinkSettings(
     const base::ListValue* args) {
-  DCHECK(args->GetList().empty());
+  DCHECK(args->GetListDeprecated().empty());
 
   apps::AppServiceProxy* proxy =
       apps::AppServiceProxyFactory::GetForProfile(profile_);
diff --git a/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc b/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc
index 8a5c361..a067e0b 100644
--- a/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc
@@ -92,8 +92,8 @@
 void PeripheralDataAccessHandler::HandleThunderboltSupported(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1u, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1u, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   // PathExist is a blocking call. PostTask it and wait on the result.
   base::ThreadPool::PostTaskAndReplyWithResult(
@@ -106,8 +106,8 @@
 void PeripheralDataAccessHandler::HandleGetPolicyState(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1u, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1u, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   const std::string& pref_name = InstallAttributes::Get()->IsEnterpriseManaged()
                                      ? local_state_pref_name
diff --git a/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc b/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
index ec46723..ee43b71 100644
--- a/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.cc
@@ -43,17 +43,17 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   bool requires_relaunch =
       plugin_vm::PluginVmManagerFactory::GetForProfile(profile_)
           ->IsRelaunchNeededForNewPermissions();
   ResolveJavascriptCallback(
-      /*callback_id=*/base::Value(args->GetList()[0].GetString()),
+      /*callback_id=*/base::Value(args->GetListDeprecated()[0].GetString()),
       base::Value(requires_relaunch));
 }
 
 void PluginVmHandler::HandleRelaunchPluginVm(const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
   plugin_vm::PluginVmManagerFactory::GetForProfile(profile_)
       ->RelaunchPluginVm();
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc b/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc
index bdba515..a0734d31 100644
--- a/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.cc
@@ -57,7 +57,7 @@
 void QuickUnlockHandler::HandleQuickUnlockDisabledByPolicy(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
 
   UpdateQuickUnlockDisabledByPolicy();
 }
diff --git a/chrome/browser/ui/webui/settings/chromeos/tts_handler.cc b/chrome/browser/ui/webui/settings/chromeos/tts_handler.cc
index 9609589..30fc43f 100644
--- a/chrome/browser/ui/webui/settings/chromeos/tts_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/tts_handler.cc
@@ -124,9 +124,9 @@
 }
 
 void TtsHandler::HandlePreviewTtsVoice(const base::ListValue* args) {
-  DCHECK_EQ(2U, args->GetList().size());
-  const std::string& text = args->GetList()[0].GetString();
-  const std::string& voice_id = args->GetList()[1].GetString();
+  DCHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& text = args->GetListDeprecated()[0].GetString();
+  const std::string& voice_id = args->GetListDeprecated()[1].GetString();
 
   if (text.empty() || voice_id.empty())
     return;
diff --git a/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc b/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
index 8652aaba..e8e09c7a 100644
--- a/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.cc
@@ -37,18 +37,18 @@
 
 void WallpaperHandler::HandleIsWallpaperSettingVisible(
     const base::ListValue* args) {
-  CHECK_EQ(args->GetList().size(), 1U);
+  CHECK_EQ(args->GetListDeprecated().size(), 1U);
   ResolveCallback(
-      args->GetList()[0],
+      args->GetListDeprecated()[0],
       WallpaperControllerClientImpl::Get()->ShouldShowWallpaperSetting());
 }
 
 void WallpaperHandler::HandleIsWallpaperPolicyControlled(
     const base::ListValue* args) {
-  CHECK_EQ(args->GetList().size(), 1U);
+  CHECK_EQ(args->GetListDeprecated().size(), 1U);
   bool result = WallpaperControllerClientImpl::Get()
                     ->IsActiveUserWallpaperControlledByPolicy();
-  ResolveCallback(args->GetList()[0], result);
+  ResolveCallback(args->GetListDeprecated()[0], result);
 }
 
 void WallpaperHandler::HandleOpenWallpaperManager(const base::ListValue* args) {
diff --git a/chrome/browser/ui/webui/settings/downloads_handler.cc b/chrome/browser/ui/webui/settings/downloads_handler.cc
index 69a5937..d11915fc 100644
--- a/chrome/browser/ui/webui/settings/downloads_handler.cc
+++ b/chrome/browser/ui/webui/settings/downloads_handler.cc
@@ -145,9 +145,9 @@
 void DownloadsHandler::HandleGetDownloadLocationText(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const std::string& path = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const std::string& path = args->GetListDeprecated()[1].GetString();
 
   ResolveJavascriptCallback(
       base::Value(callback_id),
@@ -185,8 +185,8 @@
 void DownloadsHandler::HandleSetDownloadsConnectionAccountLink(
     const base::ListValue* args) {
   DCHECK(IsDownloadsConnectionPolicyEnabled());
-  CHECK_EQ(1U, args->GetList().size());
-  bool enable_link = args->GetList()[0].GetBool();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  bool enable_link = args->GetListDeprecated()[0].GetBool();
   ec::SetFileSystemConnectorAccountLinkForSettingsPage(
       enable_link, profile_,
       base::BindOnce(&DownloadsHandler::OnDownloadsConnectionAccountLinkSet,
diff --git a/chrome/browser/ui/webui/settings/extension_control_handler.cc b/chrome/browser/ui/webui/settings/extension_control_handler.cc
index 8845449..4c99bc5 100644
--- a/chrome/browser/ui/webui/settings/extension_control_handler.cc
+++ b/chrome/browser/ui/webui/settings/extension_control_handler.cc
@@ -27,7 +27,7 @@
 
 void ExtensionControlHandler::HandleDisableExtension(
     const base::ListValue* args) {
-  const std::string& extension_id = args->GetList()[0].GetString();
+  const std::string& extension_id = args->GetListDeprecated()[0].GetString();
   extensions::ExtensionService* extension_service =
       extensions::ExtensionSystem::Get(Profile::FromWebUI(web_ui()))
           ->extension_service();
diff --git a/chrome/browser/ui/webui/settings/font_handler.cc b/chrome/browser/ui/webui/settings/font_handler.cc
index 01df8d9..8c0e561e 100644
--- a/chrome/browser/ui/webui/settings/font_handler.cc
+++ b/chrome/browser/ui/webui/settings/font_handler.cc
@@ -48,8 +48,8 @@
 void FontHandler::OnJavascriptDisallowed() {}
 
 void FontHandler::HandleFetchFontsData(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   AllowJavascript();
   content::GetFontListAsync(base::BindOnce(&FontHandler::FontListHasLoaded,
@@ -59,7 +59,7 @@
 
 void FontHandler::FontListHasLoaded(std::string callback_id,
                                     std::unique_ptr<base::ListValue> list) {
-  base::Value::ListView list_view = list->GetList();
+  base::Value::ListView list_view = list->GetListDeprecated();
   // Font list. Selects the directionality for the fonts in the given list.
   for (auto& i : list_view) {
     DCHECK(i.is_list());
diff --git a/chrome/browser/ui/webui/settings/hats_handler.cc b/chrome/browser/ui/webui/settings/hats_handler.cc
index d3b339d..47b1987 100644
--- a/chrome/browser/ui/webui/settings/hats_handler.cc
+++ b/chrome/browser/ui/webui/settings/hats_handler.cc
@@ -58,9 +58,9 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  auto interaction =
-      static_cast<TrustSafetyInteraction>(args->GetList()[0].GetInt());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  auto interaction = static_cast<TrustSafetyInteraction>(
+      args->GetListDeprecated()[0].GetInt());
 
   // Both the HaTS service, and the T&S sentiment service (which is another
   // wrapper on the HaTS service), may decide to launch surveys based on this
diff --git a/chrome/browser/ui/webui/settings/import_data_handler.cc b/chrome/browser/ui/webui/settings/import_data_handler.cc
index 1189cac8..b5e64571 100644
--- a/chrome/browser/ui/webui/settings/import_data_handler.cc
+++ b/chrome/browser/ui/webui/settings/import_data_handler.cc
@@ -105,7 +105,7 @@
 
 void ImportDataHandler::HandleImportData(const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 2u);
 
   int browser_index = list[0].GetInt();
@@ -148,8 +148,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   importer_list_ = std::make_unique<ImporterList>();
   importer_list_->DetectSourceProfiles(
@@ -166,7 +166,7 @@
   if (select_file_dialog_)
     return;
 
-  DCHECK(args && args->GetList().empty());
+  DCHECK(args && args->GetListDeprecated().empty());
   select_file_dialog_ = ui::SelectFileDialog::Create(
       this,
       std::make_unique<ChromeSelectFilePolicy>(web_ui()->GetWebContents()));
diff --git a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
index 3abd13b..f9f9a4d3 100644
--- a/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
+++ b/chrome/browser/ui/webui/settings/incompatible_applications_handler_win.cc
@@ -63,7 +63,7 @@
 
 void IncompatibleApplicationsHandler::HandleRequestIncompatibleApplicationsList(
     const base::ListValue* args) {
-  CHECK_EQ(1u, args->GetList().size());
+  CHECK_EQ(1u, args->GetListDeprecated().size());
 
   AllowJavascript();
 
@@ -111,19 +111,19 @@
   UMA_HISTOGRAM_COUNTS_100("IncompatibleApplicationsPage.NumApplications",
                            incompatible_applications.size());
 
-  const base::Value& callback_id = args->GetList().front();
+  const base::Value& callback_id = args->GetListDeprecated().front();
   ResolveJavascriptCallback(callback_id, application_list);
 }
 
 void IncompatibleApplicationsHandler::HandleStartApplicationUninstallation(
     const base::ListValue* args) {
-  CHECK_EQ(1u, args->GetList().size());
+  CHECK_EQ(1u, args->GetListDeprecated().size());
   base::RecordAction(base::UserMetricsAction(
       "IncompatibleApplicationsPage.UninstallationStarted"));
 
   // Open the Apps & Settings page with the application name highlighted.
   uninstall_application::LaunchUninstallFlow(
-      base::UTF8ToWide(args->GetList()[0].GetString()));
+      base::UTF8ToWide(args->GetListDeprecated()[0].GetString()));
 }
 
 void IncompatibleApplicationsHandler::HandleGetSubtitlePluralString(
@@ -147,10 +147,10 @@
 void IncompatibleApplicationsHandler::GetPluralString(
     int id,
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
 
-  const base::Value& callback_id = args->GetList()[0];
-  int num_applications = args->GetList()[1].GetInt();
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  int num_applications = args->GetListDeprecated()[1].GetInt();
   DCHECK_GT(num_applications, 0);
 
   ResolveJavascriptCallback(
diff --git a/chrome/browser/ui/webui/settings/languages_handler.cc b/chrome/browser/ui/webui/settings/languages_handler.cc
index b04ed36..aa71f99c 100644
--- a/chrome/browser/ui/webui/settings/languages_handler.cc
+++ b/chrome/browser/ui/webui/settings/languages_handler.cc
@@ -45,7 +45,7 @@
 
 void LanguagesHandler::HandleGetProspectiveUILanguage(
     const base::ListValue* args) {
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   AllowJavascript();
 
@@ -66,18 +66,18 @@
 void LanguagesHandler::HandleSetProspectiveUILanguage(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
 
 #if BUILDFLAG(IS_WIN)
   PrefService* prefs = g_browser_process->local_state();
-  const std::string& language_code = args->GetList()[0].GetString();
+  const std::string& language_code = args->GetListDeprecated()[0].GetString();
   prefs->SetString(language::prefs::kApplicationLocale, language_code);
 #elif BUILDFLAG(IS_CHROMEOS_ASH)
   // Secondary users and public session users cannot change the locale.
   user_manager::UserManager* user_manager = user_manager::UserManager::Get();
   const user_manager::User* user =
       ash::ProfileHelper::Get()->GetUserByProfile(profile_);
-  const std::string& language_code = args->GetList()[0].GetString();
+  const std::string& language_code = args->GetListDeprecated()[0].GetString();
   if (user &&
       user->GetAccountId() == user_manager->GetPrimaryUser()->GetAccountId() &&
       user->GetType() != user_manager::USER_TYPE_PUBLIC_ACCOUNT) {
diff --git a/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc b/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
index d1fc5ad8e..92da5d7 100644
--- a/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
+++ b/chrome/browser/ui/webui/settings/metrics_reporting_handler.cc
@@ -96,7 +96,7 @@
     return;
   }
 
-  bool enabled = args->GetList()[0].GetBool();
+  bool enabled = args->GetListDeprecated()[0].GetBool();
   ChangeMetricsReportingState(enabled);
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
diff --git a/chrome/browser/ui/webui/settings/on_startup_handler.cc b/chrome/browser/ui/webui/settings/on_startup_handler.cc
index 6b6ee44..bb91c70 100644
--- a/chrome/browser/ui/webui/settings/on_startup_handler.cc
+++ b/chrome/browser/ui/webui/settings/on_startup_handler.cc
@@ -80,16 +80,16 @@
 }
 
 void OnStartupHandler::HandleGetNtpExtension(const base::ListValue* args) {
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   AllowJavascript();
 
   ResolveJavascriptCallback(callback_id, GetNtpExtension());
 }
 
 void OnStartupHandler::HandleValidateStartupPage(const base::ListValue* args) {
-  CHECK_EQ(args->GetList().size(), 2U);
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& url_string = args->GetList()[1].GetString();
+  CHECK_EQ(args->GetListDeprecated().size(), 2U);
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& url_string = args->GetListDeprecated()[1].GetString();
   AllowJavascript();
 
   bool valid = settings_utils::FixupAndValidateStartupPage(url_string, nullptr);
diff --git a/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc b/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc
index 6fa4874..06c1cb61 100644
--- a/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc
+++ b/chrome/browser/ui/webui/settings/privacy_sandbox_handler.cc
@@ -55,15 +55,15 @@
 void PrivacySandboxHandler::HandleGetFlocId(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   ResolveJavascriptCallback(callback_id,
                             GetFlocIdInformation(Profile::FromWebUI(web_ui())));
 }
 
 void PrivacySandboxHandler::HandleResetFlocId(const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
   AllowJavascript();
 
   auto* privacy_sandbox_service =
diff --git a/chrome/browser/ui/webui/settings/profile_info_handler.cc b/chrome/browser/ui/webui/settings/profile_info_handler.cc
index a5651ff..cc6600a9 100644
--- a/chrome/browser/ui/webui/settings/profile_info_handler.cc
+++ b/chrome/browser/ui/webui/settings/profile_info_handler.cc
@@ -100,8 +100,8 @@
 void ProfileInfoHandler::HandleGetProfileInfo(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   ResolveJavascriptCallback(callback_id, *GetAccountNameAndIcon());
 }
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
index cbeb0c7..5eec19c49 100644
--- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
+++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -198,8 +198,8 @@
 void ProtocolHandlersHandler::HandleSetHandlersEnabled(
     const base::ListValue* args) {
   bool enabled = true;
-  CHECK(args->GetList()[0].is_bool());
-  enabled = args->GetList()[0].GetBool();
+  CHECK(args->GetListDeprecated()[0].is_bool());
+  enabled = args->GetListDeprecated()[0].GetBool();
   if (enabled)
     GetProtocolHandlerRegistry()->Enable();
   else
@@ -214,7 +214,7 @@
 
 ProtocolHandler ProtocolHandlersHandler::ParseHandlerFromArgs(
     const base::ListValue* args) const {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   bool ok = args_list.size() >= 2u && args_list[0].is_string() &&
             args_list[1].is_string();
   if (!ok)
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
index 6437096..caaed59 100644
--- a/chrome/browser/ui/webui/settings/reset_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -134,10 +134,10 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(3U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
-  const bool& send_settings = args->GetList()[1].GetBool();
-  std::string request_origin_string = args->GetList()[2].GetString();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
+  const bool& send_settings = args->GetListDeprecated()[1].GetBool();
+  std::string request_origin_string = args->GetListDeprecated()[2].GetString();
   reset_report::ChromeResetReport::ResetRequestOrigin request_origin =
       ResetRequestOriginFromString(request_origin_string);
 
@@ -177,8 +177,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   setting_snapshot_->RequestShortcuts(
       base::BindOnce(&ResetSettingsHandler::OnGetReportedSettingsDone,
@@ -265,8 +265,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   // Set up the localized strings for the triggered profile reset dialog.
   // Custom reset tool names are supported on Windows only.
diff --git a/chrome/browser/ui/webui/settings/safety_check_handler.cc b/chrome/browser/ui/webui/settings/safety_check_handler.cc
index f8db9c8..eed5463 100644
--- a/chrome/browser/ui/webui/settings/safety_check_handler.cc
+++ b/chrome/browser/ui/webui/settings/safety_check_handler.cc
@@ -373,7 +373,7 @@
 
 void SafetyCheckHandler::HandleGetParentRanDisplayString(
     const base::ListValue* args) {
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   // Send updated timestamp-based display strings to all SC children who have
   // such strings.
diff --git a/chrome/browser/ui/webui/settings/search_engines_handler.cc b/chrome/browser/ui/webui/settings/search_engines_handler.cc
index c7b81b0..f4a424f 100644
--- a/chrome/browser/ui/webui/settings/search_engines_handler.cc
+++ b/chrome/browser/ui/webui/settings/search_engines_handler.cc
@@ -253,8 +253,8 @@
 
 void SearchEnginesHandler::HandleGetSearchEnginesList(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   AllowJavascript();
   ResolveJavascriptCallback(callback_id, *GetSearchEnginesList());
 }
@@ -276,9 +276,9 @@
 
 void SearchEnginesHandler::HandleSetIsActiveSearchEngine(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  const int index = args->GetList()[0].GetInt();
-  const bool is_active = args->GetList()[1].GetBool();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const int index = args->GetListDeprecated()[0].GetInt();
+  const bool is_active = args->GetListDeprecated()[1].GetBool();
 
   if (index < 0 || index >= list_controller_.table_model()->RowCount())
     return;
@@ -337,11 +337,11 @@
 
 void SearchEnginesHandler::HandleValidateSearchEngineInput(
     const base::ListValue* args) {
-  CHECK_EQ(3U, args->GetList().size());
+  CHECK_EQ(3U, args->GetListDeprecated().size());
 
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& field_name = args->GetList()[1].GetString();
-  const std::string& field_value = args->GetList()[2].GetString();
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& field_name = args->GetListDeprecated()[1].GetString();
+  const std::string& field_value = args->GetListDeprecated()[2].GetString();
   ResolveJavascriptCallback(
       callback_id, base::Value(CheckFieldValidity(field_name, field_value)));
 }
@@ -376,9 +376,9 @@
     const base::ListValue* args) {
   if (!edit_controller_.get())
     return;
-  const std::string& search_engine = args->GetList()[0].GetString();
-  const std::string& keyword = args->GetList()[1].GetString();
-  const std::string& query_url = args->GetList()[2].GetString();
+  const std::string& search_engine = args->GetListDeprecated()[0].GetString();
+  const std::string& keyword = args->GetListDeprecated()[1].GetString();
+  const std::string& query_url = args->GetListDeprecated()[2].GetString();
 
   // Recheck validity. It's possible to get here with invalid input if e.g. the
   // user calls the right JS functions directly from the web inspector.
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc
index a05f6fe..f3b22d4 100644
--- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler_browsertest.cc
@@ -94,7 +94,8 @@
   ASSERT_TRUE(call_data.arg2()->GetBool());
 
   // Get results from JS callback.
-  const base::span<const base::Value> result = call_data.arg3()->GetList();
+  const base::span<const base::Value> result =
+      call_data.arg3()->GetListDeprecated();
   ASSERT_EQ(1U, result.size());
   auto& installed_app = result.back();
   ASSERT_EQ(url.host(), *(installed_app.FindStringKey("registerableDomain")));
diff --git a/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc b/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
index ffbe1a9..9dc067b 100644
--- a/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_cookies_view_handler.cc
@@ -234,9 +234,9 @@
 }
 
 void CookiesViewHandler::HandleGetCookieDetails(const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
-  std::string site = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  std::string site = args->GetListDeprecated()[1].GetString();
 
   AllowJavascript();
   pending_requests_.emplace(
@@ -267,10 +267,10 @@
 
 void CookiesViewHandler::HandleGetNumCookiesString(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
   std::string callback_id;
-  callback_id = args->GetList()[0].GetString();
-  int num_cookies = args->GetList()[1].GetInt();
+  callback_id = args->GetListDeprecated()[0].GetString();
+  int num_cookies = args->GetListDeprecated()[1].GetInt();
 
   AllowJavascript();
   const std::u16string string =
@@ -282,9 +282,10 @@
 }
 
 void CookiesViewHandler::HandleGetDisplayList(const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
-  std::u16string filter = base::UTF8ToUTF16(args->GetList()[1].GetString());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  std::u16string filter =
+      base::UTF8ToUTF16(args->GetListDeprecated()[1].GetString());
 
   AllowJavascript();
   pending_requests_.emplace(
@@ -308,8 +309,8 @@
 }
 
 void CookiesViewHandler::HandleReloadCookies(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   // Allowing Javascript for the first time will queue a task to create a new
   // tree model. Thus the tree model only needs to be recreated if Javascript
@@ -334,10 +335,10 @@
 }
 
 void CookiesViewHandler::HandleRemoveAll(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
   AllowJavascript();
 
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   pending_requests_.emplace(
       Request::SYNC_BATCH,
@@ -352,7 +353,7 @@
 }
 
 void CookiesViewHandler::HandleRemoveItem(const base::ListValue* args) {
-  std::string node_path = args->GetList()[0].GetString();
+  std::string node_path = args->GetListDeprecated()[0].GetString();
 
   AllowJavascript();
   pending_requests_.emplace(
@@ -371,8 +372,8 @@
 }
 
 void CookiesViewHandler::HandleRemoveThirdParty(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   AllowJavascript();
   Profile* profile = Profile::FromWebUI(web_ui());
@@ -390,7 +391,7 @@
 }
 
 void CookiesViewHandler::HandleRemoveShownItems(const base::ListValue* args) {
-  CHECK_EQ(0U, args->GetList().size());
+  CHECK_EQ(0U, args->GetListDeprecated().size());
 
   AllowJavascript();
   pending_requests_.emplace(
@@ -407,8 +408,9 @@
 }
 
 void CookiesViewHandler::HandleRemoveSite(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  std::u16string site = base::UTF8ToUTF16(args->GetList()[0].GetString());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  std::u16string site =
+      base::UTF8ToUTF16(args->GetListDeprecated()[0].GetString());
   AllowJavascript();
   pending_requests_.emplace(
       Request::NO_BATCH,
diff --git a/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc
index e6e4551..34d7446 100644
--- a/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/settings_cookies_view_handler_unittest.cc
@@ -170,7 +170,7 @@
             get_display_list_response.arg1()->GetString());
   ASSERT_TRUE(get_display_list_response.arg2()->GetBool());
   base::Value::ConstListView local_data_list =
-      get_display_list_response.arg3()->GetList();
+      get_display_list_response.arg3()->GetListDeprecated();
   ASSERT_EQ(2U, local_data_list.size());
   EXPECT_EQ(kTestHost1, local_data_list[0].FindKey("site")->GetString());
   EXPECT_EQ(kTestHost2, local_data_list[1].FindKey("site")->GetString());
@@ -286,7 +286,7 @@
   EXPECT_EQ("cr.webUIResponse", data.function_name());
   ASSERT_TRUE(data.arg2()->GetBool());
 
-  base::Value::ConstListView cookies_list = data.arg3()->GetList();
+  base::Value::ConstListView cookies_list = data.arg3()->GetListDeprecated();
   ASSERT_EQ(2UL, cookies_list.size());
   EXPECT_EQ("cookie", cookies_list[0].FindKey("type")->GetString());
   EXPECT_EQ("local_storage", cookies_list[1].FindKey("type")->GetString());
@@ -309,7 +309,8 @@
     EXPECT_EQ("cr.webUIResponse", data.function_name());
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
-    base::Value::ConstListView local_data_list = data.arg3()->GetList();
+    base::Value::ConstListView local_data_list =
+        data.arg3()->GetListDeprecated();
     ASSERT_EQ(1U, local_data_list.size());
     EXPECT_EQ(kTestHost1, local_data_list[0].FindKey("site")->GetString());
   }
@@ -327,7 +328,8 @@
     EXPECT_EQ("cr.webUIResponse", data.function_name());
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
-    base::Value::ConstListView local_data_list = data.arg3()->GetList();
+    base::Value::ConstListView local_data_list =
+        data.arg3()->GetListDeprecated();
     ASSERT_EQ(2U, local_data_list.size());
     EXPECT_EQ(kTestHost1, local_data_list[0].FindKey("site")->GetString());
     EXPECT_EQ(kTestHost2, local_data_list[1].FindKey("site")->GetString());
@@ -351,7 +353,8 @@
     EXPECT_EQ("cr.webUIResponse", data.function_name());
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
-    base::Value::ConstListView local_data_list = data.arg3()->GetList();
+    base::Value::ConstListView local_data_list =
+        data.arg3()->GetListDeprecated();
     ASSERT_EQ(1U, local_data_list.size());
     EXPECT_EQ(kTestHost2, local_data_list[0].FindKey("site")->GetString());
   }
@@ -375,7 +378,8 @@
     EXPECT_EQ("cr.webUIResponse", data.function_name());
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
-    base::Value::ConstListView local_data_list = data.arg3()->GetList();
+    base::Value::ConstListView local_data_list =
+        data.arg3()->GetListDeprecated();
     ASSERT_EQ(1U, local_data_list.size());
     EXPECT_EQ(kTestHost1, local_data_list[0].FindKey("site")->GetString());
   }
@@ -395,7 +399,7 @@
   EXPECT_EQ("cr.webUIResponse", data.function_name());
   ASSERT_TRUE(data.arg2()->GetBool());
 
-  base::Value::ConstListView cookies_list = data.arg3()->GetList();
+  base::Value::ConstListView cookies_list = data.arg3()->GetListDeprecated();
   ASSERT_EQ(2UL, cookies_list.size());
   EXPECT_EQ("cookie", cookies_list[0].FindKey("type")->GetString());
   EXPECT_EQ("local_storage", cookies_list[1].FindKey("type")->GetString());
@@ -428,7 +432,8 @@
     EXPECT_EQ("cr.webUIResponse", data.function_name());
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
-    base::Value::ConstListView local_data_list = data.arg3()->GetList();
+    base::Value::ConstListView local_data_list =
+        data.arg3()->GetListDeprecated();
     ASSERT_EQ(0U, local_data_list.size());
   }
 }
@@ -448,7 +453,7 @@
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
-    base::Value::ConstListView cookies_list = data.arg3()->GetList();
+    base::Value::ConstListView cookies_list = data.arg3()->GetListDeprecated();
     ASSERT_EQ(2UL, cookies_list.size());
     // Find the entry item associated with the kTestCookie1 cookie.
     for (const auto& cookie : cookies_list) {
@@ -480,7 +485,7 @@
     task_environment()->RunUntilIdle();
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
-    base::Value::ConstListView cookies_list = data.arg3()->GetList();
+    base::Value::ConstListView cookies_list = data.arg3()->GetListDeprecated();
     ASSERT_EQ(1UL, cookies_list.size());
     EXPECT_EQ("local_storage", cookies_list[0].FindKey("type")->GetString());
   }
@@ -514,7 +519,8 @@
     EXPECT_EQ("cr.webUIResponse", data.function_name());
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
-    base::Value::ConstListView local_data_list = data.arg3()->GetList();
+    base::Value::ConstListView local_data_list =
+        data.arg3()->GetListDeprecated();
     ASSERT_EQ(1U, local_data_list.size());
     EXPECT_EQ(kTestHost2, local_data_list[0].FindKey("site")->GetString());
   }
diff --git a/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc b/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
index c3376de..ec4e24c 100644
--- a/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_default_browser_handler.cc
@@ -63,8 +63,8 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(args->GetList().size(), 1U);
-  check_default_callback_id_ = args->GetList()[0].GetString();
+  CHECK_EQ(args->GetListDeprecated().size(), 1U);
+  check_default_callback_id_ = args->GetListDeprecated()[0].GetString();
 
   default_browser_worker_->StartCheckIsDefault(
       base::BindOnce(&DefaultBrowserHandler::OnDefaultBrowserWorkerFinished,
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 aa98dd8..9b990316 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -68,6 +68,7 @@
 #include "components/password_manager/core/browser/manage_passwords_referrer.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_features.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
 #include "components/signin/public/base/signin_buildflags.h"
 #include "components/strings/grit/components_chromium_strings.h"
@@ -1590,6 +1591,23 @@
        IDS_SETTINGS_PRIVACY_SANDBOX_PAGE_FLOC_COHORT_NEXT_UPDATE},
       {"privacySandboxPageFlocResetCohort",
        IDS_SETTINGS_PRIVACY_SANDBOX_PAGE_FLOC_RESET_COHORT},
+      // The following strings are used for PrivacySandboxSettings3.
+      {"privacySandboxTrialsTitle", IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_TITLE},
+      {"privacySandboxTrialsSummary",
+       IDS_SETTINGS_PRIVACY_SANDBOX_TRIALS_SUMMARY},
+      {"privacySandboxAdPersonalizationTitle",
+       IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_TITLE},
+      {"privacySandboxAdPersonalizationSummary",
+       IDS_SETTINGS_PRIVACY_SANDBOX_AD_PERSONALIZATION_SUMMARY},
+      {"privacySandboxAdMeasurementTitle",
+       IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_TITLE},
+      {"privacySandboxAdMeasurementSummary",
+       IDS_SETTINGS_PRIVACY_SANDBOX_AD_MEASUREMENT_SUMMARY},
+      {"privacySandboxSpamAndFraudTitle",
+       IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_TITLE},
+      {"privacySandboxSpamAndFraudSummary",
+       IDS_SETTINGS_PRIVACY_SANDBOX_SPAM_AND_FRAUD_SUMMARY},
+
   };
   html_source->AddLocalizedStrings(kLocalizedStrings);
 
@@ -1616,6 +1634,10 @@
   html_source->AddString("privacySandboxPageFlocResetExplanation",
                          PrivacySandboxServiceFactory::GetForProfile(profile)
                              ->GetFlocResetExplanationForDisplay());
+
+  html_source->AddBoolean(
+      "privacySandboxSettings3Enabled",
+      base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings3));
 }
 
 void AddPrivacyReviewStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
index 9d147e6d..7a7a7f18 100644
--- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler.cc
@@ -129,8 +129,8 @@
 
   profiles::UpdateGaiaProfileInfoIfNeeded(profile_);
 
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   ResolveJavascriptCallback(callback_id, base::Value(GetAvailableIcons()));
 }
@@ -204,10 +204,10 @@
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   CHECK(args);
-  CHECK_EQ(1u, args->GetList().size());
-  CHECK(args->GetList()[0].is_int());
+  CHECK_EQ(1u, args->GetListDeprecated().size());
+  CHECK(args->GetListDeprecated()[0].is_int());
 
-  size_t new_icon_index = args->GetList()[0].GetInt();
+  size_t new_icon_index = args->GetListDeprecated()[0].GetInt();
   CHECK(profiles::IsDefaultAvatarIconIndex(new_icon_index));
 
   PrefService* pref_service = profile_->GetPrefs();
@@ -224,10 +224,10 @@
 void ManageProfileHandler::HandleSetProfileName(const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   CHECK(args);
-  CHECK_EQ(1u, args->GetList().size());
+  CHECK_EQ(1u, args->GetListDeprecated().size());
 
   std::u16string new_profile_name =
-      base::UTF8ToUTF16(args->GetList()[0].GetString());
+      base::UTF8ToUTF16(args->GetListDeprecated()[0].GetString());
 
   base::TrimWhitespace(new_profile_name, base::TRIM_ALL, &new_profile_name);
   CHECK(!new_profile_name.empty());
@@ -242,8 +242,8 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(ProfileShortcutManager::IsFeatureEnabled());
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   // Don't show the add/remove desktop shortcut button in the single user case.
   ProfileAttributesStorage& storage =
diff --git a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
index 6a1a4c7..cd71b5cb 100644
--- a/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc
@@ -75,7 +75,7 @@
 
     // Expect a non-empty list of dictionaries containing non-empty strings for
     // profile avatar icon urls and labels.
-    EXPECT_FALSE(icons->GetList().empty());
+    EXPECT_FALSE(icons->GetListDeprecated().empty());
     if (gaia_included) {
       VerifyGaiaAvatar(icons, gaia_selected);
     } else {
@@ -86,8 +86,8 @@
         gaia_selected ||
         (selected_index == profiles::GetPlaceholderAvatarIndex());
 
-    for (size_t i = 1; i < icons->GetList().size(); ++i) {
-      const base::Value& icon = icons->GetList()[i];
+    for (size_t i = 1; i < icons->GetListDeprecated().size(); ++i) {
+      const base::Value& icon = icons->GetListDeprecated()[i];
       EXPECT_TRUE(icon.is_dict());
 
       const std::string* icon_url = icon.FindStringKey("url");
@@ -131,7 +131,7 @@
   std::unique_ptr<TestManageProfileHandler> handler_;
 
   void VerifyGaiaAvatar(const base::Value* icons, bool gaia_selected) {
-    const base::Value& icon = icons->GetList()[0];
+    const base::Value& icon = icons->GetListDeprecated()[0];
     EXPECT_TRUE(icon.is_dict());
     EXPECT_EQ(*icon.FindIntKey("index"), 0);
 
@@ -147,7 +147,7 @@
 
   void VerifyDefaultGenericAvatar(const base::Value* icons,
                                   size_t selected_index) {
-    const base::Value& icon = icons->GetList()[0];
+    const base::Value& icon = icons->GetListDeprecated()[0];
     EXPECT_TRUE(icon.is_dict());
     EXPECT_TRUE(!icon.FindStringKey("label")->empty());
     int icon_index_int = icon.FindIntKey("index").value_or(0);
diff --git a/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc b/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc
index 752bc9b..deed13f 100644
--- a/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.cc
@@ -68,12 +68,12 @@
 
 void MediaDevicesSelectionHandler::GetDefaultCaptureDevices(
     const base::ListValue* args) {
-  DCHECK_EQ(1U, args->GetList().size());
-  if (!args->GetList()[0].is_string()) {
+  DCHECK_EQ(1U, args->GetListDeprecated().size());
+  if (!args->GetListDeprecated()[0].is_string()) {
     NOTREACHED();
     return;
   }
-  const std::string& type = args->GetList()[0].GetString();
+  const std::string& type = args->GetListDeprecated()[0].GetString();
   DCHECK(!type.empty());
 
   if (type == kAudio)
@@ -84,13 +84,14 @@
 
 void MediaDevicesSelectionHandler::SetDefaultCaptureDevice(
     const base::ListValue* args) {
-  DCHECK_EQ(2U, args->GetList().size());
-  if (!args->GetList()[0].is_string() || !args->GetList()[1].is_string()) {
+  DCHECK_EQ(2U, args->GetListDeprecated().size());
+  if (!args->GetListDeprecated()[0].is_string() ||
+      !args->GetListDeprecated()[1].is_string()) {
     NOTREACHED();
     return;
   }
-  const std::string& type = args->GetList()[0].GetString();
-  const std::string& device = args->GetList()[1].GetString();
+  const std::string& type = args->GetListDeprecated()[0].GetString();
+  const std::string& device = args->GetListDeprecated()[1].GetString();
 
   DCHECK(!type.empty());
   DCHECK(!device.empty());
diff --git a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
index 4504539..1534088 100644
--- a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
@@ -157,7 +157,7 @@
 void SecureDnsHandler::HandleGetSecureDnsResolverList(
     const base::ListValue* args) {
   AllowJavascript();
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   ResolveJavascriptCallback(base::Value(callback_id),
                             GetSecureDnsResolverList());
@@ -165,15 +165,15 @@
 
 void SecureDnsHandler::HandleGetSecureDnsSetting(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1u, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1u, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, *CreateSecureDnsSettingDict());
 }
 
 void SecureDnsHandler::HandleIsValidConfig(const base::ListValue* args) {
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& custom_entry = args->GetList()[1].GetString();
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& custom_entry = args->GetListDeprecated()[1].GetString();
 
   bool valid = net::DnsOverHttpsConfig::FromString(custom_entry).has_value();
   secure_dns::UpdateValidationHistogram(valid);
@@ -192,8 +192,9 @@
                               base::Value(true));
   }
 
-  probe_callback_id_ = args->GetList()[0].GetString();
-  const std::string& server_templates = args->GetList()[1].GetString();
+  probe_callback_id_ = args->GetListDeprecated()[0].GetString();
+  const std::string& server_templates =
+      args->GetListDeprecated()[1].GetString();
 
   net::DnsConfigOverrides overrides;
   overrides.search = std::vector<std::string>();
@@ -209,9 +210,9 @@
 
 void SecureDnsHandler::HandleRecordUserDropdownInteraction(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& old_provider = args->GetList()[0].GetString();
-  const std::string& new_provider = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& old_provider = args->GetListDeprecated()[0].GetString();
+  const std::string& new_provider = args->GetListDeprecated()[1].GetString();
 
   secure_dns::UpdateDropdownHistograms(providers_, old_provider, new_provider);
 }
diff --git a/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc b/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc
index e3d4a09..c9445d00 100644
--- a/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/settings/settings_secure_dns_handler_browsertest.cc
@@ -159,7 +159,7 @@
         return false;
       secure_dns_templates->clear();
       for (const auto& template_str :
-           dict->FindListPath("templates")->GetList()) {
+           dict->FindListPath("templates")->GetListDeprecated()) {
         if (!template_str.is_string())
           return false;
         secure_dns_templates->push_back(template_str.GetString());
@@ -303,7 +303,8 @@
   ASSERT_TRUE(call_data.arg2()->GetBool());
 
   // Check results.
-  base::Value::ConstListView resolver_list = call_data.arg3()->GetList();
+  base::Value::ConstListView resolver_list =
+      call_data.arg3()->GetListDeprecated();
   ASSERT_GE(resolver_list.size(), 1U);
   EXPECT_TRUE(resolver_list[0].FindKey("value")->GetString().empty());
 }
diff --git a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
index 16a67901..8575ca0 100644
--- a/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
+++ b/chrome/browser/ui/webui/settings/settings_security_key_handler.cc
@@ -48,7 +48,7 @@
 
 void HandleClose(base::RepeatingClosure close_callback,
                  const base::ListValue* args) {
-  DCHECK_EQ(0u, args->GetList().size());
+  DCHECK_EQ(0u, args->GetListDeprecated().size());
   close_callback.Run();
 }
 
@@ -122,11 +122,11 @@
 void SecurityKeysPINHandler::HandleStartSetPIN(const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(State::kNone, state_);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
 
   AllowJavascript();
   DCHECK(callback_id_.empty());
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   state_ = State::kStartSetPIN;
   set_pin_ = std::make_unique<device::SetPINRequestHandler>(
       supported_transports(),
@@ -183,12 +183,12 @@
 void SecurityKeysPINHandler::HandleSetPIN(const base::ListValue* args) {
   DCHECK(state_ == State::kGatherNewPIN || state_ == State::kGatherChangePIN);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(3u, args->GetList().size());
+  DCHECK_EQ(3u, args->GetListDeprecated().size());
 
   DCHECK(callback_id_.empty());
-  callback_id_ = args->GetList()[0].GetString();
-  const std::string old_pin = args->GetList()[1].GetString();
-  const std::string new_pin = args->GetList()[2].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
+  const std::string old_pin = args->GetListDeprecated()[1].GetString();
+  const std::string new_pin = args->GetListDeprecated()[2].GetString();
 
   DCHECK((state_ == State::kGatherNewPIN) == old_pin.empty());
 
@@ -228,11 +228,11 @@
 void SecurityKeysResetHandler::HandleReset(const base::ListValue* args) {
   DCHECK_EQ(State::kNone, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
 
   AllowJavascript();
   DCHECK(callback_id_.empty());
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
 
   state_ = State::kStartReset;
   reset_ = std::make_unique<device::ResetRequestHandler>(
@@ -258,10 +258,10 @@
 void SecurityKeysResetHandler::HandleCompleteReset(
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
 
   DCHECK(callback_id_.empty());
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
 
   switch (state_) {
     case State::kWaitingForResetNoCallbackYet:
@@ -322,12 +322,12 @@
 void SecurityKeysCredentialHandler::HandleStart(const base::ListValue* args) {
   DCHECK_EQ(State::kNone, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
   DCHECK(!credential_management_);
 
   AllowJavascript();
   DCHECK(callback_id_.empty());
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
 
   state_ = State::kStart;
   credential_management_ =
@@ -385,13 +385,13 @@
 void SecurityKeysCredentialHandler::HandlePIN(const base::ListValue* args) {
   DCHECK_EQ(State::kPIN, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(2u, args->GetList().size());
+  DCHECK_EQ(2u, args->GetListDeprecated().size());
   DCHECK(credential_management_);
   DCHECK(credential_management_provide_pin_cb_);
   DCHECK(callback_id_.empty());
 
-  callback_id_ = args->GetList()[0].GetString();
-  std::string pin = args->GetList()[1].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
+  std::string pin = args->GetListDeprecated()[1].GetString();
 
   std::move(credential_management_provide_pin_cb_).Run(pin);
 }
@@ -400,12 +400,12 @@
     const base::ListValue* args) {
   DCHECK_EQ(state_, State::kReady);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
   DCHECK(credential_management_);
   DCHECK(callback_id_.empty());
 
   state_ = State::kGettingCredentials;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   credential_management_->GetCredentials(
       base::BindOnce(&SecurityKeysCredentialHandler::OnHaveCredentials,
                      weak_factory_.GetWeakPtr()));
@@ -414,14 +414,14 @@
 void SecurityKeysCredentialHandler::HandleDelete(const base::ListValue* args) {
   DCHECK_EQ(State::kReady, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(2u, args->GetList().size());
+  DCHECK_EQ(2u, args->GetListDeprecated().size());
   DCHECK(credential_management_);
   DCHECK(callback_id_.empty());
 
   state_ = State::kDeletingCredentials;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   std::vector<device::PublicKeyCredentialDescriptor> credential_ids;
-  for (const base::Value& el : args->GetList()[1].GetList()) {
+  for (const base::Value& el : args->GetListDeprecated()[1].GetList()) {
     std::vector<uint8_t> credential_id_bytes;
     if (!base::HexStringToBytes(el.GetString(), &credential_id_bytes)) {
       NOTREACHED();
@@ -441,15 +441,15 @@
     const base::ListValue* args) {
   DCHECK_EQ(State::kReady, state_);
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(5u, args->GetList().size());
+  DCHECK_EQ(5u, args->GetListDeprecated().size());
   DCHECK(credential_management_);
   DCHECK(callback_id_.empty());
 
   state_ = State::kUpdatingUserInformation;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
 
   std::vector<uint8_t> credential_id_bytes;
-  if (!base::HexStringToBytes(args->GetList()[1].GetString(),
+  if (!base::HexStringToBytes(args->GetListDeprecated()[1].GetString(),
                               &credential_id_bytes)) {
     NOTREACHED();
   }
@@ -457,11 +457,12 @@
       device::CredentialType::kPublicKey, credential_id_bytes);
 
   std::vector<uint8_t> user_handle;
-  if (!base::HexStringToBytes(args->GetList()[2].GetString(), &user_handle)) {
+  if (!base::HexStringToBytes(args->GetListDeprecated()[2].GetString(),
+                              &user_handle)) {
     NOTREACHED();
   }
-  std::string new_username = args->GetList()[3].GetString();
-  std::string new_displayname = args->GetList()[4].GetString();
+  std::string new_username = args->GetListDeprecated()[3].GetString();
+  std::string new_displayname = args->GetListDeprecated()[4].GetString();
 
   device::PublicKeyCredentialUserEntity updated_user(
       std::move(user_handle), std::move(new_username),
@@ -662,12 +663,12 @@
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(state_, State::kNone);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
   DCHECK(callback_id_.empty());
 
   AllowJavascript();
   state_ = State::kStart;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   bio_ = std::make_unique<device::BioEnrollmentHandler>(
       supported_transports(),
       base::BindOnce(&SecurityKeysBioEnrollmentHandler::OnReady,
@@ -808,17 +809,17 @@
 void SecurityKeysBioEnrollmentHandler::HandleProvidePIN(
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(2u, args->GetList().size());
+  DCHECK_EQ(2u, args->GetListDeprecated().size());
   DCHECK_EQ(state_, State::kGatherPIN);
   state_ = State::kGatherPIN;
-  callback_id_ = args->GetList()[0].GetString();
-  std::move(provide_pin_cb_).Run(args->GetList()[1].GetString());
+  callback_id_ = args->GetListDeprecated()[0].GetString();
+  std::move(provide_pin_cb_).Run(args->GetListDeprecated()[1].GetString());
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleGetSensorInfo(
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
   DCHECK_EQ(state_, State::kReady);
   base::DictionaryValue response;
   response.SetIntKey("maxTemplateFriendlyName",
@@ -828,17 +829,17 @@
                        *sensor_info_.max_samples_for_enroll);
   }
   ResolveJavascriptCallback(
-      base::Value(std::move(args->GetList()[0].GetString())),
+      base::Value(std::move(args->GetListDeprecated()[0].GetString())),
       std::move(response));
 }
 
 void SecurityKeysBioEnrollmentHandler::HandleEnumerate(
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
   DCHECK_EQ(state_, State::kReady);
   state_ = State::kEnumerating;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   bio_->EnumerateTemplates(
       base::BindOnce(&SecurityKeysBioEnrollmentHandler::OnHaveEnumeration,
                      weak_factory_.GetWeakPtr()));
@@ -870,10 +871,10 @@
 void SecurityKeysBioEnrollmentHandler::HandleStartEnrolling(
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
   DCHECK_EQ(state_, State::kReady);
   state_ = State::kEnrolling;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   bio_->EnrollTemplate(
       base::BindRepeating(
           &SecurityKeysBioEnrollmentHandler::OnEnrollingResponse,
@@ -941,11 +942,12 @@
 void SecurityKeysBioEnrollmentHandler::HandleDelete(
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(2u, args->GetList().size());
+  DCHECK_EQ(2u, args->GetListDeprecated().size());
   state_ = State::kDeleting;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   std::vector<uint8_t> template_id;
-  if (!base::HexStringToBytes(args->GetList()[1].GetString(), &template_id)) {
+  if (!base::HexStringToBytes(args->GetListDeprecated()[1].GetString(),
+                              &template_id)) {
     NOTREACHED();
     return;
   }
@@ -969,16 +971,17 @@
 void SecurityKeysBioEnrollmentHandler::HandleRename(
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(args->GetList().size(), 3u);
+  DCHECK_EQ(args->GetListDeprecated().size(), 3u);
   state_ = State::kRenaming;
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
   std::vector<uint8_t> template_id;
-  if (!base::HexStringToBytes(args->GetList()[1].GetString(), &template_id)) {
+  if (!base::HexStringToBytes(args->GetListDeprecated()[1].GetString(),
+                              &template_id)) {
     NOTREACHED();
     return;
   }
   bio_->RenameTemplate(
-      std::move(template_id), args->GetList()[2].GetString(),
+      std::move(template_id), args->GetListDeprecated()[2].GetString(),
       base::BindOnce(&SecurityKeysBioEnrollmentHandler::OnRename,
                      weak_factory_.GetWeakPtr()));
 }
@@ -998,7 +1001,7 @@
     const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_EQ(state_, State::kEnrolling);
-  DCHECK_EQ(0u, args->GetList().size());
+  DCHECK_EQ(0u, args->GetListDeprecated().size());
   DCHECK(!callback_id_.empty());
   // OnEnrollmentFinished() will be invoked once the cancellation is complete.
   bio_->CancelEnrollment();
@@ -1027,18 +1030,19 @@
 
 void SecurityKeysPhonesHandler::HandleEnumerate(const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(1u, args->GetList().size());
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
 
   AllowJavascript();
-  DoEnumerate(args->GetList()[0]);
+  DoEnumerate(args->GetListDeprecated()[0]);
 }
 
 void SecurityKeysPhonesHandler::HandleDelete(const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(2u, args->GetList().size());
+  DCHECK_EQ(2u, args->GetListDeprecated().size());
 
   AllowJavascript();
-  const std::string public_key_base64 = args->GetList()[1].GetString();
+  const std::string public_key_base64 =
+      args->GetListDeprecated()[1].GetString();
   std::array<uint8_t, device::kP256X962Length> public_key;
   const bool ok = DecodePublicKey(public_key_base64, &public_key);
   DCHECK(ok);
@@ -1049,16 +1053,17 @@
           ->GetPrefs();
   cablev2::DeletePairingByPublicKey(prefs, public_key);
 
-  DoEnumerate(args->GetList()[0]);
+  DoEnumerate(args->GetListDeprecated()[0]);
 }
 
 void SecurityKeysPhonesHandler::HandleRename(const base::ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK_EQ(3u, args->GetList().size());
+  DCHECK_EQ(3u, args->GetListDeprecated().size());
 
   AllowJavascript();
-  const std::string public_key_base64 = args->GetList()[1].GetString();
-  const std::string new_name = args->GetList()[2].GetString();
+  const std::string public_key_base64 =
+      args->GetListDeprecated()[1].GetString();
+  const std::string new_name = args->GetListDeprecated()[2].GetString();
   content::BrowserContext* const browser_ctx =
       web_ui()->GetWebContents()->GetBrowserContext();
 
@@ -1086,7 +1091,7 @@
       Profile::FromBrowserContext(browser_ctx)->GetPrefs();
   cablev2::RenamePairing(prefs, public_key, new_name, known_devices->Names());
 
-  ResolveJavascriptCallback(args->GetList()[0], base::Value());
+  ResolveJavascriptCallback(args->GetListDeprecated()[0], base::Value());
 }
 
 void SecurityKeysPhonesHandler::DoEnumerate(const base::Value& callback_id) {
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc
index bf8c104a..8ba6417 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -784,8 +784,8 @@
 
 void SiteSettingsHandler::HandleFetchUsageTotal(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  usage_host_ = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  usage_host_ = args->GetListDeprecated()[0].GetString();
 
   update_site_details_ = true;
   if (cookies_tree_model_ && !send_sites_list_ &&
@@ -798,8 +798,8 @@
 
 void SiteSettingsHandler::HandleClearUnpartitionedUsage(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& origin_string = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& origin_string = args->GetListDeprecated()[0].GetString();
   auto origin = url::Origin::Create(GURL(origin_string));
   if (origin.opaque())
     return;
@@ -812,18 +812,18 @@
 
 void SiteSettingsHandler::HandleClearPartitionedUsage(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& origin = args->GetList()[0].GetString();
-  const std::string& etld_plus1 = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& origin = args->GetListDeprecated()[0].GetString();
+  const std::string& etld_plus1 = args->GetListDeprecated()[1].GetString();
 
   RemoveMatchingNodes(cookies_tree_model_.get(), origin, etld_plus1);
 }
 
 void SiteSettingsHandler::HandleSetDefaultValueForContentType(
     const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  const std::string& content_type = args->GetList()[0].GetString();
-  const std::string& setting = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const std::string& content_type = args->GetListDeprecated()[0].GetString();
+  const std::string& setting = args->GetListDeprecated()[1].GetString();
   ContentSetting default_setting;
   CHECK(content_settings::ContentSettingFromString(setting, &default_setting));
   ContentSettingsType type =
@@ -858,9 +858,9 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& type = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& type = args->GetListDeprecated()[1].GetString();
 
   ContentSettingsType content_type =
       site_settings::ContentSettingsTypeFromGroupName(type);
@@ -875,8 +875,8 @@
 void SiteSettingsHandler::HandleGetAllSites(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   all_sites_map_.clear();
   origin_permission_set_.clear();
@@ -943,9 +943,9 @@
 void SiteSettingsHandler::HandleGetCategoryList(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
-  GURL origin(args->GetList()[1].GetString());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  GURL origin(args->GetListDeprecated()[1].GetString());
 
   base::Value result(base::Value::Type::LIST);
   for (ContentSettingsType content_type :
@@ -959,8 +959,8 @@
 void SiteSettingsHandler::HandleGetCookieSettingDescription(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   ResolveJavascriptCallback(base::Value(callback_id),
                             base::Value(GetCookieSettingDescription(profile_)));
 }
@@ -969,9 +969,10 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
-  size_t max_sources = base::checked_cast<size_t>(args->GetList()[1].GetInt());
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  size_t max_sources =
+      base::checked_cast<size_t>(args->GetListDeprecated()[1].GetInt());
 
   const std::vector<ContentSettingsType>& content_types =
       site_settings::GetVisiblePermissionCategories();
@@ -1036,7 +1037,7 @@
       cookie_num = etld_plus1_cookie_num_it->second;
     // Iterate over the origins for the ETLD+1, and set their usage and cookie
     // numbers.
-    for (base::Value& origin_info : origin_list->GetList()) {
+    for (base::Value& origin_info : origin_list->GetListDeprecated()) {
       const std::string& origin = origin_info.FindKey("origin")->GetString();
       bool is_partitioned = origin_info.FindKey("isPartitioned")->GetBool();
       if (!is_partitioned) {
@@ -1072,7 +1073,7 @@
 
 void SiteSettingsHandler::HandleGetFormattedBytes(const base::ListValue* args) {
   AllowJavascript();
-  base::Value::ConstListView list = args->GetList();
+  base::Value::ConstListView list = args->GetListDeprecated();
   CHECK_EQ(2U, list.size());
   int64_t num_bytes = static_cast<int64_t>(list[1].GetDouble());
   ResolveJavascriptCallback(/*callback_id=*/list[0],
@@ -1082,9 +1083,9 @@
 void SiteSettingsHandler::HandleGetExceptionList(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& type = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& type = args->GetListDeprecated()[1].GetString();
   ContentSettingsType content_type =
       site_settings::ContentSettingsTypeFromGroupName(type);
 
@@ -1117,9 +1118,9 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(2U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& type = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& type = args->GetListDeprecated()[1].GetString();
   const site_settings::ChooserTypeNameEntry* chooser_type =
       site_settings::ChooserTypeFromGroupName(type);
   CHECK(chooser_type);
@@ -1133,7 +1134,7 @@
     const base::ListValue* args) {
   AllowJavascript();
 
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_EQ(3U, args_list.size());
   const base::Value& callback_id = args_list[0];
   std::string origin = args_list[1].GetString();
@@ -1180,10 +1181,10 @@
 
 void SiteSettingsHandler::HandleSetOriginPermissions(
     const base::ListValue* args) {
-  CHECK_EQ(3U, args->GetList().size());
-  std::string origin_string = args->GetList()[0].GetString();
-  const std::string* type_string = args->GetList()[1].GetIfString();
-  std::string value = args->GetList()[2].GetString();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  std::string origin_string = args->GetListDeprecated()[0].GetString();
+  const std::string* type_string = args->GetListDeprecated()[1].GetIfString();
+  std::string value = args->GetListDeprecated()[2].GetString();
 
   const GURL origin(origin_string);
   if (!origin.is_valid())
@@ -1248,11 +1249,13 @@
 
 void SiteSettingsHandler::HandleResetCategoryPermissionForPattern(
     const base::ListValue* args) {
-  CHECK_EQ(4U, args->GetList().size());
-  const std::string& primary_pattern_string = args->GetList()[0].GetString();
-  const std::string& secondary_pattern_string = args->GetList()[1].GetString();
-  const std::string& type = args->GetList()[2].GetString();
-  const bool& incognito = args->GetList()[3].GetBool();
+  CHECK_EQ(4U, args->GetListDeprecated().size());
+  const std::string& primary_pattern_string =
+      args->GetListDeprecated()[0].GetString();
+  const std::string& secondary_pattern_string =
+      args->GetListDeprecated()[1].GetString();
+  const std::string& type = args->GetListDeprecated()[2].GetString();
+  const bool& incognito = args->GetListDeprecated()[3].GetBool();
 
   ContentSettingsType content_type =
       site_settings::ContentSettingsTypeFromGroupName(type);
@@ -1308,12 +1311,14 @@
 
 void SiteSettingsHandler::HandleSetCategoryPermissionForPattern(
     const base::ListValue* args) {
-  CHECK_EQ(5U, args->GetList().size());
-  const std::string& primary_pattern_string = args->GetList()[0].GetString();
-  const std::string& secondary_pattern_string = args->GetList()[1].GetString();
-  const std::string& type = args->GetList()[2].GetString();
-  const std::string& value = args->GetList()[3].GetString();
-  const bool& incognito = args->GetList()[4].GetBool();
+  CHECK_EQ(5U, args->GetListDeprecated().size());
+  const std::string& primary_pattern_string =
+      args->GetListDeprecated()[0].GetString();
+  const std::string& secondary_pattern_string =
+      args->GetListDeprecated()[1].GetString();
+  const std::string& type = args->GetListDeprecated()[2].GetString();
+  const std::string& value = args->GetListDeprecated()[3].GetString();
+  const bool& incognito = args->GetListDeprecated()[4].GetBool();
 
   ContentSettingsType content_type =
       site_settings::ContentSettingsTypeFromGroupName(type);
@@ -1375,32 +1380,34 @@
 
 void SiteSettingsHandler::HandleResetChooserExceptionForSite(
     const base::ListValue* args) {
-  CHECK_EQ(4U, args->GetList().size());
+  CHECK_EQ(4U, args->GetListDeprecated().size());
 
-  const std::string& chooser_type_str = args->GetList()[0].GetString();
+  const std::string& chooser_type_str =
+      args->GetListDeprecated()[0].GetString();
   const site_settings::ChooserTypeNameEntry* chooser_type =
       site_settings::ChooserTypeFromGroupName(chooser_type_str);
   CHECK(chooser_type);
 
-  const std::string& origin_str = args->GetList()[1].GetString();
+  const std::string& origin_str = args->GetListDeprecated()[1].GetString();
   GURL requesting_origin(origin_str);
   CHECK(requesting_origin.is_valid());
 
-  const std::string& embedding_origin_str = args->GetList()[2].GetString();
+  const std::string& embedding_origin_str =
+      args->GetListDeprecated()[2].GetString();
   GURL embedding_origin(embedding_origin_str);
   CHECK(embedding_origin.is_valid());
 
   permissions::ObjectPermissionContextBase* chooser_context =
       chooser_type->get_context(profile_);
   chooser_context->RevokeObjectPermission(url::Origin::Create(embedding_origin),
-                                          args->GetList()[3]);
+                                          args->GetListDeprecated()[3]);
 }
 
 void SiteSettingsHandler::HandleIsOriginValid(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& origin_string = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& origin_string = args->GetListDeprecated()[1].GetString();
 
   ResolveJavascriptCallback(callback_id,
                             base::Value(GURL(origin_string).is_valid()));
@@ -1409,10 +1416,10 @@
 void SiteSettingsHandler::HandleIsPatternValidForType(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(3U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
-  const std::string& pattern_string = args->GetList()[1].GetString();
-  const std::string& type = args->GetList()[2].GetString();
+  CHECK_EQ(3U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const std::string& pattern_string = args->GetListDeprecated()[1].GetString();
+  const std::string& type = args->GetListDeprecated()[2].GetString();
 
   std::string reason;
   bool is_valid =
@@ -1515,9 +1522,9 @@
 }
 
 void SiteSettingsHandler::HandleRemoveZoomLevel(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
+  CHECK_EQ(1U, args->GetListDeprecated().size());
 
-  std::string origin = args->GetList()[0].GetString();
+  std::string origin = args->GetListDeprecated()[0].GetString();
 
   if (origin ==
       l10n_util::GetStringUTF8(IDS_ZOOMLEVELS_CHROME_ERROR_PAGES_LABEL)) {
@@ -1567,9 +1574,9 @@
   if (!UnifiedAutoplayConfig::IsBlockAutoplayUserModifiable(profile_))
     return;
 
-  CHECK_EQ(1U, args->GetList().size());
-  CHECK(args->GetList()[0].is_bool());
-  bool value = args->GetList()[0].GetBool();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  CHECK(args->GetListDeprecated()[0].is_bool());
+  bool value = args->GetListDeprecated()[0].GetBool();
 
   profile_->GetPrefs()->SetBoolean(prefs::kBlockAutoplayEnabled, value);
 }
@@ -1724,8 +1731,8 @@
 
 void SiteSettingsHandler::HandleClearEtldPlus1DataAndCookies(
     const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& etld_plus1 = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& etld_plus1 = args->GetListDeprecated()[0].GetString();
 
   AllowJavascript();
   RemoveMatchingNodes(cookies_tree_model_.get(), absl::nullopt, etld_plus1);
@@ -1755,7 +1762,7 @@
 }
 
 void SiteSettingsHandler::HandleRecordAction(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(1U, list.size());
   int action = list[0].GetInt();
   DCHECK_LE(action, static_cast<int>(AllSitesAction2::kMaxValue));
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index 6855535..c926bac 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -297,9 +297,9 @@
     ASSERT_TRUE(data.arg2()->GetBool());
 
     ASSERT_TRUE(data.arg3()->is_list());
-    EXPECT_EQ(1U, data.arg3()->GetList().size());
+    EXPECT_EQ(1U, data.arg3()->GetListDeprecated().size());
 
-    const base::Value& exception = data.arg3()->GetList()[0];
+    const base::Value& exception = data.arg3()->GetListDeprecated()[0];
     ASSERT_TRUE(exception.is_dict());
 
     const std::string* origin = exception.FindStringKey(site_settings::kOrigin);
@@ -397,7 +397,7 @@
     EXPECT_EQ("onZoomLevelsChanged", data.arg1()->GetString());
 
     ASSERT_TRUE(data.arg2()->is_list());
-    base::Value::ConstListView exceptions = data.arg2()->GetList();
+    base::Value::ConstListView exceptions = data.arg2()->GetListDeprecated();
     if (expected_host.empty()) {
       EXPECT_EQ(0U, exceptions.size());
     } else {
@@ -537,7 +537,7 @@
     handler()->ClearAllSitesMapForTesting();
     handler()->OnStorageFetched();
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
-    return data.arg2()->GetList();
+    return data.arg2()->GetListDeprecated();
   }
 
   std::vector<CookieTreeNode*> GetHostNodes(GURL url) {
@@ -615,7 +615,7 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(0UL, site_groups.size());
   }
 
@@ -636,13 +636,13 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(1UL, site_groups.size());
     for (const base::Value& site_group : site_groups) {
       const std::string& etld_plus1_string =
           site_group.FindKey("etldPlus1")->GetString();
       base::Value::ConstListView origin_list =
-          site_group.FindKey("origins")->GetList();
+          site_group.FindKey("origins")->GetListDeprecated();
       EXPECT_EQ("example.com", etld_plus1_string);
       EXPECT_EQ(2UL, origin_list.size());
       EXPECT_EQ(url1.spec(), origin_list[0].FindKey("origin")->GetString());
@@ -665,13 +665,13 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(2UL, site_groups.size());
     for (const base::Value& site_group : site_groups) {
       const std::string& etld_plus1_string =
           site_group.FindKey("etldPlus1")->GetString();
       base::Value::ConstListView origin_list =
-          site_group.FindKey("origins")->GetList();
+          site_group.FindKey("origins")->GetListDeprecated();
       if (etld_plus1_string == "example2.net") {
         EXPECT_EQ(1UL, origin_list.size());
         EXPECT_EQ(url3.spec(), origin_list[0].FindKey("origin")->GetString());
@@ -704,7 +704,7 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(3UL, site_groups.size());
   }
 
@@ -718,7 +718,7 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(2UL, site_groups.size());
     EXPECT_EQ("example.com", site_groups[0].FindKey("etldPlus1")->GetString());
     EXPECT_EQ("example2.net", site_groups[1].FindKey("etldPlus1")->GetString());
@@ -747,7 +747,7 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(2UL, site_groups.size());
     EXPECT_EQ("example.com", site_groups[0].FindKey("etldPlus1")->GetString());
     EXPECT_EQ("example2.net", site_groups[1].FindKey("etldPlus1")->GetString());
@@ -776,7 +776,7 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(2UL, site_groups.size());
     EXPECT_EQ("example.com", site_groups[0].FindKey("etldPlus1")->GetString());
     EXPECT_EQ("example2.net", site_groups[1].FindKey("etldPlus1")->GetString());
@@ -826,7 +826,8 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView recent_permissions = data.arg3()->GetList();
+    base::Value::ConstListView recent_permissions =
+        data.arg3()->GetListDeprecated();
     EXPECT_EQ(0UL, recent_permissions.size());
   }
 
@@ -861,7 +862,8 @@
     EXPECT_EQ(kCallbackId, data.arg1()->GetString());
     ASSERT_TRUE(data.arg2()->GetBool());
 
-    base::Value::ConstListView recent_permissions = data.arg3()->GetList();
+    base::Value::ConstListView recent_permissions =
+        data.arg3()->GetListDeprecated();
     EXPECT_EQ(2UL, recent_permissions.size());
     EXPECT_EQ(url1.spec(),
               recent_permissions[1].FindKey("origin")->GetString());
@@ -872,9 +874,9 @@
     EXPECT_FALSE(recent_permissions[1].FindKey("incognito")->GetBool());
 
     base::Value::ConstListView incognito_url1_permissions =
-        recent_permissions[0].FindKey("recentPermissions")->GetList();
+        recent_permissions[0].FindKey("recentPermissions")->GetListDeprecated();
     base::Value::ConstListView url1_permissions =
-        recent_permissions[1].FindKey("recentPermissions")->GetList();
+        recent_permissions[1].FindKey("recentPermissions")->GetListDeprecated();
 
     EXPECT_EQ(1UL, incognito_url1_permissions.size());
 
@@ -904,7 +906,8 @@
   EXPECT_EQ("onStorageListFetched", data.arg1()->GetString());
 
   ASSERT_TRUE(data.arg2()->is_list());
-  base::Value::ConstListView storage_and_cookie_list = data.arg2()->GetList();
+  base::Value::ConstListView storage_and_cookie_list =
+      data.arg2()->GetListDeprecated();
   EXPECT_EQ(3U, storage_and_cookie_list.size());
 
   {
@@ -921,9 +924,9 @@
     // There will be 2 origins in this case. Cookie node with url
     // http://www.example.com/ will be treat as https://www.example.com/ because
     // this url existed in the storage nodes.
-    EXPECT_EQ(2U, origin_list->GetList().size());
+    EXPECT_EQ(2U, origin_list->GetListDeprecated().size());
 
-    const base::Value& origin_info_0 = origin_list->GetList()[0];
+    const base::Value& origin_info_0 = origin_list->GetListDeprecated()[0];
     ASSERT_TRUE(origin_info_0.is_dict());
 
     EXPECT_EQ("http://abc.example.com/",
@@ -932,7 +935,7 @@
     EXPECT_EQ(0, origin_info_0.FindKey("usage")->GetDouble());
     EXPECT_EQ(1, origin_info_0.FindKey("numCookies")->GetDouble());
 
-    const base::Value& origin_info_1 = origin_list->GetList()[1];
+    const base::Value& origin_info_1 = origin_list->GetListDeprecated()[1];
     ASSERT_TRUE(origin_info_1.is_dict());
 
     // Even though in the cookies the scheme is http, it still stored as https
@@ -956,9 +959,10 @@
     const base::Value* origin_list = site_group.FindListKey("origins");
     ASSERT_TRUE(origin_list && origin_list->is_list());
 
-    EXPECT_EQ(2U, origin_list->GetList().size());
+    EXPECT_EQ(2U, origin_list->GetListDeprecated().size());
 
-    const base::Value& partitioned_origin_info = origin_list->GetList()[0];
+    const base::Value& partitioned_origin_info =
+        origin_list->GetListDeprecated()[0];
     ASSERT_TRUE(partitioned_origin_info.is_dict());
 
     EXPECT_EQ("https://www.example.com/",
@@ -968,7 +972,8 @@
     EXPECT_EQ(1, partitioned_origin_info.FindKey("numCookies")->GetDouble());
     EXPECT_TRUE(partitioned_origin_info.FindKey("isPartitioned")->GetBool());
 
-    const base::Value& unpartitioned_origin_info = origin_list->GetList()[1];
+    const base::Value& unpartitioned_origin_info =
+        origin_list->GetListDeprecated()[1];
     ASSERT_TRUE(unpartitioned_origin_info.is_dict());
 
     EXPECT_EQ("https://www.google.com/",
@@ -997,9 +1002,10 @@
     // exist for the unpartitioned storage. The partitioned cookie for
     // google.com.au, partitioned by google.com.au should have also created an
     // entry.
-    EXPECT_EQ(3U, origin_list->GetList().size());
+    EXPECT_EQ(3U, origin_list->GetListDeprecated().size());
 
-    const base::Value& partitioned_origin_one_info = origin_list->GetList()[0];
+    const base::Value& partitioned_origin_one_info =
+        origin_list->GetListDeprecated()[0];
     ASSERT_TRUE(partitioned_origin_one_info.is_dict());
 
     EXPECT_EQ("https://google.com.au/",
@@ -1012,7 +1018,8 @@
     EXPECT_TRUE(
         partitioned_origin_one_info.FindKey("isPartitioned")->GetBool());
 
-    const base::Value& partitioned_origin_two_info = origin_list->GetList()[1];
+    const base::Value& partitioned_origin_two_info =
+        origin_list->GetListDeprecated()[1];
     EXPECT_EQ("https://www.another-example.com/",
               partitioned_origin_two_info.FindKey("origin")->GetString());
     EXPECT_EQ(0,
@@ -1024,7 +1031,7 @@
         partitioned_origin_two_info.FindKey("isPartitioned")->GetBool());
 
     const base::Value& partitioned_origin_three_info =
-        origin_list->GetList()[2];
+        origin_list->GetListDeprecated()[2];
     ASSERT_TRUE(partitioned_origin_three_info.is_dict());
 
     EXPECT_EQ("https://www.example.com/",
@@ -1060,7 +1067,7 @@
     const base::Value* origin_list = site_group.FindListKey("origins");
     ASSERT_TRUE(origin_list);
 
-    const base::Value& origin_info = origin_list->GetList()[0];
+    const base::Value& origin_info = origin_list->GetListDeprecated()[0];
     ASSERT_TRUE(origin_info.is_dict());
 
     EXPECT_EQ("http://abc.example.com/",
@@ -1080,7 +1087,7 @@
     const base::Value* origin_list = site_group.FindListKey("origins");
     ASSERT_TRUE(origin_list);
 
-    for (const auto& origin_info : origin_list->GetList()) {
+    for (const auto& origin_info : origin_list->GetListDeprecated()) {
       ASSERT_TRUE(origin_info.is_dict());
       EXPECT_FALSE(origin_info.FindKey("isInstalled")->GetBool());
     }
@@ -1120,7 +1127,7 @@
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
 
     ASSERT_TRUE(data.arg3()->is_list());
-    base::Value::ConstListView exceptions = data.arg3()->GetList();
+    base::Value::ConstListView exceptions = data.arg3()->GetListDeprecated();
     ASSERT_EQ(1U, exceptions.size());
 
     validate_exception(exceptions[0]);
@@ -1147,7 +1154,7 @@
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
 
     ASSERT_TRUE(data.arg3()->is_list());
-    base::Value::ConstListView exceptions = data.arg3()->GetList();
+    base::Value::ConstListView exceptions = data.arg3()->GetListDeprecated();
     ASSERT_EQ(2U, exceptions.size());
 
     validate_exception(exceptions[0]);
@@ -1581,7 +1588,7 @@
   site_settings::AddExceptionForHostedApp("[*.]google.com", *extension.get(),
                                           exceptions.get());
 
-  const base::Value& dictionary = exceptions->GetList()[0];
+  const base::Value& dictionary = exceptions->GetListDeprecated()[0];
   CHECK(dictionary.is_dict());
   CHECK(dictionary.FindStringKey(site_settings::kOrigin));
   CHECK(dictionary.FindStringKey(site_settings::kDisplayName));
@@ -1983,14 +1990,14 @@
     handler()->HandleGetAllSites(&base::Value::AsListValue(get_all_sites_args));
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
-    base::Value::ConstListView site_groups = data.arg3()->GetList();
+    base::Value::ConstListView site_groups = data.arg3()->GetListDeprecated();
     EXPECT_EQ(1UL, site_groups.size());
 
     const std::string etld_plus1_string =
         site_groups[0].FindKey("etldPlus1")->GetString();
     EXPECT_EQ("example.com", etld_plus1_string);
     base::Value::ConstListView origin_list =
-        site_groups[0].FindKey("origins")->GetList();
+        site_groups[0].FindKey("origins")->GetListDeprecated();
     EXPECT_EQ(1UL, origin_list.size());
     EXPECT_EQ(kWebUrl.spec(), origin_list[0].FindKey("origin")->GetString());
   }
@@ -2005,7 +2012,8 @@
         &base::Value::AsListValue(get_exception_list_args));
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
-    base::Value::ConstListView exception_list = data.arg3()->GetList();
+    base::Value::ConstListView exception_list =
+        data.arg3()->GetListDeprecated();
     EXPECT_EQ(1UL, exception_list.size());
     EXPECT_EQ("https://example.com:443",
               exception_list[0].FindKey("origin")->GetString());
@@ -2021,7 +2029,8 @@
         &base::Value::AsListValue(get_recent_permissions_args));
 
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
-    base::Value::ConstListView recent_permission_list = data.arg3()->GetList();
+    base::Value::ConstListView recent_permission_list =
+        data.arg3()->GetListDeprecated();
     EXPECT_EQ(1UL, recent_permission_list.size());
     EXPECT_EQ(kWebUrl.spec(),
               recent_permission_list[0].FindKey("origin")->GetString());
@@ -2057,7 +2066,8 @@
     handler()->HandleGetOriginPermissions(
         &base::Value::AsListValue(get_origin_permissions_args));
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
-    const base::Value::ConstListView exception_list = data.arg3()->GetList();
+    const base::Value::ConstListView exception_list =
+        data.arg3()->GetListDeprecated();
     EXPECT_EQ(1UL, exception_list.size());
 
     EXPECT_EQ(origin.GetURL().spec(),
@@ -2236,7 +2246,7 @@
     if (!sites)
       return false;
 
-    for (const auto& site : sites->GetList()) {
+    for (const auto& site : sites->GetListDeprecated()) {
       const std::string* exception_origin =
           site.FindStringKey(site_settings::kOrigin);
       if (!exception_origin)
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc
index 3f151df..0a879091 100644
--- a/chrome/browser/ui/webui/settings/site_settings_helper.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -817,7 +817,7 @@
 
   // Convert the URLs to |ContentSettingsPattern|s. Ignore any invalid ones.
   std::vector<ContentSettingsPattern> patterns;
-  for (const auto& entry : policy_urls->GetList()) {
+  for (const auto& entry : policy_urls->GetListDeprecated()) {
     const std::string* url = entry.GetIfString();
     if (!url)
       continue;
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
index 9527351..3e5a3904 100644
--- a/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_helper_unittest.cc
@@ -560,7 +560,7 @@
         exception, /*chooser_type=*/kUsbChooserGroupName,
         /*display_name=*/kObjectName, *chooser_object);
 
-    const auto& sites_list = exception.FindKey(kSites)->GetList();
+    const auto& sites_list = exception.FindKey(kSites)->GetListDeprecated();
     ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0],
                                    /*origin=*/kGoogleUrl,
                                    /*source=*/kPreferenceSource,
@@ -588,7 +588,7 @@
 
     // The map sorts the sites by requesting origin, so |kAndroidUrl| should
     // be first, followed by the origin pair (kGoogleOrigin, kChromiumOrigin).
-    const auto& sites_list = exception.FindKey(kSites)->GetList();
+    const auto& sites_list = exception.FindKey(kSites)->GetListDeprecated();
     ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0],
                                    /*origin=*/kAndroidUrl,
                                    /*source=*/kPreferenceSource,
@@ -619,7 +619,7 @@
     // CreateChooserExceptionObject method sorts the sites further by the
     // source. Therefore, policy granted sites are listed before user granted
     // sites.
-    const auto& sites_list = exception.FindKey(kSites)->GetList();
+    const auto& sites_list = exception.FindKey(kSites)->GetListDeprecated();
     ExpectValidSiteExceptionObject(/*actual_site_object=*/sites_list[0],
                                    /*origin=*/kGoogleUrl,
                                    /*source=*/kPolicySource,
@@ -752,7 +752,7 @@
     ExpectDisplayNameEq(exception,
                         /*display_name=*/"Devices from Google Inc.");
 
-    const auto& sites_list = exception.FindKey(kSites)->GetList();
+    const auto& sites_list = exception.FindKey(kSites)->GetListDeprecated();
     ASSERT_EQ(sites_list.size(), 1u);
     ExpectValidSiteExceptionObject(sites_list[0],
                                    /*origin=*/kAndroidUrl,
@@ -769,7 +769,7 @@
     ExpectDisplayNameEq(exception,
                         /*display_name=*/"Devices from any vendor");
 
-    const auto& sites_list = exception.FindKey(kSites)->GetList();
+    const auto& sites_list = exception.FindKey(kSites)->GetListDeprecated();
     ASSERT_EQ(sites_list.size(), 1u);
     ExpectValidSiteExceptionObject(sites_list[0],
                                    /*origin=*/kGoogleUrl,
@@ -786,7 +786,7 @@
     ExpectDisplayNameEq(exception,
                         /*display_name=*/"Devices from vendor 0x18D2");
 
-    const auto& sites_list = exception.FindKey(kSites)->GetList();
+    const auto& sites_list = exception.FindKey(kSites)->GetListDeprecated();
     ASSERT_EQ(sites_list.size(), 1u);
     ExpectValidSiteExceptionObject(sites_list[0],
                                    /*origin=*/kAndroidUrl,
@@ -807,7 +807,7 @@
     const auto& exception = exceptions_list[3];
     ExpectDisplayNameEq(exception, /*display_name=*/"Gizmo");
 
-    const auto& sites_list = exception.FindKey(kSites)->GetList();
+    const auto& sites_list = exception.FindKey(kSites)->GetListDeprecated();
     ASSERT_EQ(sites_list.size(), 2u);
     ExpectValidSiteExceptionObject(sites_list[0],
                                    /*origin=*/kChromiumUrl,
diff --git a/chrome/browser/ui/webui/settings/url_handlers_handler.cc b/chrome/browser/ui/webui/settings/url_handlers_handler.cc
index 47c2720..22c9881 100644
--- a/chrome/browser/ui/webui/settings/url_handlers_handler.cc
+++ b/chrome/browser/ui/webui/settings/url_handlers_handler.cc
@@ -234,8 +234,8 @@
 }
 
 void UrlHandlersHandler::HandleGetUrlHandlers(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   AllowJavascript();
 
   base::Value result(base::Value::Type::DICTIONARY);
@@ -246,13 +246,13 @@
 
 void UrlHandlersHandler::HandleResetUrlHandlerSavedChoice(
     const base::ListValue* args) {
-  CHECK_EQ(4U, args->GetList().size());
-  const std::string& origin = args->GetList()[0].GetString();
-  bool has_origin_wildcard = args->GetList()[1].GetBool();
-  const std::string& path = args->GetList()[2].GetString();
+  CHECK_EQ(4U, args->GetListDeprecated().size());
+  const std::string& origin = args->GetListDeprecated()[0].GetString();
+  bool has_origin_wildcard = args->GetListDeprecated()[1].GetBool();
+  const std::string& path = args->GetListDeprecated()[2].GetString();
   // If app_id is an empty string, reset saved choices for all applicable
   // entries regardless of app_id.
-  const std::string& app_id = args->GetList()[3].GetString();
+  const std::string& app_id = args->GetListDeprecated()[3].GetString();
   absl::optional<std::string> app_id_opt =
       app_id.empty() ? absl::nullopt : absl::make_optional(app_id);
 
diff --git a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
index a53e2ab..11bec0e 100644
--- a/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
+++ b/chrome/browser/ui/webui/signin/dice_web_signin_intercept_handler.cc
@@ -139,7 +139,7 @@
   if (primary_account().given_name.empty())
     bubble_parameters_.primary_account.given_name = primary_account().email;
 
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, GetInterceptionParametersValue());
 }
 
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
index daae46f..acfa3e7 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
+++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
@@ -182,9 +182,9 @@
 
 void EnterpriseProfileWelcomeHandler::HandleInitialized(
     const base::ListValue* args) {
-  CHECK_EQ(1u, args->GetList().size());
+  CHECK_EQ(1u, args->GetListDeprecated().size());
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, GetProfileInfoValue());
 }
 
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chrome/browser/ui/webui/signin/inline_login_handler.cc
index 2f32e43..d02b05f 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler.cc
@@ -176,7 +176,7 @@
       net::CookiePartitionKeyCollection::Todo(),
       base::BindOnce(&InlineLoginHandler::HandleCompleteLoginMessageWithCookies,
                      weak_ptr_factory_.GetWeakPtr(),
-                     base::ListValue(args->GetList())));
+                     base::ListValue(args->GetListDeprecated())));
 }
 
 void InlineLoginHandler::HandleCompleteLoginMessageWithCookies(
@@ -219,7 +219,7 @@
 
   // Note: URL string is expected to be in the first argument,
   // but it is not used.
-  CHECK(args->GetList()[0].is_string());
+  CHECK(args->GetListDeprecated()[0].is_string());
 
   Profile* profile = Profile::FromWebUI(web_ui());
   GURL main_frame_url(web_ui()->GetWebContents()->GetLastCommittedURL());
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
index 069ca7c..1a883dae 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -378,7 +378,7 @@
 
 void InlineLoginHandlerChromeOS::GetAccountsInSession(
     const base::ListValue* args) {
-  const std::string& callback_id = args->GetList()[0].GetString();
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
   const Profile* profile = Profile::FromWebUI(web_ui());
   ::GetAccountManagerFacade(profile->GetPath().value())
       ->GetAccounts(base::BindOnce(&InlineLoginHandlerChromeOS::OnGetAccounts,
@@ -460,7 +460,7 @@
 
 void InlineLoginHandlerChromeOS::HandleSkipWelcomePage(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool skip = list[0].GetBool();
   Profile::FromWebUI(web_ui())->GetPrefs()->SetBoolean(
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc
index c686cca..83aa67e 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos_browsertest.cc
@@ -444,7 +444,7 @@
     EXPECT_TRUE(call_data.arg2()->GetBool());
 
     // Get results from JS callback.
-    return call_data.arg3()->GetList();
+    return call_data.arg3()->GetListDeprecated();
   }
 
  private:
diff --git a/chrome/browser/ui/webui/signin/profile_customization_handler.cc b/chrome/browser/ui/webui/signin/profile_customization_handler.cc
index cc260e2..72888fe 100644
--- a/chrome/browser/ui/webui/signin/profile_customization_handler.cc
+++ b/chrome/browser/ui/webui/signin/profile_customization_handler.cc
@@ -85,16 +85,16 @@
 
 void ProfileCustomizationHandler::HandleInitialized(
     const base::ListValue* args) {
-  CHECK_EQ(1u, args->GetList().size());
+  CHECK_EQ(1u, args->GetListDeprecated().size());
   AllowJavascript();
-  const base::Value& callback_id = args->GetList()[0];
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(callback_id, GetProfileInfoValue());
 }
 
 void ProfileCustomizationHandler::HandleDone(const base::ListValue* args) {
-  CHECK_EQ(1u, args->GetList().size());
+  CHECK_EQ(1u, args->GetListDeprecated().size());
   std::u16string profile_name =
-      base::UTF8ToUTF16(args->GetList()[0].GetString());
+      base::UTF8ToUTF16(args->GetListDeprecated()[0].GetString());
 
   base::TrimWhitespace(profile_name, base::TRIM_ALL, &profile_name);
   DCHECK(!profile_name.empty());
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler.cc b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
index 57b272d..40693769 100644
--- a/chrome/browser/ui/webui/signin/profile_picker_handler.cc
+++ b/chrome/browser/ui/webui/signin/profile_picker_handler.cc
@@ -480,9 +480,9 @@
     const base::ListValue* args) {
   TRACE_EVENT1("browser", "ProfilePickerHandler::HandleLaunchSelectedProfile",
                "args", args->DebugString());
-  if (args->GetList().empty())
+  if (args->GetListDeprecated().empty())
     return;
-  const base::Value& profile_path_value = args->GetList()[0];
+  const base::Value& profile_path_value = args->GetListDeprecated()[0];
 
   absl::optional<base::FilePath> profile_path =
       base::ValueToFilePath(profile_path_value);
@@ -561,7 +561,7 @@
 
 void ProfilePickerHandler::HandleAskOnStartupChanged(
     const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   if (list.empty() || !list[0].is_bool())
     return;
   const bool show_on_startup = list[0].GetBool();
@@ -574,8 +574,8 @@
 void ProfilePickerHandler::HandleGetNewProfileSuggestedThemeInfo(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
   if (IsSelectingSecondaryAccount(web_ui())) {
@@ -610,9 +610,9 @@
 void ProfilePickerHandler::HandleGetProfileThemeInfo(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
-  const base::Value& user_theme_choice = args->GetList()[1];
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
+  const base::Value& user_theme_choice = args->GetListDeprecated()[1];
   int color_id = user_theme_choice.FindIntKey("colorId").value();
   absl::optional<SkColor> color = user_theme_choice.FindDoubleKey("color");
   base::Value dict;
@@ -639,23 +639,23 @@
 void ProfilePickerHandler::HandleGetAvailableIcons(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       base::Value(profiles::GetCustomProfileAvatarIconsAndLabels()));
 }
 
 void ProfilePickerHandler::HandleCreateProfile(const base::ListValue* args) {
-  CHECK_EQ(4U, args->GetList().size());
+  CHECK_EQ(4U, args->GetListDeprecated().size());
   std::u16string profile_name =
-      base::UTF8ToUTF16(args->GetList()[0].GetString());
+      base::UTF8ToUTF16(args->GetListDeprecated()[0].GetString());
   // profileColor is undefined for the default theme.
   absl::optional<SkColor> profile_color;
-  if (args->GetList()[1].is_int())
-    profile_color = args->GetList()[1].GetInt();
-  size_t avatar_index = args->GetList()[2].GetInt();
-  bool create_shortcut = args->GetList()[3].GetBool();
+  if (args->GetListDeprecated()[1].is_int())
+    profile_color = args->GetListDeprecated()[1].GetInt();
+  size_t avatar_index = args->GetListDeprecated()[2].GetInt();
+  bool create_shortcut = args->GetListDeprecated()[3].GetBool();
   base::TrimWhitespace(profile_name, base::TRIM_ALL, &profile_name);
   CHECK(!profile_name.empty());
 
@@ -674,8 +674,8 @@
 
 void ProfilePickerHandler::HandleGetSwitchProfile(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   int avatar_icon_size =
       kProfileCardAvatarSize * web_ui()->GetDeviceScaleFactor();
   base::FilePath profile_path = ProfilePicker::GetSwitchProfilePath();
@@ -690,9 +690,9 @@
 
 void ProfilePickerHandler::HandleConfirmProfileSwitch(
     const base::ListValue* args) {
-  if (args->GetList().empty())
+  if (args->GetListDeprecated().empty())
     return;
-  const base::Value& profile_path_value = args->GetList()[0];
+  const base::Value& profile_path_value = args->GetListDeprecated()[0];
 
   absl::optional<base::FilePath> profile_path =
       base::ValueToFilePath(profile_path_value);
@@ -783,8 +783,8 @@
 }
 
 void ProfilePickerHandler::HandleSetProfileName(const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  const base::Value& profile_path_value = args->GetList()[0];
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  const base::Value& profile_path_value = args->GetListDeprecated()[0];
   absl::optional<base::FilePath> profile_path =
       base::ValueToFilePath(profile_path_value);
 
@@ -793,7 +793,7 @@
     return;
   }
   std::u16string profile_name =
-      base::UTF8ToUTF16(args->GetList()[1].GetString());
+      base::UTF8ToUTF16(args->GetListDeprecated()[1].GetString());
   base::TrimWhitespace(profile_name, base::TRIM_ALL, &profile_name);
   CHECK(!profile_name.empty());
   ProfileAttributesEntry* entry =
@@ -805,8 +805,8 @@
 }
 
 void ProfilePickerHandler::HandleRemoveProfile(const base::ListValue* args) {
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& profile_path_value = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& profile_path_value = args->GetListDeprecated()[0];
   absl::optional<base::FilePath> profile_path =
       base::ValueToFilePath(profile_path_value);
 
@@ -828,8 +828,8 @@
 void ProfilePickerHandler::HandleGetProfileStatistics(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& profile_path_value = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& profile_path_value = args->GetListDeprecated()[0];
   absl::optional<base::FilePath> profile_path =
       base::ValueToFilePath(profile_path_value);
   if (!profile_path)
@@ -876,9 +876,10 @@
 void ProfilePickerHandler::HandleLoadSignInProfileCreationFlow(
     const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(2U, args->GetList().size());
-  absl::optional<SkColor> profile_color = args->GetList()[0].GetIfInt();
-  const std::string& gaia_id = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  absl::optional<SkColor> profile_color =
+      args->GetListDeprecated()[0].GetIfInt();
+  const std::string& gaia_id = args->GetListDeprecated()[1].GetString();
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
   if (IsSelectingSecondaryAccount(web_ui())) {
diff --git a/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc b/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc
index 090dba0f..9febf470 100644
--- a/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc
+++ b/chrome/browser/ui/webui/signin/profile_picker_handler_unittest.cc
@@ -104,10 +104,11 @@
     const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
     ASSERT_EQ("cr.webUIListenerCallback", data.function_name());
     ASSERT_EQ("profiles-list-changed", data.arg1()->GetString());
-    size_t size = data.arg2()->GetList().size();
+    size_t size = data.arg2()->GetListDeprecated().size();
     ASSERT_EQ(size, ordered_profile_entries.size());
     for (size_t i = 0; i < size; ++i) {
-      VerifyProfileEntry(data.arg2()->GetList()[i], ordered_profile_entries[i]);
+      VerifyProfileEntry(data.arg2()->GetListDeprecated()[i],
+                         ordered_profile_entries[i]);
     }
   }
 
@@ -316,7 +317,7 @@
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data.function_name());
   EXPECT_EQ("available-accounts-changed", data.arg1()->GetString());
-  EXPECT_TRUE(data.arg2()->GetList().empty());
+  EXPECT_TRUE(data.arg2()->GetListDeprecated().empty());
 }
 
 TEST_F(ProfilePickerHandlerTest, HandleGetAvailableAccounts_Available) {
@@ -349,7 +350,7 @@
   const content::TestWebUI::CallData& data1 = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data1.function_name());
   EXPECT_EQ("available-accounts-changed", data1.arg1()->GetString());
-  EXPECT_EQ(data1.arg2()->GetList().size(), 2u);
+  EXPECT_EQ(data1.arg2()->GetListDeprecated().size(), 2u);
 
   // ****** Account 1 syncing in Secondary profile: return account 2.
   secondary->SetAuthInfo(kGaiaId1, u"example1@gmail.com",
@@ -362,9 +363,9 @@
   const content::TestWebUI::CallData& data2 = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data2.function_name());
   EXPECT_EQ("available-accounts-changed", data2.arg1()->GetString());
-  EXPECT_EQ(data2.arg2()->GetList().size(), 1u);
+  EXPECT_EQ(data2.arg2()->GetListDeprecated().size(), 1u);
   const std::string* gaia_id =
-      data2.arg2()->GetList()[0].FindStringPath("gaiaId");
+      data2.arg2()->GetListDeprecated()[0].FindStringPath("gaiaId");
   EXPECT_NE(gaia_id, nullptr);
   EXPECT_EQ(*gaia_id, kGaiaId2);
   // TODO(https://crbug/1226050): Test all other fields.
@@ -399,7 +400,7 @@
   const content::TestWebUI::CallData& data1 = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data1.function_name());
   EXPECT_EQ("available-accounts-changed", data1.arg1()->GetString());
-  EXPECT_EQ(data1.arg2()->GetList().size(), 2u);
+  EXPECT_EQ(data1.arg2()->GetListDeprecated().size(), 2u);
 
   // Add another account.
   const std::string kGaiaId = "some_gaia_id3";
@@ -419,7 +420,7 @@
   const content::TestWebUI::CallData& data2 = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data2.function_name());
   EXPECT_EQ("available-accounts-changed", data2.arg1()->GetString());
-  EXPECT_EQ(data2.arg2()->GetList().size(), 3u);
+  EXPECT_EQ(data2.arg2()->GetListDeprecated().size(), 3u);
 }
 
 TEST_F(ProfilePickerHandlerTest, CreateProfileExistingAccount) {
@@ -564,7 +565,7 @@
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data.function_name());
   EXPECT_EQ("available-accounts-changed", data.arg1()->GetString());
-  EXPECT_TRUE(data.arg2()->GetList().empty());
+  EXPECT_TRUE(data.arg2()->GetListDeprecated().empty());
 }
 
 TEST_F(ProfilePickerHandlerInUserProfileTest,
@@ -593,7 +594,7 @@
   const content::TestWebUI::CallData& data1 = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data1.function_name());
   EXPECT_EQ("available-accounts-changed", data1.arg1()->GetString());
-  EXPECT_EQ(data1.arg2()->GetList().size(), 2u);
+  EXPECT_EQ(data1.arg2()->GetListDeprecated().size(), 2u);
 
   // ****** Account 1 is assigned to "Secondary": return account 2.
   ProfileAttributesEntry* profile_entry =
@@ -609,9 +610,9 @@
   const content::TestWebUI::CallData& data2 = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data2.function_name());
   EXPECT_EQ("available-accounts-changed", data2.arg1()->GetString());
-  EXPECT_EQ(data2.arg2()->GetList().size(), 1u);
+  EXPECT_EQ(data2.arg2()->GetListDeprecated().size(), 1u);
   const std::string* gaia_id =
-      data2.arg2()->GetList()[0].FindStringPath("gaiaId");
+      data2.arg2()->GetListDeprecated()[0].FindStringPath("gaiaId");
   EXPECT_NE(gaia_id, nullptr);
   EXPECT_EQ(*gaia_id, kGaiaId2);
 }
@@ -636,20 +637,21 @@
   const content::TestWebUI::CallData& data1 = *web_ui()->call_data().back();
   EXPECT_EQ("cr.webUIListenerCallback", data1.function_name());
   EXPECT_EQ("available-accounts-changed", data1.arg1()->GetString());
-  EXPECT_EQ(data1.arg2()->GetList().size(), 1u);
+  EXPECT_EQ(data1.arg2()->GetListDeprecated().size(), 1u);
   const std::string* gaia_id =
-      data1.arg2()->GetList()[0].FindStringPath("gaiaId");
+      data1.arg2()->GetListDeprecated()[0].FindStringPath("gaiaId");
   EXPECT_NE(gaia_id, nullptr);
   EXPECT_EQ(*gaia_id, kGaiaId1);
-  const std::string* email = data1.arg2()->GetList()[0].FindStringPath("email");
+  const std::string* email =
+      data1.arg2()->GetListDeprecated()[0].FindStringPath("email");
   EXPECT_NE(email, nullptr);
   EXPECT_EQ(*email, kEmail1);
   const std::string* full_name =
-      data1.arg2()->GetList()[0].FindStringPath("name");
+      data1.arg2()->GetListDeprecated()[0].FindStringPath("name");
   EXPECT_NE(full_name, nullptr);
   EXPECT_EQ(*full_name, kFullName1);
   const std::string* account_image_url =
-      data1.arg2()->GetList()[0].FindStringPath("accountImageUrl");
+      data1.arg2()->GetListDeprecated()[0].FindStringPath("accountImageUrl");
   EXPECT_NE(account_image_url, nullptr);
 }
 
diff --git a/chrome/browser/ui/webui/signin/signin_reauth_handler.cc b/chrome/browser/ui/webui/signin/signin_reauth_handler.cc
index 063ea537..63f61883 100644
--- a/chrome/browser/ui/webui/signin/signin_reauth_handler.cc
+++ b/chrome/browser/ui/webui/signin/signin_reauth_handler.cc
@@ -77,9 +77,11 @@
 
 sync_pb::UserConsentTypes::AccountPasswordsConsent
 SigninReauthHandler::BuildConsent(const base::ListValue* args) const {
-  CHECK_EQ(2U, args->GetList().size());
-  base::Value::ConstListView consent_description = args->GetList()[0].GetList();
-  const std::string& consent_confirmation = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  base::Value::ConstListView consent_description =
+      args->GetListDeprecated()[0].GetList();
+  const std::string& consent_confirmation =
+      args->GetListDeprecated()[1].GetString();
 
   // The strings returned by the WebUI are not free-form, they must belong into
   // a pre-determined set of strings (stored in |string_to_grd_id_map_|). As
diff --git a/chrome/browser/ui/webui/signin/signin_utils.cc b/chrome/browser/ui/webui/signin/signin_utils.cc
index 05ec2fc..84265db 100644
--- a/chrome/browser/ui/webui/signin/signin_utils.cc
+++ b/chrome/browser/ui/webui/signin/signin_utils.cc
@@ -70,7 +70,7 @@
   if (!browser)
     return;
 
-  double height = args->GetList()[0].GetDouble();
+  double height = args->GetListDeprecated()[0].GetDouble();
   browser->signin_view_controller()->SetModalSigninHeight(
       static_cast<int>(height));
 }
diff --git a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
index 49cd844..28b562e 100644
--- a/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
+++ b/chrome/browser/ui/webui/signin/sync_confirmation_handler.cc
@@ -123,9 +123,11 @@
 }
 
 void SyncConfirmationHandler::RecordConsent(const base::ListValue* args) {
-  CHECK_EQ(2U, args->GetList().size());
-  base::Value::ConstListView consent_description = args->GetList()[0].GetList();
-  const std::string& consent_confirmation = args->GetList()[1].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  base::Value::ConstListView consent_description =
+      args->GetListDeprecated()[0].GetList();
+  const std::string& consent_confirmation =
+      args->GetListDeprecated()[1].GetString();
 
   // The strings returned by the WebUI are not free-form, they must belong into
   // a pre-determined set of strings (stored in |string_to_grd_id_map_|). As
diff --git a/chrome/browser/ui/webui/signin_internals_ui.cc b/chrome/browser/ui/webui/signin_internals_ui.cc
index 792fbdd8..4ed3e56 100644
--- a/chrome/browser/ui/webui/signin_internals_ui.cc
+++ b/chrome/browser/ui/webui/signin_internals_ui.cc
@@ -88,7 +88,7 @@
 }
 
 void SignInInternalsHandler::HandleGetSignInInfo(const base::ListValue* args) {
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   AllowJavascript();
 
   Profile* profile = Profile::FromWebUI(web_ui());
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
index 9e1b128..55491e1 100644
--- a/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
+++ b/chrome/browser/ui/webui/sync_file_system_internals/dump_database_handler.cc
@@ -33,7 +33,7 @@
   if (sync_service) {
     sync_service->DumpDatabase(base::BindOnce(
         &DumpDatabaseHandler::DidGetDatabaseDump, base::Unretained(this),
-        args->GetList()[0].GetString() /* callback_id */));
+        args->GetListDeprecated()[0].GetString() /* callback_id */));
   }
 }
 
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc
index ae715c23..0513926 100644
--- a/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc
+++ b/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc
@@ -111,9 +111,10 @@
   DCHECK(args);
   GetExtensionStatusesAsDictionary(
       profile_,
-      base::BindOnce(&ExtensionStatusesHandler::DidGetExtensionStatuses,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     args->GetList()[0].GetString() /* callback_id */));
+      base::BindOnce(
+          &ExtensionStatusesHandler::DidGetExtensionStatuses,
+          weak_ptr_factory_.GetWeakPtr(),
+          args->GetListDeprecated()[0].GetString() /* callback_id */));
 }
 
 void ExtensionStatusesHandler::DidGetExtensionStatuses(
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc
index 40e7d36..8b993ed9 100644
--- a/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc
+++ b/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc
@@ -45,8 +45,8 @@
 
 void FileMetadataHandler::HandleGetFileMetadata(const base::ListValue* args) {
   AllowJavascript();
-  std::string callback_id = args->GetList()[0].GetString();
-  std::string extension_id = args->GetList()[1].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
+  std::string extension_id = args->GetListDeprecated()[1].GetString();
   if (extension_id.empty()) {
     LOG(WARNING) << "GetFileMetadata() Extension ID wasn't given";
     return;
@@ -81,9 +81,9 @@
   DCHECK(args);
   ExtensionStatusesHandler::GetExtensionStatusesAsDictionary(
       profile_,
-      base::BindOnce(&FileMetadataHandler::DidGetExtensions,
-                     weak_factory_.GetWeakPtr(),
-                     args->GetList()[0].GetString() /* callback_id */));
+      base::BindOnce(
+          &FileMetadataHandler::DidGetExtensions, weak_factory_.GetWeakPtr(),
+          args->GetListDeprecated()[0].GetString() /* callback_id */));
 }
 
 void FileMetadataHandler::DidGetExtensions(std::string callback_id,
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc
index b454654..140a47bb 100644
--- a/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc
+++ b/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc
@@ -129,7 +129,7 @@
     state_enum = sync_service->GetSyncServiceState();
   const std::string state_string = chrome_apps::api::sync_file_system::ToString(
       chrome_apps::api::SyncServiceStateToExtensionEnum(state_enum));
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             base::Value(state_string));
 }
 
@@ -142,13 +142,13 @@
     return;
   bool xmpp_enabled = drive_notification_manager->push_notification_enabled();
   std::string notification_source = xmpp_enabled ? "XMPP" : "Polling";
-  ResolveJavascriptCallback(args->GetList()[0] /* callback_id */,
+  ResolveJavascriptCallback(args->GetListDeprecated()[0] /* callback_id */,
                             base::Value(notification_source));
 }
 
 void SyncFileSystemInternalsHandler::HandleGetLog(const base::ListValue* args) {
   AllowJavascript();
-  const auto& args_list = args->GetList();
+  const auto& args_list = args->GetListDeprecated();
   DCHECK_GE(args_list.size(), 1u);
   const base::Value& callback_id = args_list[0];
   const std::vector<EventLogger::Event> log =
diff --git a/chrome/browser/ui/webui/system_info_ui.cc b/chrome/browser/ui/webui/system_info_ui.cc
index 09920e92..408a5f7 100644
--- a/chrome/browser/ui/webui/system_info_ui.cc
+++ b/chrome/browser/ui/webui/system_info_ui.cc
@@ -119,7 +119,7 @@
 
 void SystemInfoHandler::HandleRequestSystemInfo(const base::ListValue* args) {
   AllowJavascript();
-  callback_id_ = args->GetList()[0].GetString();
+  callback_id_ = args->GetListDeprecated()[0].GetString();
 
   system_logs::SystemLogsFetcher* fetcher =
       system_logs::BuildAboutSystemLogsFetcher();
diff --git a/chrome/browser/ui/webui/tab_strip/DEPS b/chrome/browser/ui/webui/tab_strip/DEPS
new file mode 100644
index 0000000..fa911e6
--- /dev/null
+++ b/chrome/browser/ui/webui/tab_strip/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chrome/browser/ui/views",
+]
\ No newline at end of file
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
index 49ccecf..b487156 100644
--- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
+++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui.cc
@@ -10,6 +10,7 @@
 #include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/webui/favicon_source.h"
 #include "chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.h"
 #include "chrome/browser/ui/webui/tab_strip/tab_strip_ui_embedder.h"
@@ -45,7 +46,6 @@
       ->SetZoomLevelForHostAndScheme(content::kChromeUIScheme,
                                      chrome::kChromeUITabStripHost, 0);
 
-  Profile* profile = Profile::FromWebUI(web_ui);
   content::WebUIDataSource* html_source =
       content::WebUIDataSource::Create(chrome::kChromeUITabStripHost);
   webui::SetupWebUIDataSource(
@@ -56,12 +56,17 @@
   html_source->AddString("tabGroupIdDataType", kWebUITabGroupIdDataType);
 
   // Add a load time string for the frame color to allow the tab strip to paint
-  // a background color that matches the frame before any content loads
-  const ui::ThemeProvider& tp =
-      ThemeService::GetThemeProviderForProfile(profile);
+  // a background color that matches the frame before any content loads.
+  const auto* browser_window =
+      BrowserWindow::FindBrowserWindowWithWebContents(web_ui->GetWebContents());
+  const auto* theme_provider =
+      browser_window ? browser_window->GetThemeProvider() : nullptr;
+  const SkColor frame_color =
+      theme_provider
+          ? theme_provider->GetColor(ThemeProperties::COLOR_FRAME_ACTIVE)
+          : SK_ColorWHITE;
   html_source->AddString("frameColor",
-                         color_utils::SkColorToRgbaString(
-                             tp.GetColor(ThemeProperties::COLOR_FRAME_ACTIVE)));
+                         color_utils::SkColorToRgbaString(frame_color));
 
   static constexpr webui::LocalizedString kStrings[] = {
       {"tabListTitle", IDS_ACCNAME_TAB_LIST},
@@ -85,6 +90,7 @@
       {"namedGroupLabel", IDS_GROUP_AX_LABEL_NAMED_GROUP_FORMAT},
   };
   html_source->AddLocalizedStrings(kStrings);
+  Profile* profile = Profile::FromWebUI(web_ui);
   content::WebUIDataSource::Add(profile, html_source);
 
   content::URLDataSource::Add(
diff --git a/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc b/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc
index 105252f8..669577a 100644
--- a/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc
+++ b/chrome/browser/ui/webui/user_actions/user_actions_ui_handler.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/metrics/user_metrics.h"
+#include "base/time/time.h"
 #include "base/values.h"
 #include "content/public/browser/web_ui.h"
 
diff --git a/chrome/browser/ui/webui/version/version_handler.cc b/chrome/browser/ui/webui/version/version_handler.cc
index 1c04aa8..fdf3efe26 100644
--- a/chrome/browser/ui/webui/version/version_handler.cc
+++ b/chrome/browser/ui/webui/version/version_handler.cc
@@ -89,7 +89,7 @@
 void VersionHandler::HandleRequestVariationInfo(const base::ListValue* args) {
   AllowJavascript();
 
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(2U, list.size());
   const std::string& callback_id = list[0].GetString();
   const bool include_variations_cmd = list[1].GetBool();
@@ -107,8 +107,8 @@
 void VersionHandler::HandleRequestPathInfo(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const std::string& callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const std::string& callback_id = args->GetListDeprecated()[0].GetString();
 
   // Grab the executable path on the FILE thread. It is returned in
   // OnGotFilePaths.
diff --git a/chrome/browser/ui/webui/webapks/webapks_handler.cc b/chrome/browser/ui/webui/webapks/webapks_handler.cc
index bb2ca76..73d5a7c 100644
--- a/chrome/browser/ui/webui/webapks/webapks_handler.cc
+++ b/chrome/browser/ui/webui/webapks/webapks_handler.cc
@@ -38,7 +38,7 @@
 
 void WebApksHandler::HandleRequestWebApkUpdate(const base::ListValue* args) {
   AllowJavascript();
-  for (const auto& val : args->GetList()) {
+  for (const auto& val : args->GetListDeprecated()) {
     if (val.is_string())
       ShortcutHelper::SetForceWebApkUpdate(val.GetString());
   }
diff --git a/chrome/browser/ui/webui/welcome/bookmark_handler.cc b/chrome/browser/ui/webui/welcome/bookmark_handler.cc
index 5353a3cd..da566685 100644
--- a/chrome/browser/ui/webui/welcome/bookmark_handler.cc
+++ b/chrome/browser/ui/webui/welcome/bookmark_handler.cc
@@ -29,7 +29,7 @@
 }
 
 void BookmarkHandler::HandleToggleBookmarkBar(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK(!list.empty());
   const bool show = list[0].GetBool();
   prefs_->SetBoolean(bookmarks::prefs::kShowBookmarkBar, show);
@@ -38,8 +38,8 @@
 void BookmarkHandler::HandleIsBookmarkBarShown(const base::ListValue* args) {
   AllowJavascript();
 
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   ResolveJavascriptCallback(
       callback_id,
diff --git a/chrome/browser/ui/webui/welcome/google_apps_handler.cc b/chrome/browser/ui/webui/welcome/google_apps_handler.cc
index 1d857aa5..02c0cda 100644
--- a/chrome/browser/ui/webui/welcome/google_apps_handler.cc
+++ b/chrome/browser/ui/webui/welcome/google_apps_handler.cc
@@ -104,7 +104,7 @@
 }
 
 void GoogleAppsHandler::HandleCacheGoogleAppIcon(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_GE(list.size(), 1u);
   int app_id = list[0].GetInt();
 
@@ -132,8 +132,8 @@
 
 void GoogleAppsHandler::HandleGetGoogleAppsList(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
   ResolveJavascriptCallback(
       callback_id,
       BookmarkItemsToListValue(google_apps_.data(), google_apps_.size()));
diff --git a/chrome/browser/ui/webui/welcome/ntp_background_handler.cc b/chrome/browser/ui/webui/welcome/ntp_background_handler.cc
index 888c383..1deb51969 100644
--- a/chrome/browser/ui/webui/welcome/ntp_background_handler.cc
+++ b/chrome/browser/ui/webui/welcome/ntp_background_handler.cc
@@ -59,8 +59,8 @@
 
 void NtpBackgroundHandler::HandleGetBackgrounds(const base::ListValue* args) {
   AllowJavascript();
-  CHECK_EQ(1U, args->GetList().size());
-  const base::Value& callback_id = args->GetList()[0];
+  CHECK_EQ(1U, args->GetListDeprecated().size());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   base::ListValue list_value;
   std::array<GURL, kNtpBackgroundsCount> NtpBackgrounds = GetNtpBackgrounds();
@@ -116,7 +116,7 @@
 }
 
 void NtpBackgroundHandler::HandleSetBackground(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(1U, list.size());
   int background_index = list[0].GetInt();
 
diff --git a/chrome/browser/ui/webui/welcome/welcome_handler.cc b/chrome/browser/ui/webui/welcome/welcome_handler.cc
index 03b98b02..2ea1abd 100644
--- a/chrome/browser/ui/webui/welcome/welcome_handler.cc
+++ b/chrome/browser/ui/webui/welcome/welcome_handler.cc
@@ -65,8 +65,8 @@
     GoToNewTabPage();
   } else {
     GURL redirect_url = GURL::EmptyGURL();
-    if (args->GetList().size() == 1U) {
-      const std::string& url_string = args->GetList()[0].GetString();
+    if (args->GetListDeprecated().size() == 1U) {
+      const std::string& url_string = args->GetListDeprecated()[0].GetString();
       redirect_url = GURL(url_string);
       DCHECK(redirect_url.is_valid());
     }
diff --git a/chrome/browser/ui/webui/whats_new/whats_new_handler.cc b/chrome/browser/ui/webui/whats_new/whats_new_handler.cc
index ec7374e6..5a42cbd 100644
--- a/chrome/browser/ui/webui/whats_new/whats_new_handler.cc
+++ b/chrome/browser/ui/webui/whats_new/whats_new_handler.cc
@@ -32,7 +32,7 @@
 }
 
 void WhatsNewHandler::HandleInitialize(const base::ListValue* args) {
-  const auto& list = args->GetList();
+  const auto& list = args->GetListDeprecated();
   CHECK_EQ(1U, list.size());
   const std::string& callback_id = list[0].GetString();
 
diff --git a/chrome/browser/upgrade_detector/upgrade_detector.cc b/chrome/browser/upgrade_detector/upgrade_detector.cc
index 1444dabe..39ea24c 100644
--- a/chrome/browser/upgrade_detector/upgrade_detector.cc
+++ b/chrome/browser/upgrade_detector/upgrade_detector.cc
@@ -284,11 +284,11 @@
   DCHECK(policy_value->is_dict());
 
   const base::Value* entries = policy_value->FindListKey("entries");
-  if (!entries || entries->GetList().empty())
+  if (!entries || entries->GetListDeprecated().empty())
     return absl::nullopt;
 
   // Currently only single daily window is supported.
-  const auto& window = entries->GetList().front();
+  const auto& window = entries->GetListDeprecated().front();
   const absl::optional<int> hour = window.FindIntPath("start.hour");
   const absl::optional<int> minute = window.FindIntPath("start.minute");
   const absl::optional<int> duration_mins = window.FindIntKey("duration_mins");
diff --git a/chrome/browser/usb/usb_browsertest.cc b/chrome/browser/usb/usb_browsertest.cc
index 662020f0..3f298c6 100644
--- a/chrome/browser/usb/usb_browsertest.cc
+++ b/chrome/browser/usb/usb_browsertest.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/usb/usb_chooser_controller.h"
 #include "chrome/browser/usb/web_usb_chooser.h"
 #include "chrome/browser/usb/web_usb_service_impl.h"
+#include "chrome/browser/web_applications/test/isolated_app_test_utils.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
@@ -32,6 +33,8 @@
 #include "extensions/buildflags/buildflags.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "services/device/public/cpp/test/fake_usb_device_info.h"
 #include "services/device/public/cpp/test/fake_usb_device_manager.h"
 #include "services/device/public/mojom/usb_device.mojom.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
@@ -148,6 +151,26 @@
   std::unique_ptr<WebUsbChooser> usb_chooser_;
 };
 
+scoped_refptr<device::FakeUsbDeviceInfo> CreateSmartCardDevice() {
+  auto alternate_setting = device::mojom::UsbAlternateInterfaceInfo::New();
+  alternate_setting->alternate_setting = 0;
+  alternate_setting->class_code = 0x0B;  // Smart Card
+
+  auto interface = device::mojom::UsbInterfaceInfo::New();
+  interface->interface_number = 0;
+  interface->alternates.push_back(std::move(alternate_setting));
+
+  auto config = device::mojom::UsbConfigurationInfo::New();
+  config->configuration_value = 1;
+  config->interfaces.push_back(std::move(interface));
+
+  std::vector<device::mojom::UsbConfigurationInfoPtr> configs;
+  configs.push_back(std::move(config));
+
+  return base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0x4321, 0x8765, "ACME", "Frobinator", "ABCDEF", std::move(configs));
+}
+
 class WebUsbTest : public InProcessBrowserTest {
  public:
   void SetUpOnMainThread() override {
@@ -425,23 +448,7 @@
       LoadExtension(dir.UnpackedPath());
 
   // Configure the test device.
-  auto alternate_setting = device::mojom::UsbAlternateInterfaceInfo::New();
-  alternate_setting->alternate_setting = 0;
-  alternate_setting->class_code = 0x0B;  // Smart Card
-
-  auto interface = device::mojom::UsbInterfaceInfo::New();
-  interface->interface_number = 0;
-  interface->alternates.push_back(std::move(alternate_setting));
-
-  auto config = device::mojom::UsbConfigurationInfo::New();
-  config->configuration_value = 1;
-  config->interfaces.push_back(std::move(interface));
-
-  std::vector<device::mojom::UsbConfigurationInfoPtr> configs;
-  configs.push_back(std::move(config));
-
-  auto fake_device_info = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
-      0x4321, 0x8765, "ACME", "Frobinator", "ABCDEF", std::move(configs));
+  auto fake_device_info = CreateSmartCardDevice();
   auto device_info = device_manager().AddDevice(fake_device_info);
   GetChooserContext()->GrantDevicePermission(extension->origin(), *device_info);
 
@@ -452,4 +459,64 @@
 }
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
+class IsolatedAppUsbBrowserTest
+    : public web_app::IsolatedAppBrowserTestHarness {
+ public:
+  IsolatedAppUsbBrowserTest() = default;
+  ~IsolatedAppUsbBrowserTest() override = default;
+
+  void SetUpOnMainThread() override {
+    IsolatedAppBrowserTestHarness::SetUpOnMainThread();
+
+    mojo::PendingRemote<device::mojom::UsbDeviceManager> remote;
+    device_manager_.AddReceiver(remote.InitWithNewPipeAndPassReceiver());
+    chooser_context()->SetDeviceManagerForTesting(std::move(remote));
+  }
+
+ protected:
+  UsbChooserContext* chooser_context() {
+    return UsbChooserContextFactory::GetForProfile(profile());
+  }
+  device::FakeUsbDeviceManager& device_manager() { return device_manager_; }
+
+ private:
+  device::FakeUsbDeviceManager device_manager_;
+};
+
+IN_PROC_BROWSER_TEST_F(IsolatedAppUsbBrowserTest, ClaimInterface) {
+  auto* non_app_frame = ui_test_utils::NavigateToURL(
+      browser(), https_server()->GetURL("/banners/isolated/simple.html"));
+
+  const char kAppHost[] = "app.com";
+  web_app::AppId app_id = InstallIsolatedApp(kAppHost);
+  auto* app_frame = OpenApp(app_id);
+
+  auto fake_device_info = CreateSmartCardDevice();
+  auto device_info = device_manager().AddDevice(std::move(fake_device_info));
+  chooser_context()->GrantDevicePermission(
+      non_app_frame->GetLastCommittedOrigin(), *device_info);
+  chooser_context()->GrantDevicePermission(app_frame->GetLastCommittedOrigin(),
+                                           *device_info);
+
+  EXPECT_EQ("SecurityError", EvalJs(non_app_frame, R"((async () => {
+    const devices = await navigator.usb.getDevices();
+    const device = devices[0];
+    await device.open();
+    await device.selectConfiguration(1);
+    try {
+      await device.claimInterface(0);
+    } catch (e) {
+      return e.name;
+    }
+  })();)"));
+
+  EXPECT_TRUE(ExecJs(app_frame, R"((async () => {
+    const devices = await navigator.usb.getDevices();
+    const device = devices[0];
+    await device.open();
+    await device.selectConfiguration(1);
+    await device.claimInterface(0);
+  })();)"));
+}
+
 }  // namespace
diff --git a/chrome/browser/usb/usb_policy_allowed_devices.cc b/chrome/browser/usb/usb_policy_allowed_devices.cc
index dcb2889..3fdd5ab 100644
--- a/chrome/browser/usb/usb_policy_allowed_devices.cc
+++ b/chrome/browser/usb/usb_policy_allowed_devices.cc
@@ -83,14 +83,14 @@
 
   // The pref value has already been validated by the policy handler, so it is
   // safe to assume that |pref_value| follows the policy template.
-  for (const auto& item : pref_value->GetList()) {
+  for (const auto& item : pref_value->GetListDeprecated()) {
     const base::Value* urls_list = item.FindKey(kPrefUrlsKey);
     std::set<url::Origin> parsed_set;
 
     // A urls item can contain a pair of URLs that are delimited by a comma. If
     // it does not contain a second URL, set the embedding URL to an empty GURL
     // to signify a wildcard embedded URL.
-    for (const auto& urls_value : urls_list->GetList()) {
+    for (const auto& urls_value : urls_list->GetListDeprecated()) {
       std::vector<std::string> urls =
           base::SplitString(urls_value.GetString(), ",", base::TRIM_WHITESPACE,
                             base::SPLIT_WANT_ALL);
@@ -122,7 +122,7 @@
     // For each device entry in the map, create or update its respective URL
     // set.
     const base::Value* devices = item.FindKey(kPrefDevicesKey);
-    for (const auto& device : devices->GetList()) {
+    for (const auto& device : devices->GetListDeprecated()) {
       // A missing ID signifies a wildcard for that ID, so a sentinel value of
       // -1 is assigned.
       const base::Value* vendor_id_value = device.FindKey(kPrefVendorIdKey);
diff --git a/chrome/browser/usb/web_usb_service_impl.cc b/chrome/browser/usb/web_usb_service_impl.cc
index 0de1baf..210f393 100644
--- a/chrome/browser/usb/web_usb_service_impl.cc
+++ b/chrome/browser/usb/web_usb_service_impl.cc
@@ -193,6 +193,15 @@
   }
 #endif
 
+  // Isolated Apps have unrestricted access to any USB interface class.
+  if (render_frame_host_->GetWebExposedIsolationLevel() >=
+      content::RenderFrameHost::WebExposedIsolationLevel::
+          kMaybeIsolatedApplication) {
+    // TODO(https://crbug.com/1236706): Should the list of interface classes the
+    // app expects to claim be encoded in the Web App Manifest?
+    return {};
+  }
+
   // Specified in https://wicg.github.io/webusb#protected-interface-classes
   std::vector<uint8_t> classes = {
       device::mojom::kUsbAudioClass,       device::mojom::kUsbHidClass,
diff --git a/chrome/browser/vr/ui.cc b/chrome/browser/vr/ui.cc
index b03425c..dc8f97d 100644
--- a/chrome/browser/vr/ui.cc
+++ b/chrome/browser/vr/ui.cc
@@ -915,6 +915,6 @@
                 ui_initial_state);
 }
 }  // extern "C"
-#endif  // defined(OS_ANDROID
+#endif  // BUILDFLAG(IS_ANDROID)
 
 }  // namespace vr
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index 3123658..a138d63 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -117,6 +117,8 @@
     "web_app_internals_utils.h",
     "web_app_mover.cc",
     "web_app_mover.h",
+    "web_app_offline.cc",
+    "web_app_offline.h",
     "web_app_origin_association_manager.cc",
     "web_app_origin_association_manager.h",
     "web_app_origin_association_task.cc",
@@ -238,6 +240,7 @@
     "//chrome/common",
     "//chrome/common:non_code_constants",
     "//components/content_settings/core/browser",
+    "//components/resources:components_resources_grit",
 
     # TODO(crbug.com/1225132): Clean up this legacy crx dependency.
     "//components/crx_file",
@@ -424,6 +427,8 @@
     "test/fake_web_app_registry_controller.h",
     "test/fake_web_app_ui_manager.cc",
     "test/fake_web_app_ui_manager.h",
+    "test/isolated_app_test_utils.cc",
+    "test/isolated_app_test_utils.h",
     "test/mock_file_utils_wrapper.cc",
     "test/mock_file_utils_wrapper.h",
     "test/mock_os_integration_manager.cc",
@@ -616,6 +621,7 @@
     "web_app_icon_manager_browsertest.cc",
     "web_app_internals_browsertest.cc",
     "web_app_mover_browsertest.cc",
+    "web_app_offline_browsertest.cc",
     "web_app_origin_association_manager_browsertest.cc",
     "web_app_url_loader_browsertest.cc",
   ]
diff --git a/chrome/browser/web_applications/adjustments/BUILD.gn b/chrome/browser/web_applications/adjustments/BUILD.gn
index 2458c3c..b0d9cc5 100644
--- a/chrome/browser/web_applications/adjustments/BUILD.gn
+++ b/chrome/browser/web_applications/adjustments/BUILD.gn
@@ -8,6 +8,8 @@
   sources = [
     "link_capturing_pref_migration.cc",
     "link_capturing_pref_migration.h",
+    "preinstalled_web_app_duplication_fixer.cc",
+    "preinstalled_web_app_duplication_fixer.h",
     "web_app_adjustments.cc",
     "web_app_adjustments.h",
   ]
@@ -28,13 +30,19 @@
   testonly = true
 
   sources = []
+
   if (is_chromeos_ash) {
     sources += [ "link_capturing_pref_migration_browsertest.cc" ]
   }
 
+  if (!is_chromeos_lacros) {
+    sources += [ "preinstalled_web_app_duplication_fixer_browsertest.cc" ]
+  }
+
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
 
   deps = [
+    ":adjustments",
     "//chrome/browser/web_applications",
     "//chrome/browser/web_applications:web_applications_test_support_minimal",
     "//chrome/test:test_support",
diff --git a/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.cc b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.cc
new file mode 100644
index 0000000..0fdd337
--- /dev/null
+++ b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.cc
@@ -0,0 +1,104 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.h"
+
+#include "base/metrics/histogram_functions.h"
+#include "base/task/post_task.h"
+#include "chrome/browser/apps/app_service/app_service_proxy.h"
+#include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/web_applications/externally_installed_web_app_prefs.h"
+#include "chrome/browser/web_applications/preinstalled_app_install_features.h"
+#include "chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "components/services/app_service/public/cpp/types_util.h"
+
+namespace web_app {
+
+namespace {
+bool g_skip_startup_for_testing = false;
+}
+
+const char
+    PreinstalledWebAppDuplicationFixer::kHistogramAppDuplicationFixApplied[] =
+        "WebApp.Preinstalled.AppDuplicationFixApplied";
+
+void PreinstalledWebAppDuplicationFixer::SkipStartupForTesting() {
+  g_skip_startup_for_testing = true;
+}
+
+PreinstalledWebAppDuplicationFixer::PreinstalledWebAppDuplicationFixer(
+    Profile& profile)
+    : profile_(profile) {
+  if (g_skip_startup_for_testing)
+    return;
+  // WebAppAdjustmentsFactory guarantees that AppServiceProxy exists.
+  apps::AppRegistryCache& app_registry_cache =
+      apps::AppServiceProxyFactory::GetForProfile(&profile_)
+          ->AppRegistryCache();
+  if (app_registry_cache.IsAppTypeInitialized(
+          apps::mojom::AppType::kChromeApp)) {
+    ScanForDuplication();
+  } else {
+    // Await OnAppTypeInitialized().
+    scoped_observation_.Observe(&app_registry_cache);
+  }
+}
+
+PreinstalledWebAppDuplicationFixer::~PreinstalledWebAppDuplicationFixer() =
+    default;
+
+void PreinstalledWebAppDuplicationFixer::OnAppUpdate(
+    const apps::AppUpdate& update) {}
+
+void PreinstalledWebAppDuplicationFixer::OnAppTypeInitialized(
+    apps::mojom::AppType app_type) {
+  if (app_type != apps::mojom::AppType::kChromeApp)
+    return;
+
+  ScanForDuplication();
+  scoped_observation_.Reset();
+}
+
+void PreinstalledWebAppDuplicationFixer::OnAppRegistryCacheWillBeDestroyed(
+    apps::AppRegistryCache* cache) {
+  scoped_observation_.Reset();
+}
+
+void PreinstalledWebAppDuplicationFixer::ScanForDuplicationForTesting() {
+  ScanForDuplication();
+}
+
+void PreinstalledWebAppDuplicationFixer::ScanForDuplication() {
+  std::vector<PreinstalledWebAppMigration> migrations =
+      GetPreinstalledWebAppMigrations(profile_);
+  size_t fix_count = 0;
+  apps::AppServiceProxyFactory::GetForProfile(&profile_)
+      ->AppRegistryCache()
+      .ForEachApp(
+          [this, &migrations, &fix_count](const apps::AppUpdate& update) {
+            if (update.AppType() != apps::mojom::AppType::kChromeApp)
+              return;
+
+            if (update.Readiness() != apps::mojom::Readiness::kReady)
+              return;
+
+            for (const PreinstalledWebAppMigration& migration : migrations) {
+              if (update.AppId() != migration.old_chrome_app_id)
+                continue;
+              // Remove evidence of web app installation causing
+              // PreinstalledWebAppManager::Synchronize() to reinstall the web
+              // app and re-trigger migration.
+              fix_count += ExternallyInstalledWebAppPrefs(profile_.GetPrefs())
+                               .Remove(migration.install_url);
+            }
+          });
+
+  base::UmaHistogramCounts100(kHistogramAppDuplicationFixApplied, fix_count);
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.h b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.h
new file mode 100644
index 0000000..740b579
--- /dev/null
+++ b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.h
@@ -0,0 +1,54 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_PREINSTALLED_WEB_APP_DUPLICATION_FIXER_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_PREINSTALLED_WEB_APP_DUPLICATION_FIXER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/scoped_observation.h"
+#include "components/services/app_service/public/cpp/app_registry_cache.h"
+
+class Profile;
+
+namespace apps {
+class AppUpdate;
+namespace mojom {
+enum class AppType;
+}
+}  // namespace apps
+
+namespace web_app {
+
+class PreinstalledWebAppDuplicationFixer
+    : public apps::AppRegistryCache::Observer {
+ public:
+  static const char kHistogramAppDuplicationFixApplied[];
+  static void SkipStartupForTesting();
+
+  explicit PreinstalledWebAppDuplicationFixer(Profile& profile);
+  ~PreinstalledWebAppDuplicationFixer() override;
+
+  // apps::AppRegistryCache::Observer:
+  void OnAppUpdate(const apps::AppUpdate& update) override;
+  void OnAppTypeInitialized(apps::mojom::AppType app_type) override;
+  void OnAppRegistryCacheWillBeDestroyed(
+      apps::AppRegistryCache* cache) override;
+
+  void ScanForDuplicationForTesting();
+
+ private:
+  void ObserveAppRegistryCache();
+
+  void ScanForDuplication();
+
+  Profile& profile_;
+
+  base::ScopedObservation<apps::AppRegistryCache,
+                          apps::AppRegistryCache::Observer>
+      scoped_observation_{this};
+};
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_ADJUSTMENTS_PREINSTALLED_WEB_APP_DUPLICATION_FIXER_H_
diff --git a/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer_browsertest.cc b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer_browsertest.cc
new file mode 100644
index 0000000..c15aa49
--- /dev/null
+++ b/chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer_browsertest.cc
@@ -0,0 +1,310 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.h"
+
+#include "base/strings/string_piece.h"
+#include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/web_applications/adjustments/web_app_adjustments.h"
+#include "chrome/browser/web_applications/externally_installed_web_app_prefs.h"
+#include "chrome/browser/web_applications/os_integration_manager.h"
+#include "chrome/browser/web_applications/preinstalled_web_app_manager.h"
+#include "chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h"
+#include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/browser/web_applications/web_app_helpers.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
+#include "extensions/browser/test_extension_registry_observer.h"
+#include "url/gurl.h"
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// #include "ash/public/cpp/shelf_model.h"
+#include "chrome/browser/ui/app_list/app_list_syncable_service.h"
+#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+namespace web_app {
+
+class PreinstalledWebAppDuplicationFixerBrowserTest
+    : public extensions::ExtensionBrowserTest {
+ public:
+  static GURL install_url() {
+    return GURL("https://www.example.com/install_url");
+  }
+  static GURL start_url() { return GURL("https://www.example.com/start_url"); }
+  static AppId web_app_id() {
+    return GenerateAppId(absl::nullopt, start_url());
+  }
+  static extensions::ExtensionId chrome_app_id() {
+    return "kbmnembihfiondgfjekmnmcbddelicoi";
+  }
+
+  PreinstalledWebAppDuplicationFixerBrowserTest() {
+    PreinstalledWebAppManager::SkipStartupForTesting();
+    PreinstalledWebAppDuplicationFixer::SkipStartupForTesting();
+  }
+  ~PreinstalledWebAppDuplicationFixerBrowserTest() override = default;
+
+  // InProcessBrowserTest:
+  void SetUpOnMainThread() override {
+    extensions::ExtensionBrowserTest::SetUpOnMainThread();
+
+    provider_ = WebAppProvider::GetForTest(browser()->profile());
+    InProcessBrowserTest::SetUpOnMainThread();
+    web_app::test::WaitUntilReady(provider_);
+
+    ExternalInstallOptions options(install_url(), DisplayMode::kStandalone,
+                                   ExternalInstallSource::kExternalDefault);
+    options.user_type_allowlist = {"unmanaged"};
+    options.uninstall_and_replace = {chrome_app_id()};
+    options.only_use_app_info_factory = true;
+    options.app_info_factory = base::BindRepeating(
+        [](GURL start_url) {
+          auto info = std::make_unique<WebAppInstallInfo>();
+          info->title = u"Test app";
+          info->start_url = start_url;
+          return info;
+        },
+        start_url());
+    options.expected_app_id = web_app_id();
+    preinstalled_app_data_.apps = {options};
+  }
+
+  void SyncPreinstalledWebApps() {
+    base::RunLoop run_loop;
+    provider_->preinstalled_web_app_manager().LoadAndSynchronizeForTesting(
+        base::BindLambdaForTesting(
+            [&](std::map<GURL, ExternallyManagedAppManager::InstallResult>
+                    install_results,
+                std::map<GURL, bool> uninstall_results) { run_loop.Quit(); }));
+    run_loop.Run();
+  }
+
+  void SyncPreinstalledWebAppsAwaitChromeAppUninstall() {
+    extensions::TestExtensionRegistryObserver uninstall_observer(
+        extensions::ExtensionRegistry::Get(profile()));
+    SyncPreinstalledWebApps();
+    ASSERT_EQ(uninstall_observer.WaitForExtensionUninstalled()->id(),
+              chrome_app_id());
+  }
+
+  bool IsWebAppInstalled() const {
+    return provider_->registrar().IsInstalled(web_app_id());
+  }
+
+  bool IsWebAppExternalInstallPrefSet() {
+    return ExternallyInstalledWebAppPrefs(profile()->GetPrefs())
+               .LookupAppId(install_url()) == web_app_id();
+  }
+
+  bool IsWebAppInSync() const {
+    return provider_->registrar()
+        .GetAppById(web_app_id())
+        ->GetSources()
+        .test(Source::kSync);
+  }
+
+  void UninstallWebApp() { test::UninstallWebApp(profile(), web_app_id()); }
+
+  void RunAppDuplicationFix() {
+    WebAppAdjustments::Get(profile())
+        ->preinstalled_web_app_duplication_fixer()
+        ->ScanForDuplicationForTesting();
+  }
+
+  std::vector<base::Bucket> GetFixCountMetrics() {
+    return histogram_tester_.GetAllSamples(
+        PreinstalledWebAppDuplicationFixer::kHistogramAppDuplicationFixApplied);
+  }
+
+  void InstallChromeApp() {
+    const extensions::Extension* extension =
+        InstallExtension(test_data_dir_.AppendASCII("hosted_app.crx"), 1);
+    ASSERT_EQ(extension->id(), chrome_app_id());
+  }
+
+  bool IsChromeAppInstalled() {
+    return extensions::ExtensionRegistry::Get(profile())
+        ->enabled_extensions()
+        .Contains(chrome_app_id());
+  }
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  void PinApp(const std::string& app_id) {
+    auto* service =
+        app_list::AppListSyncableServiceFactory::GetForProfile(profile());
+    service->SetPinPosition(app_id, service->GetLastPosition());
+  }
+
+  bool IsAppPinned(const std::string& app_id) {
+    return app_list::AppListSyncableServiceFactory::GetForProfile(profile())
+        ->GetPinPosition(app_id)
+        .IsValid();
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+ protected:
+  WebAppProvider* provider_;
+  base::test::ScopedFeatureList feature_list_{
+      features::kPreinstalledWebAppDuplicationFixer};
+  ScopedTestingPreinstalledAppData preinstalled_app_data_;
+  base::HistogramTester histogram_tester_;
+  OsIntegrationManager::ScopedSuppressForTesting os_hooks_supress_;
+};
+
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppDuplicationFixerBrowserTest,
+                       FixDuplicateChromeApp) {
+  SyncPreinstalledWebApps();
+  EXPECT_TRUE(IsWebAppInstalled());
+  EXPECT_FALSE(IsChromeAppInstalled());
+  EXPECT_TRUE(IsWebAppExternalInstallPrefSet());
+
+  // Running the fix while the Chrome app is not installed should do nothing.
+  {
+    RunAppDuplicationFix();
+    EXPECT_TRUE(IsWebAppInstalled());
+    EXPECT_FALSE(IsChromeAppInstalled());
+    EXPECT_EQ(GetFixCountMetrics(), (std::vector<base::Bucket>{{0, 1}}));
+    EXPECT_TRUE(IsWebAppExternalInstallPrefSet());
+  }
+
+  InstallChromeApp();
+  EXPECT_TRUE(IsChromeAppInstalled());
+
+  // Resyncing preinstalled web app configs again will not re-migrate the web
+  // app despite the Chrome app being installed.
+  {
+    SyncPreinstalledWebApps();
+    EXPECT_TRUE(IsWebAppInstalled());
+    EXPECT_TRUE(IsChromeAppInstalled());
+  }
+
+  // Running the fix causes the Chrome app to get migrated on the next
+  // preinstalled web app sync.
+  {
+    RunAppDuplicationFix();
+    EXPECT_TRUE(IsWebAppInstalled());
+    EXPECT_TRUE(IsChromeAppInstalled());
+    EXPECT_EQ(GetFixCountMetrics(),
+              (std::vector<base::Bucket>{{0, 1}, {1, 1}}));
+    EXPECT_FALSE(IsWebAppExternalInstallPrefSet());
+
+    SyncPreinstalledWebAppsAwaitChromeAppUninstall();
+    EXPECT_TRUE(IsWebAppInstalled());
+    EXPECT_FALSE(IsChromeAppInstalled());
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppDuplicationFixerBrowserTest,
+                       RemigrateUninstalledWebApp) {
+  SyncPreinstalledWebApps();
+  InstallChromeApp();
+  EXPECT_TRUE(IsWebAppInstalled());
+  EXPECT_TRUE(IsChromeAppInstalled());
+  EXPECT_TRUE(IsWebAppExternalInstallPrefSet());
+
+  UninstallWebApp();
+  EXPECT_FALSE(IsWebAppInstalled());
+  EXPECT_TRUE(IsChromeAppInstalled());
+  EXPECT_TRUE(IsWebAppExternalInstallPrefSet());
+
+  RunAppDuplicationFix();
+  EXPECT_FALSE(IsWebAppInstalled());
+  EXPECT_TRUE(IsChromeAppInstalled());
+  EXPECT_EQ(GetFixCountMetrics(), (std::vector<base::Bucket>{{1, 1}}));
+  EXPECT_FALSE(IsWebAppExternalInstallPrefSet());
+
+  // Running the preinstalled web app sync should remigrate the old Chrome app
+  // even if the user had uninstalled the web app.
+  {
+    SyncPreinstalledWebAppsAwaitChromeAppUninstall();
+    EXPECT_TRUE(IsWebAppInstalled());
+    EXPECT_FALSE(IsChromeAppInstalled());
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppDuplicationFixerBrowserTest,
+                       RunFixOnSyncInstalledWebApp) {
+  SyncPreinstalledWebApps();
+  InstallChromeApp();
+  EXPECT_TRUE(IsWebAppInstalled());
+  EXPECT_TRUE(IsChromeAppInstalled());
+  EXPECT_TRUE(IsWebAppExternalInstallPrefSet());
+
+  // Simulate a user install of the same web app to put it in sync.
+  {
+    auto info = std::make_unique<WebAppInstallInfo>();
+    info->start_url = start_url();
+    AppId app_id = test::InstallWebApp(profile(), std::move(info));
+    ASSERT_EQ(app_id, web_app_id());
+    ASSERT_TRUE(IsWebAppInSync());
+  }
+
+  // The duplication fix should have no effect on the sync install status of the
+  // web app.
+  {
+    RunAppDuplicationFix();
+    ASSERT_TRUE(IsWebAppInSync());
+  }
+}
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppDuplicationFixerBrowserTest,
+                       WebAppPinnedChromeAppUnpinned) {
+  SyncPreinstalledWebApps();
+  InstallChromeApp();
+
+  PinApp(web_app_id());
+  EXPECT_TRUE(IsAppPinned(web_app_id()));
+  EXPECT_FALSE(IsAppPinned(chrome_app_id()));
+
+  RunAppDuplicationFix();
+  SyncPreinstalledWebAppsAwaitChromeAppUninstall();
+
+  // If the web app already exists and is pinned it should not take on the
+  // Chrome app's unpinned UI position.
+  EXPECT_TRUE(IsAppPinned(web_app_id()));
+}
+
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppDuplicationFixerBrowserTest,
+                       WebAppUnpinnedChromeAppPinned) {
+  SyncPreinstalledWebApps();
+  InstallChromeApp();
+
+  PinApp(chrome_app_id());
+  EXPECT_FALSE(IsAppPinned(web_app_id()));
+  EXPECT_TRUE(IsAppPinned(chrome_app_id()));
+
+  RunAppDuplicationFix();
+  SyncPreinstalledWebAppsAwaitChromeAppUninstall();
+
+  // If the web app already exists and is not pinned it should take on the
+  // Chrome app's pinned UI position.
+  EXPECT_TRUE(IsAppPinned(web_app_id()));
+}
+
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppDuplicationFixerBrowserTest,
+                       BothUnpinned) {
+  SyncPreinstalledWebApps();
+  InstallChromeApp();
+
+  EXPECT_FALSE(IsAppPinned(web_app_id()));
+  EXPECT_FALSE(IsAppPinned(chrome_app_id()));
+
+  RunAppDuplicationFix();
+  SyncPreinstalledWebAppsAwaitChromeAppUninstall();
+
+  // If neither app was pinned the web app should remain unpinned.
+  EXPECT_FALSE(IsAppPinned(web_app_id()));
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/adjustments/web_app_adjustments.cc b/chrome/browser/web_applications/adjustments/web_app_adjustments.cc
index aeea093b..6c91dc9 100644
--- a/chrome/browser/web_applications/adjustments/web_app_adjustments.cc
+++ b/chrome/browser/web_applications/adjustments/web_app_adjustments.cc
@@ -10,6 +10,7 @@
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_provider_factory.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
+#include "chrome/common/chrome_features.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 
 namespace web_app {
@@ -18,11 +19,23 @@
 // WebAppAdjustments implementation
 // --------------------------------
 
+WebAppAdjustments* WebAppAdjustments::Get(Profile* profile) {
+  return static_cast<WebAppAdjustments*>(
+      WebAppAdjustmentsFactory::GetInstance()->GetServiceForBrowserContext(
+          profile, /*create=*/false));
+}
+
 WebAppAdjustments::WebAppAdjustments(Profile* profile) {
 #if BUILDFLAG(IS_CHROMEOS)
   link_capturing_pref_migration_ =
       std::make_unique<web_app::LinkCapturingPrefMigration>(*profile);
 #endif  // BUILDFLAG(IS_CHROMEOS)
+
+  if (base::FeatureList::IsEnabled(
+          features::kPreinstalledWebAppDuplicationFixer)) {
+    preinstalled_web_app_duplication_fixer_ =
+        std::make_unique<PreinstalledWebAppDuplicationFixer>(*profile);
+  }
 }
 
 WebAppAdjustments::~WebAppAdjustments() = default;
diff --git a/chrome/browser/web_applications/adjustments/web_app_adjustments.h b/chrome/browser/web_applications/adjustments/web_app_adjustments.h
index 491e393..8864843f 100644
--- a/chrome/browser/web_applications/adjustments/web_app_adjustments.h
+++ b/chrome/browser/web_applications/adjustments/web_app_adjustments.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "chrome/browser/web_applications/adjustments/link_capturing_pref_migration.h"
+#include "chrome/browser/web_applications/adjustments/preinstalled_web_app_duplication_fixer.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
 
@@ -24,12 +25,22 @@
 // Everything in here should have a removal date.
 class WebAppAdjustments : public KeyedService {
  public:
+  static WebAppAdjustments* Get(Profile* profile);
+
   explicit WebAppAdjustments(Profile* profile);
   ~WebAppAdjustments() override;
 
+  PreinstalledWebAppDuplicationFixer* preinstalled_web_app_duplication_fixer() {
+    return preinstalled_web_app_duplication_fixer_.get();
+  }
+
  private:
   // TODO(crbug.com/1262906): This was added in M97, remove in M107.
   std::unique_ptr<LinkCapturingPrefMigration> link_capturing_pref_migration_;
+
+  // TODO(crbug.com/1290716): This was added in M100, remove in M120.
+  std::unique_ptr<PreinstalledWebAppDuplicationFixer>
+      preinstalled_web_app_duplication_fixer_;
 };
 
 class WebAppAdjustmentsFactory : public BrowserContextKeyedServiceFactory {
@@ -40,6 +51,8 @@
   static WebAppAdjustmentsFactory* GetInstance();
 
  private:
+  friend class WebAppAdjustments;
+
   // BrowserContextKeyedServiceFactory:
   KeyedService* BuildServiceInstanceFor(
       content::BrowserContext* context) const override;
diff --git a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
index af2d07f..dd5af4c 100644
--- a/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
+++ b/chrome/browser/web_applications/app_service/web_app_publisher_helper.cc
@@ -40,6 +40,7 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "components/content_settings/core/common/content_settings.h"
+#include "components/services/app_service/public/cpp/intent_filter.h"
 #include "components/services/app_service/public/cpp/intent_util.h"
 #include "components/services/app_service/public/cpp/publisher_base.h"
 #include "content/public/browser/clear_site_data_utils.h"
@@ -527,6 +528,26 @@
   app->allow_uninstall = web_app->CanUserUninstallWebApp();
   app->paused = IsPaused(web_app->app_id());
 
+  // Add the intent filters for PWAs.
+  base::Extend(app->intent_filters,
+               apps_util::CreateIntentFiltersForWebApp(
+                   web_app->app_id(), IsNoteTakingWebApp(*web_app),
+                   registrar().GetAppScope(web_app->app_id()),
+                   registrar().GetAppShareTarget(web_app->app_id()),
+                   provider_->os_integration_manager().GetEnabledFileHandlers(
+                       web_app->app_id())));
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  if (web_app->app_id() == crostini::kCrostiniTerminalSystemAppId) {
+    app->intent_filters.push_back(apps::ConvertMojomIntentFilterToIntentFilter(
+        apps_util::CreateFileFilter(
+            {apps_util::kIntentActionView},
+            /*mime_types=*/
+            {extensions::app_file_handler_util::kMimeTypeInodeDirectory},
+            /*file_extensions=*/{})));
+  }
+#endif
+
   return app;
 }
 #endif
diff --git a/chrome/browser/web_applications/app_shim_registry_mac.cc b/chrome/browser/web_applications/app_shim_registry_mac.cc
index 5d52962..f3e9ce9d 100644
--- a/chrome/browser/web_applications/app_shim_registry_mac.cc
+++ b/chrome/browser/web_applications/app_shim_registry_mac.cc
@@ -67,7 +67,7 @@
   const base::Value* profile_values = app_info->FindListKey(profiles_key);
   if (!profile_values)
     return;
-  for (const auto& profile_path_value : profile_values->GetList()) {
+  for (const auto& profile_path_value : profile_values->GetListDeprecated()) {
     if (profile_path_value.is_string())
       profiles->insert(GetFullProfilePath(profile_path_value.GetString()));
   }
@@ -111,7 +111,8 @@
         iter_app.second.FindListKey(kInstalledProfiles);
     if (!installed_profiles_list)
       continue;
-    for (const auto& profile_path_value : installed_profiles_list->GetList()) {
+    for (const auto& profile_path_value :
+         installed_profiles_list->GetListDeprecated()) {
       if (!profile_path_value.is_string())
         continue;
       if (profile == GetFullProfilePath(profile_path_value.GetString())) {
diff --git a/chrome/browser/web_applications/externally_installed_web_app_prefs.cc b/chrome/browser/web_applications/externally_installed_web_app_prefs.cc
index af7c04a..41080349 100644
--- a/chrome/browser/web_applications/externally_installed_web_app_prefs.cc
+++ b/chrome/browser/web_applications/externally_installed_web_app_prefs.cc
@@ -168,6 +168,11 @@
   update->SetKey(url.spec(), std::move(dict));
 }
 
+bool ExternallyInstalledWebAppPrefs::Remove(const GURL& url) {
+  DictionaryPrefUpdate update(pref_service_, prefs::kWebAppsExtensionIDs);
+  return update->RemoveKey(url.spec());
+}
+
 absl::optional<AppId> ExternallyInstalledWebAppPrefs::LookupAppId(
     const GURL& url) const {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/chrome/browser/web_applications/externally_installed_web_app_prefs.h b/chrome/browser/web_applications/externally_installed_web_app_prefs.h
index a870780..8142a93 100644
--- a/chrome/browser/web_applications/externally_installed_web_app_prefs.h
+++ b/chrome/browser/web_applications/externally_installed_web_app_prefs.h
@@ -56,6 +56,7 @@
   void Insert(const GURL& url,
               const AppId& app_id,
               ExternalInstallSource install_source);
+  bool Remove(const GURL& url);
   absl::optional<AppId> LookupAppId(const GURL& url) const;
   bool HasNoApps() const;
 
diff --git a/chrome/browser/web_applications/isolated_app_browsertest.cc b/chrome/browser/web_applications/isolated_app_browsertest.cc
index 8c6bca9..5b4644b1 100644
--- a/chrome/browser/web_applications/isolated_app_browsertest.cc
+++ b/chrome/browser/web_applications/isolated_app_browsertest.cc
@@ -22,6 +22,7 @@
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
 #include "chrome/browser/ui/web_applications/web_app_menu_model.h"
+#include "chrome/browser/web_applications/test/isolated_app_test_utils.h"
 #include "chrome/browser/web_applications/test/service_worker_registration_waiter.h"
 #include "chrome/browser/web_applications/test/web_app_test_utils.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
@@ -172,55 +173,14 @@
 };
 }  // namespace
 
-class IsolatedAppBrowserTest : public WebAppControllerBrowserTest {
+class IsolatedAppBrowserTest : public IsolatedAppBrowserTestHarness {
  public:
-  IsolatedAppBrowserTest()
-      : scoped_feature_list_(blink::features::kWebAppEnableIsolatedStorage) {}
-
+  IsolatedAppBrowserTest() = default;
   IsolatedAppBrowserTest(const IsolatedAppBrowserTest&) = delete;
   IsolatedAppBrowserTest& operator=(const IsolatedAppBrowserTest&) = delete;
   ~IsolatedAppBrowserTest() override = default;
 
  protected:
-  AppId InstallIsolatedApp(const std::string& host) {
-    GURL app_url = https_server()->GetURL(host,
-                                          "/banners/manifest_test_page.html"
-                                          "?manifest=manifest_isolated.json");
-    return InstallIsolatedApp(app_url);
-  }
-
-  AppId InstallIsolatedApp(const GURL& app_url) {
-    EXPECT_TRUE(ui_test_utils::NavigateToURLWithDisposition(
-        browser(), app_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
-        ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP));
-    return test::InstallPwaForCurrentUrl(browser());
-  }
-
-  content::RenderFrameHost* OpenApp(const AppId& app_id) {
-    WebAppRegistrar& registrar =
-        WebAppProvider::GetForWebApps(profile())->registrar();
-    const WebApp* app = registrar.GetAppById(app_id);
-    EXPECT_TRUE(app);
-    Browser* app_window = Browser::Create(Browser::CreateParams::CreateForApp(
-        GenerateApplicationNameFromAppId(app->app_id()),
-        /*trusted_source=*/true, gfx::Rect(), profile(),
-        /*user_gesture=*/true));
-    return NavigateToURLInNewTab(app_window, app->start_url());
-  }
-
-  content::RenderFrameHost* NavigateToURLInNewTab(
-      Browser* window,
-      const GURL& url,
-      WindowOpenDisposition disposition = WindowOpenDisposition::CURRENT_TAB) {
-    auto new_contents = content::WebContents::Create(
-        content::WebContents::CreateParams(browser()->profile()));
-    window->tab_strip_model()->AppendWebContents(std::move(new_contents),
-                                                 /*foreground=*/true);
-    return ui_test_utils::NavigateToURLWithDisposition(
-        window, url, disposition,
-        ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
-  }
-
   content::StoragePartition* default_storage_partition() {
     return browser()->profile()->GetDefaultStoragePartition();
   }
@@ -235,9 +195,6 @@
     EXPECT_TRUE(browser);
     return browser;
   }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 IN_PROC_BROWSER_TEST_F(IsolatedAppBrowserTest, AppsPartitioned) {
diff --git a/chrome/browser/web_applications/policy/web_app_policy_manager.cc b/chrome/browser/web_applications/policy/web_app_policy_manager.cc
index 13fdf08..34e96924c 100644
--- a/chrome/browser/web_applications/policy/web_app_policy_manager.cc
+++ b/chrome/browser/web_applications/policy/web_app_policy_manager.cc
@@ -108,7 +108,7 @@
 void WebAppPolicyManager::ReinstallPlaceholderAppIfNecessary(const GURL& url) {
   const base::Value* web_apps =
       pref_service_->GetList(prefs::kWebAppInstallForceList);
-  const auto& web_apps_list = web_apps->GetList();
+  const auto& web_apps_list = web_apps->GetListDeprecated();
 
   const auto it =
       std::find_if(web_apps_list.begin(), web_apps_list.end(),
@@ -222,7 +222,7 @@
   // No need to validate the types or values of the policy members because we
   // are using a SimpleSchemaValidatingPolicyHandler which should validate them
   // for us.
-  for (const base::Value& entry : web_apps->GetList()) {
+  for (const base::Value& entry : web_apps->GetListDeprecated()) {
     ExternalInstallOptions install_options = ParseInstallPolicyEntry(entry);
 
     if (!install_options.install_url.is_valid())
@@ -619,7 +619,7 @@
   if (!disabled_system_features_pref)
     return;
 
-  for (const auto& entry : disabled_system_features_pref->GetList()) {
+  for (const auto& entry : disabled_system_features_pref->GetListDeprecated()) {
     switch (entry.GetInt()) {
       case policy::SystemFeature::kCamera:
         disabled_system_apps_.insert(SystemAppType::CAMERA);
diff --git a/chrome/browser/web_applications/preinstalled_web_app_utils.cc b/chrome/browser/web_applications/preinstalled_web_app_utils.cc
index bd2c597..d5c234b 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_utils.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_utils.cc
@@ -179,7 +179,7 @@
     "disable_if_touchscreen_with_stylus_not_supported";
 
 void EnsureContains(ListPrefUpdate& update, base::StringPiece value) {
-  for (const base::Value& item : update->GetList()) {
+  for (const base::Value& item : update->GetListDeprecated()) {
     if (item.is_string() && item.GetString() == value)
       return;
   }
@@ -207,7 +207,7 @@
   if (!value) {
     return base::StrCat({file.AsUTF8Unsafe(), " missing ", kUserType});
   }
-  for (const auto& item : value->GetList()) {
+  for (const auto& item : value->GetListDeprecated()) {
     if (!item.is_string()) {
       return base::StrCat({file.AsUTF8Unsafe(), " has invalid ", kUserType,
                            item.DebugString()});
@@ -372,7 +372,8 @@
       return base::StrCat(
           {file.AsUTF8Unsafe(), " had an invalid ", kUninstallAndReplace});
     }
-    base::Value::ConstListView uninstall_and_replace_values = value->GetList();
+    base::Value::ConstListView uninstall_and_replace_values =
+        value->GetListDeprecated();
 
     for (const auto& app_id_value : uninstall_and_replace_values) {
       if (!app_id_value.is_string()) {
@@ -517,12 +518,12 @@
   // icon_any_pngs
   const base::Value* icon_files =
       offline_manifest.FindListKey(kOfflineManifestIconAnyPngs);
-  if (!icon_files || icon_files->GetList().empty()) {
+  if (!icon_files || icon_files->GetListDeprecated().empty()) {
     return base::StrCat({file.AsUTF8Unsafe(), " ", kOfflineManifest, " ",
                          kOfflineManifestIconAnyPngs,
                          " missing, empty or invalid."});
   }
-  for (const base::Value& icon_file : icon_files->GetList()) {
+  for (const base::Value& icon_file : icon_files->GetListDeprecated()) {
     if (!icon_file.is_string()) {
       return base::StrCat({file.AsUTF8Unsafe(), " ", kOfflineManifest, " ",
                            kOfflineManifestIconAnyPngs, " ",
@@ -605,7 +606,7 @@
   if (!migrated_apps)
     return false;
 
-  for (const auto& val : migrated_apps->GetList()) {
+  for (const auto& val : migrated_apps->GetListDeprecated()) {
     if (val.is_string() && val.GetString() == app_id)
       return true;
   }
@@ -630,7 +631,7 @@
   if (!migrated_features)
     return false;
 
-  for (const auto& val : migrated_features->GetList()) {
+  for (const auto& val : migrated_features->GetListDeprecated()) {
     if (val.is_string() && val.GetString() == feature_name)
       return true;
   }
@@ -656,7 +657,7 @@
   if (!uninstalled_apps)
     return false;
 
-  for (const auto& val : uninstalled_apps->GetList()) {
+  for (const auto& val : uninstalled_apps->GetListDeprecated()) {
     if (val.is_string() && val.GetString() == app_id)
       return true;
   }
diff --git a/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.cc b/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.cc
index 0a3b3872..7b99a8c2 100644
--- a/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.cc
+++ b/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.cc
@@ -9,6 +9,7 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
+#include "chrome/browser/web_applications/preinstalled_app_install_features.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/common/chrome_switches.h"
 
@@ -96,76 +97,72 @@
     PreinstalledWebAppMigration&&) = default;
 PreinstalledWebAppMigration::~PreinstalledWebAppMigration() = default;
 
-const std::vector<PreinstalledWebAppMigration>&
-GetPreinstalledWebAppMigrations() {
-  static base::NoDestructor<std::vector<PreinstalledWebAppMigration>>
-      preinstalled_web_app_migrations([] {
-        std::vector<PreinstalledWebAppMigration> migrations;
-        for (const ExternalInstallOptions& options : GetPreinstalledWebApps()) {
-          if (!options.expected_app_id ||
-              options.uninstall_and_replace.size() != 1) {
-            continue;
-          }
+std::vector<PreinstalledWebAppMigration> GetPreinstalledWebAppMigrations(
+    Profile& profile) {
+  std::vector<PreinstalledWebAppMigration> migrations;
+  for (const ExternalInstallOptions& options : GetPreinstalledWebApps()) {
+    if (!options.expected_app_id)
+      continue;
 
-          PreinstalledWebAppMigration migration;
-          migration.install_url = options.install_url;
-          migration.expected_web_app_id = *options.expected_app_id;
-          migration.old_chrome_app_id = options.uninstall_and_replace[0];
-          migration.gate_on_feature = options.gate_on_feature;
-          migrations.push_back(std::move(migration));
-        }
+    // All entries in the default web app migration had only one Chrome app to
+    // replace.
+    if (options.uninstall_and_replace.size() != 1)
+      continue;
+
+    if (options.gate_on_feature && !IsPreinstalledAppInstallFeatureEnabled(
+                                       *options.gate_on_feature, profile)) {
+      continue;
+    }
+
+    PreinstalledWebAppMigration migration;
+    migration.install_url = options.install_url;
+    migration.expected_web_app_id = *options.expected_app_id;
+    migration.old_chrome_app_id = options.uninstall_and_replace[0];
+    migrations.push_back(std::move(migration));
+  }
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS)
-        // Manually hard coded entries from
-        // https://chrome-internal.googlesource.com/chromeos/overlays/chromeos-overlay/+/main/chromeos-base/chromeos-default-apps/files/web_apps
-        // for any json configs that include a uninstall_and_replace field.
-        // This is a temporary measure while the default web app duplication
-        // issue is cleaned up.
-        // TODO(crbug.com/1290716): Clean up once no longer needed.
-        {
-          PreinstalledWebAppMigration migration;
-          migration.install_url = GURL(
-              "https://play.google.com/books/installwebapp?usp=chromedefault");
-          migration.expected_web_app_id = kPlayBooksAppId;
-          migration.old_chrome_app_id = extension_misc::kGooglePlayBooksAppId;
-          migration.gate_on_feature =
-              kMigrateDefaultChromeAppToWebAppsNonGSuite.name;
-          migrations.push_back(std::move(migration));
-        }
-        {
-          PreinstalledWebAppMigration migration;
-          migration.install_url =
-              GURL("https://keep.google.com/installwebapp?usp=chrome_default");
-          migration.expected_web_app_id = kGoogleKeepAppId;
-          migration.old_chrome_app_id = extension_misc::kGoogleKeepAppId;
-          migration.gate_on_feature =
-              kMigrateDefaultChromeAppToWebAppsGSuite.name;
-          migrations.push_back(std::move(migration));
-        }
-        {
-          PreinstalledWebAppMigration migration;
-          migration.install_url =
-              GURL("https://www.google.com/maps/preview/pwa/ttinstall.html");
-          migration.expected_web_app_id = kGoogleMapsAppId;
-          migration.old_chrome_app_id = extension_misc::kGoogleMapsAppId;
-          migration.gate_on_feature =
-              kMigrateDefaultChromeAppToWebAppsNonGSuite.name;
-          migrations.push_back(std::move(migration));
-        }
-        {
-          PreinstalledWebAppMigration migration;
-          migration.install_url = GURL(
-              "https://play.google.com/store/movies/"
-              "installwebapp?usp=chrome_default");
-          migration.expected_web_app_id = kGoogleMoviesAppId;
-          migration.old_chrome_app_id = extension_misc::kGooglePlayMoviesAppId;
-          migration.gate_on_feature =
-              kMigrateDefaultChromeAppToWebAppsNonGSuite.name;
-          migrations.push_back(std::move(migration));
-        }
+  // Manually hard coded entries from
+  // https://chrome-internal.googlesource.com/chromeos/overlays/chromeos-overlay/+/main/chromeos-base/chromeos-default-apps/files/web_apps
+  // for any json configs that include a uninstall_and_replace field.
+  // This is a temporary measure while the default web app duplication
+  // issue is cleaned up.
+  // TODO(crbug.com/1290716): Clean up once no longer needed.
+  if (IsPreinstalledAppInstallFeatureEnabled(
+          kMigrateDefaultChromeAppToWebAppsGSuite.name, profile)) {
+    PreinstalledWebAppMigration keep_migration;
+    keep_migration.install_url =
+        GURL("https://keep.google.com/installwebapp?usp=chrome_default");
+    keep_migration.expected_web_app_id = kGoogleKeepAppId;
+    keep_migration.old_chrome_app_id = extension_misc::kGoogleKeepAppId;
+    migrations.push_back(std::move(keep_migration));
+  }
+
+  if (IsPreinstalledAppInstallFeatureEnabled(
+          kMigrateDefaultChromeAppToWebAppsNonGSuite.name, profile)) {
+    PreinstalledWebAppMigration books_migration;
+    books_migration.install_url =
+        GURL("https://play.google.com/books/installwebapp?usp=chromedefault");
+    books_migration.expected_web_app_id = kPlayBooksAppId;
+    books_migration.old_chrome_app_id = extension_misc::kGooglePlayBooksAppId;
+    migrations.push_back(std::move(books_migration));
+
+    PreinstalledWebAppMigration maps_migration;
+    maps_migration.install_url =
+        GURL("https://www.google.com/maps/preview/pwa/ttinstall.html");
+    maps_migration.expected_web_app_id = kGoogleMapsAppId;
+    maps_migration.old_chrome_app_id = extension_misc::kGoogleMapsAppId;
+    migrations.push_back(std::move(maps_migration));
+
+    PreinstalledWebAppMigration movies_migration;
+    movies_migration.install_url = GURL(
+        "https://play.google.com/store/movies/"
+        "installwebapp?usp=chrome_default");
+    movies_migration.expected_web_app_id = kGoogleMoviesAppId;
+    movies_migration.old_chrome_app_id = extension_misc::kGooglePlayMoviesAppId;
+    migrations.push_back(std::move(movies_migration));
+  }
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING) && BUILDFLAG(IS_CHROMEOS)
-        return migrations;
-      }());
-  return *preinstalled_web_app_migrations;
+  return migrations;
 }
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h b/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h
index fb9ad43..651b41a 100644
--- a/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h
+++ b/chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h
@@ -23,13 +23,12 @@
   GURL install_url;
   AppId expected_web_app_id;
   AppId old_chrome_app_id;
-  absl::optional<std::string> gate_on_feature;
 };
 
 // Returns the list of preinstalled web apps that are migrations away from their
 // corresponding Chrome app.
-const std::vector<PreinstalledWebAppMigration>&
-GetPreinstalledWebAppMigrations();
+std::vector<PreinstalledWebAppMigration> GetPreinstalledWebAppMigrations(
+    Profile& profile);
 
 // A scoped helper to provide a testing set of preinstalled app data. This will
 // replace the default set.
diff --git a/chrome/browser/web_applications/test/isolated_app_test_utils.cc b/chrome/browser/web_applications/test/isolated_app_test_utils.cc
new file mode 100644
index 0000000..5665de7e
--- /dev/null
+++ b/chrome/browser/web_applications/test/isolated_app_test_utils.cc
@@ -0,0 +1,67 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/web_applications/test/isolated_app_test_utils.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/web_applications/test/web_app_test_utils.h"
+#include "chrome/browser/web_applications/web_app.h"
+#include "chrome/browser/web_applications/web_app_helpers.h"
+#include "chrome/browser/web_applications/web_app_id.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "ui/base/window_open_disposition.h"
+#include "ui/gfx/geometry/rect.h"
+#include "url/gurl.h"
+
+namespace web_app {
+
+IsolatedAppBrowserTestHarness::IsolatedAppBrowserTestHarness() = default;
+
+IsolatedAppBrowserTestHarness::~IsolatedAppBrowserTestHarness() = default;
+
+AppId IsolatedAppBrowserTestHarness::InstallIsolatedApp(
+    const std::string& host) {
+  GURL app_url = https_server()->GetURL(host,
+                                        "/banners/manifest_test_page.html"
+                                        "?manifest=manifest_isolated.json");
+  return InstallIsolatedApp(app_url);
+}
+
+AppId IsolatedAppBrowserTestHarness::InstallIsolatedApp(const GURL& app_url) {
+  EXPECT_TRUE(ui_test_utils::NavigateToURLWithDisposition(
+      browser(), app_url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP));
+  return test::InstallPwaForCurrentUrl(browser());
+}
+
+content::RenderFrameHost* IsolatedAppBrowserTestHarness::OpenApp(
+    const AppId& app_id) {
+  WebAppRegistrar& registrar =
+      WebAppProvider::GetForWebApps(profile())->registrar();
+  const WebApp* app = registrar.GetAppById(app_id);
+  EXPECT_TRUE(app);
+  Browser* app_window = Browser::Create(Browser::CreateParams::CreateForApp(
+      GenerateApplicationNameFromAppId(app->app_id()),
+      /*trusted_source=*/true, gfx::Rect(), profile(),
+      /*user_gesture=*/true));
+  return NavigateToURLInNewTab(app_window, app->start_url());
+}
+
+content::RenderFrameHost* IsolatedAppBrowserTestHarness::NavigateToURLInNewTab(
+    Browser* window,
+    const GURL& url,
+    WindowOpenDisposition disposition) {
+  auto new_contents = content::WebContents::Create(
+      content::WebContents::CreateParams(browser()->profile()));
+  window->tab_strip_model()->AppendWebContents(std::move(new_contents),
+                                               /*foreground=*/true);
+  return ui_test_utils::NavigateToURLWithDisposition(
+      window, url, disposition, ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP);
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/test/isolated_app_test_utils.h b/chrome/browser/web_applications/test/isolated_app_test_utils.h
new file mode 100644
index 0000000..8641846ef
--- /dev/null
+++ b/chrome/browser/web_applications/test/isolated_app_test_utils.h
@@ -0,0 +1,49 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEB_APPLICATIONS_TEST_ISOLATED_APP_TEST_UTILS_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_TEST_ISOLATED_APP_TEST_UTILS_H_
+
+#include <string>
+
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
+#include "chrome/browser/web_applications/web_app_id.h"
+#include "third_party/blink/public/common/features.h"
+#include "ui/base/window_open_disposition.h"
+
+class Browser;
+class GURL;
+
+namespace content {
+class RenderFrameHost;
+}  // namespace content
+
+namespace web_app {
+
+class IsolatedAppBrowserTestHarness : public WebAppControllerBrowserTest {
+ public:
+  IsolatedAppBrowserTestHarness();
+  IsolatedAppBrowserTestHarness(const IsolatedAppBrowserTestHarness&) = delete;
+  IsolatedAppBrowserTestHarness& operator=(
+      const IsolatedAppBrowserTestHarness&) = delete;
+  ~IsolatedAppBrowserTestHarness() override;
+
+ protected:
+  AppId InstallIsolatedApp(const std::string& host);
+  AppId InstallIsolatedApp(const GURL& app_url);
+  content::RenderFrameHost* OpenApp(const AppId& app_id);
+  content::RenderFrameHost* NavigateToURLInNewTab(
+      Browser* window,
+      const GURL& url,
+      WindowOpenDisposition disposition = WindowOpenDisposition::CURRENT_TAB);
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_{
+      blink::features::kWebAppEnableIsolatedStorage};
+};
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_TEST_ISOLATED_APP_TEST_UTILS_H_
diff --git a/chrome/browser/web_applications/url_handler_prefs.cc b/chrome/browser/web_applications/url_handler_prefs.cc
index da9b0d9..c0f3ab7e 100644
--- a/chrome/browser/web_applications/url_handler_prefs.cc
+++ b/chrome/browser/web_applications/url_handler_prefs.cc
@@ -614,9 +614,9 @@
     return true;
 
   base::Value::ConstListView include_paths_list_lh =
-      include_paths_lh->GetList();
+      include_paths_lh->GetListDeprecated();
   base::Value::ConstListView include_paths_list_rh =
-      include_paths_rh->GetList();
+      include_paths_rh->GetListDeprecated();
   if (include_paths_list_lh.size() != include_paths_list_rh.size())
     return true;
 
@@ -951,7 +951,7 @@
   if (!handlers_mutable)
     return;
 
-  for (auto& handler : handlers_mutable->GetList()) {
+  for (auto& handler : handlers_mutable->GetListDeprecated()) {
     auto handler_view = GetHandlerView(handler);
     if (!handler_view)
       continue;
diff --git a/chrome/browser/web_applications/web_app_install_utils_unittest.cc b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
index ff12eff2..f733df4 100644
--- a/chrome/browser/web_applications/web_app_install_utils_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_utils_unittest.cc
@@ -44,10 +44,10 @@
 
 namespace {
 
-const char16_t kAppShortName[] = u"Test short name";
-const char16_t kAppTitle[] = u"Test title";
-const char16_t kAlternativeAppTitle[] = u"Different test title";
-const char16_t kShortcutItemName[] = u"shortcut item ";
+const char16_t kAppTestShortName[] = u"Test short name";
+const char16_t kAppTestTitle[] = u"Test title";
+const char16_t kAlternativeAppTestTitle[] = u"Different test title";
+const char16_t kShortcutItemTestName[] = u"shortcut item ";
 
 constexpr SquareSizePx kIconSize = 64;
 
@@ -73,7 +73,7 @@
       blink::features::kFileHandlingIcons);
 
   WebAppInstallInfo web_app_info;
-  web_app_info.title = kAlternativeAppTitle;
+  web_app_info.title = kAlternativeAppTestTitle;
   web_app_info.start_url = GURL("http://www.notchromium.org");
   apps::IconInfo info;
   const GURL kAppIcon1("fav1.png");
@@ -84,7 +84,7 @@
   const GURL kAppUrl("http://www.chromium.org/index.html");
   manifest.start_url = kAppUrl;
   manifest.scope = kAppUrl.GetWithoutFilename();
-  manifest.short_name = kAppShortName;
+  manifest.short_name = kAppTestShortName;
 
   const GURL kFileHandlingIcon("fav1.png");
   {
@@ -123,7 +123,7 @@
 
   const GURL kAppManifestUrl("http://www.chromium.org/manifest.json");
   UpdateWebAppInfoFromManifest(manifest, kAppManifestUrl, &web_app_info);
-  EXPECT_EQ(kAppShortName, web_app_info.title);
+  EXPECT_EQ(kAppTestShortName, web_app_info.title);
   EXPECT_EQ(kAppUrl, web_app_info.start_url);
   EXPECT_EQ(kAppUrl.GetWithoutFilename(), web_app_info.scope);
   EXPECT_EQ(DisplayMode::kBrowser, web_app_info.display_mode);
@@ -138,7 +138,7 @@
 
   // Test that |manifest.name| takes priority over |manifest.short_name|, and
   // that icons provided by the manifest replace icons in |web_app_info|.
-  manifest.name = kAppTitle;
+  manifest.name = kAppTestTitle;
   manifest.display = DisplayMode::kMinimalUi;
 
   blink::Manifest::ImageResource icon;
@@ -168,7 +168,7 @@
   }
 
   UpdateWebAppInfoFromManifest(manifest, kAppManifestUrl, &web_app_info);
-  EXPECT_EQ(kAppTitle, web_app_info.title);
+  EXPECT_EQ(kAppTestTitle, web_app_info.title);
   EXPECT_EQ(DisplayMode::kMinimalUi, web_app_info.display_mode);
   ASSERT_EQ(2u, web_app_info.display_override.size());
   EXPECT_EQ(DisplayMode::kMinimalUi, web_app_info.display_override[0]);
@@ -211,11 +211,11 @@
 
   blink::mojom::Manifest manifest;
   manifest.name = absl::nullopt;
-  manifest.short_name = kAppShortName;
+  manifest.short_name = kAppTestShortName;
 
   UpdateWebAppInfoFromManifest(
       manifest, GURL("http://www.chromium.org/manifest.json"), &web_app_info);
-  EXPECT_EQ(kAppShortName, web_app_info.title);
+  EXPECT_EQ(kAppTestShortName, web_app_info.title);
 }
 
 // Test that maskable icons are parsed as separate manifest_icons from the
@@ -346,7 +346,7 @@
   feature_list.InitWithFeatures({blink::features::kFileHandlingIcons}, {});
 
   WebAppInstallInfo web_app_info;
-  web_app_info.title = kAlternativeAppTitle;
+  web_app_info.title = kAlternativeAppTestTitle;
   web_app_info.start_url = GURL("http://www.notchromium.org");
   apps::IconInfo info;
   const GURL kAppIcon1("fav1.png");
@@ -357,7 +357,7 @@
   const GURL kAppUrl("http://www.chromium.org/index.html");
   manifest.start_url = kAppUrl;
   manifest.scope = kAppUrl.GetWithoutFilename();
-  manifest.short_name = kAppShortName;
+  manifest.short_name = kAppTestShortName;
 
   const GURL kFileHandlingIcon("fav1.png");
   {
@@ -392,7 +392,7 @@
 
   const GURL kAppManifestUrl("http://www.chromium.org/manifest.json");
   UpdateWebAppInfoFromManifest(manifest, kAppManifestUrl, &web_app_info);
-  EXPECT_EQ(kAppShortName, web_app_info.title);
+  EXPECT_EQ(kAppTestShortName, web_app_info.title);
   EXPECT_EQ(kAppUrl, web_app_info.start_url);
   EXPECT_EQ(kAppUrl.GetWithoutFilename(), web_app_info.scope);
   EXPECT_EQ(DisplayMode::kBrowser, web_app_info.display_mode);
@@ -408,7 +408,7 @@
 
   // Test that |manifest.name| takes priority over |manifest.short_name|, and
   // that icons provided by the manifest replace icons in |web_app_info|.
-  manifest.name = kAppTitle;
+  manifest.name = kAppTestTitle;
   manifest.display = DisplayMode::kMinimalUi;
 
   blink::Manifest::ImageResource icon;
@@ -430,7 +430,7 @@
   // Test that shortcuts in the manifest replace those in |web_app_info|.
   const GURL kShortcutItemUrl("http://www.chromium.org/shortcuts/action");
   blink::Manifest::ShortcutItem shortcut_item;
-  shortcut_item.name = std::u16string(kShortcutItemName) + u"4";
+  shortcut_item.name = std::u16string(kShortcutItemTestName) + u"4";
   shortcut_item.url = kShortcutItemUrl;
 
   const GURL kIconUrl2("http://www.chromium.org/shortcuts/icon2.png");
@@ -441,7 +441,7 @@
 
   manifest.shortcuts.push_back(shortcut_item);
 
-  shortcut_item.name = std::u16string(kShortcutItemName) + u"5";
+  shortcut_item.name = std::u16string(kShortcutItemTestName) + u"5";
 
   const GURL kIconUrl3("http://www.chromium.org/shortcuts/icon3.png");
   icon.src = kIconUrl3;
@@ -453,7 +453,7 @@
   manifest.shortcuts.push_back(shortcut_item);
 
   UpdateWebAppInfoFromManifest(manifest, kAppManifestUrl, &web_app_info);
-  EXPECT_EQ(kAppTitle, web_app_info.title);
+  EXPECT_EQ(kAppTestTitle, web_app_info.title);
   EXPECT_EQ(DisplayMode::kMinimalUi, web_app_info.display_mode);
   // Sanity check that original copy was not changed.
   EXPECT_EQ(0u, web_app_info_original.shortcuts_menu_item_infos.size());
@@ -533,7 +533,7 @@
   blink::mojom::Manifest manifest;
   for (unsigned int i = 0; i < kNumTestIcons; ++i) {
     blink::Manifest::ShortcutItem shortcut_item;
-    shortcut_item.name = kShortcutItemName + base::NumberToString16(i);
+    shortcut_item.name = kShortcutItemTestName + base::NumberToString16(i);
     shortcut_item.url = GURL("http://www.chromium.org/shortcuts/action");
 
     blink::Manifest::ImageResource icon;
@@ -586,7 +586,7 @@
   blink::mojom::Manifest manifest;
   for (int i = 1; i <= 20; ++i) {
     blink::Manifest::ShortcutItem shortcut_item;
-    shortcut_item.name = kShortcutItemName + base::NumberToString16(i);
+    shortcut_item.name = kShortcutItemTestName + base::NumberToString16(i);
     shortcut_item.url = GURL("http://www.chromium.org/shortcuts/action");
 
     blink::Manifest::ImageResource icon;
@@ -622,7 +622,7 @@
   {
     WebAppShortcutsMenuItemInfo shortcut_item;
     std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_manifest_icons;
-    shortcut_item.name = std::u16string(kShortcutItemName) + u"1";
+    shortcut_item.name = std::u16string(kShortcutItemTestName) + u"1";
     shortcut_item.url = GURL("http://www.chromium.org/shortcuts/action");
     icon.url = kIconUrl1;
     icon.square_size_px = kIconSize;
@@ -636,7 +636,7 @@
   {
     WebAppShortcutsMenuItemInfo shortcut_item;
     std::vector<WebAppShortcutsMenuItemInfo::Icon> shortcut_manifest_icons;
-    shortcut_item.name = std::u16string(kShortcutItemName) + u"2";
+    shortcut_item.name = std::u16string(kShortcutItemTestName) + u"2";
     icon.url = kIconUrl1;
     icon.square_size_px = kIconSize;
     shortcut_manifest_icons.push_back(icon);
diff --git a/chrome/browser/web_applications/web_app_offline.cc b/chrome/browser/web_applications/web_app_offline.cc
new file mode 100644
index 0000000..f917fb9
--- /dev/null
+++ b/chrome/browser/web_applications/web_app_offline.cc
@@ -0,0 +1,31 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "web_app_offline.h"
+
+#include "chrome/browser/web_applications/web_app_utils.h"
+#include "chrome/common/chrome_features.h"
+#include "components/error_page/common/error.h"
+
+namespace web_app {
+content::mojom::AlternativeErrorPageOverrideInfoPtr GetOfflinePageInfo(
+    const GURL& url,
+    content::BrowserContext* browser_context,
+    int32_t error_code) {
+#if BUILDFLAG(IS_ANDROID)
+  return nullptr;
+#else
+  if (!base::FeatureList::IsEnabled(features::kDesktopPWAsDefaultOfflinePage)) {
+    return nullptr;
+  }
+
+  if (error_code != net::ERR_INTERNET_DISCONNECTED) {
+    return nullptr;
+  }
+
+  return web_app::GetAppManifestInfo(url, browser_context);
+#endif  //  BUILDFLAG(IS_ANDROID)
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_offline.h b/chrome/browser/web_applications/web_app_offline.h
new file mode 100644
index 0000000..d4d83620
--- /dev/null
+++ b/chrome/browser/web_applications/web_app_offline.h
@@ -0,0 +1,26 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_OFFLINE_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_OFFLINE_H_
+
+#include "content/public/browser/browser_context.h"
+#include "content/public/common/alternative_error_page_override_info.mojom.h"
+#include "url/gurl.h"
+
+namespace web_app {
+// |alternative_error_page_params| dictionary key values in the
+// |AlternativeErrorPageOverrideInfo| mojom struct.
+const char kMessage[] = "web_app_default_offline_message";
+const char kAppShortName[] = "app_short_name";
+const char kThemeColor[] = "theme_color";
+const char kBackgroundColor[] = "customized_background_color";
+
+content::mojom::AlternativeErrorPageOverrideInfoPtr GetOfflinePageInfo(
+    const GURL& url,
+    content::BrowserContext* browser_context,
+    int32_t error_code);
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_WEB_APP_OFFLINE_H_
diff --git a/chrome/browser/web_applications/web_app_offline_browsertest.cc b/chrome/browser/web_applications/web_app_offline_browsertest.cc
new file mode 100644
index 0000000..96651c4
--- /dev/null
+++ b/chrome/browser/web_applications/web_app_offline_browsertest.cc
@@ -0,0 +1,145 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
+#include "chrome/browser/web_applications/test/service_worker_registration_waiter.h"
+#include "chrome/browser/web_applications/test/web_app_test_utils.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_base.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "content/public/test/url_loader_interceptor.h"
+
+namespace web_app {
+
+enum class FlagParam {
+  kWithFlag = 0,
+  kWithoutFlag = 1,
+  kMaxValue = kWithoutFlag
+};
+
+class WebAppOfflinePageTest : public InProcessBrowserTest,
+                              public ::testing::WithParamInterface<FlagParam> {
+ public:
+  WebAppOfflinePageTest() {
+    if (GetParam() == FlagParam::kWithFlag) {
+      feature_list_.InitAndEnableFeature(
+          features::kDesktopPWAsDefaultOfflinePage);
+    } else {
+      feature_list_.InitAndDisableFeature(
+          features::kDesktopPWAsDefaultOfflinePage);
+    }
+  }
+
+  // Start a web app without a service worker and disconnect.
+  void StartWebAppAndDisconnect(content::WebContents* web_contents,
+                                std::string html) {
+    GURL target_url(embedded_test_server()->GetURL(html));
+    web_app::NavigateToURLAndWait(browser(), target_url);
+    web_app::test::InstallPwaForCurrentUrl(browser());
+
+    std::unique_ptr<content::URLLoaderInterceptor> interceptor =
+        content::URLLoaderInterceptor::SetupRequestFailForURL(
+            target_url, net::ERR_INTERNET_DISCONNECTED);
+
+    content::TestNavigationObserver observer(web_contents, 1);
+    web_contents->GetController().Reload(content::ReloadType::NORMAL, false);
+    observer.Wait();
+  }
+
+  // Start a PWA with a service worker and disconnect.
+  void StartPwaAndDisconnect(content::WebContents* web_contents,
+                             std::string html) {
+    GURL target_url(embedded_test_server()->GetURL(html));
+    web_app::ServiceWorkerRegistrationWaiter registration_waiter(
+        browser()->profile(), target_url);
+    web_app::NavigateToURLAndWait(browser(), target_url);
+    registration_waiter.AwaitRegistration();
+    web_app::test::InstallPwaForCurrentUrl(browser());
+
+    std::unique_ptr<content::URLLoaderInterceptor> interceptor =
+        content::URLLoaderInterceptor::SetupRequestFailForURL(
+            target_url, net::ERR_INTERNET_DISCONNECTED);
+
+    content::TestNavigationObserver observer(web_contents, 1);
+    web_contents->GetController().Reload(content::ReloadType::NORMAL, false);
+    observer.Wait();
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// When a web app with a manifest and no service worker is offline it should
+// display the default offline page rather than the dino.
+// When the exact same conditions are applied with the feature flag disabled
+// expect that the default offline page is not shown.
+IN_PROC_BROWSER_TEST_P(WebAppOfflinePageTest, WebAppOfflinePageIsDisplayed) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  StartWebAppAndDisconnect(web_contents, "/banners/no-sw-with-colors.html");
+
+  if (GetParam() == FlagParam::kWithFlag) {
+    // Expect that the default offline page is showing.
+    EXPECT_TRUE(
+        EvalJs(web_contents,
+               "document.getElementById('default-web-app-msg') !== null")
+            .ExtractBool());
+  } else {
+    // Expect that the default offline page is not showing.
+    EXPECT_TRUE(
+        EvalJs(web_contents,
+               "document.getElementById('default-web-app-msg') === null")
+            .ExtractBool());
+  }
+}
+
+// When a web app with a manifest and service worker that doesn't handle being
+// offline it should display the default offline page rather than the dino.
+IN_PROC_BROWSER_TEST_P(WebAppOfflinePageTest,
+                       WebAppOfflineWithEmptyServiceWorker) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  StartPwaAndDisconnect(web_contents, "/banners/background-color.html");
+
+  if (GetParam() == FlagParam::kWithFlag) {
+    // Expect that the default offline page is showing.
+    EXPECT_TRUE(
+        EvalJs(web_contents,
+               "document.getElementById('default-web-app-msg') !== null")
+            .ExtractBool());
+  } else {
+    // Expect that the default offline page is not showing.
+    EXPECT_TRUE(
+        EvalJs(web_contents,
+               "document.getElementById('default-web-app-msg') === null")
+            .ExtractBool());
+  }
+}
+
+// When a web app with a manifest and service worker that handles being offline
+// it should not display the default offline page.
+IN_PROC_BROWSER_TEST_P(WebAppOfflinePageTest, WebAppOfflineWithServiceWorker) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  StartPwaAndDisconnect(web_contents, "/banners/theme-color.html");
+
+  // Expect that the default offline page is not showing.
+  EXPECT_TRUE(EvalJs(web_contents,
+                     "document.getElementById('default-web-app-msg') === null")
+                  .ExtractBool());
+}
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         WebAppOfflinePageTest,
+                         ::testing::Values(FlagParam::kWithFlag,
+                                           FlagParam::kWithoutFlag));
+
+}  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_utils.cc b/chrome/browser/web_applications/web_app_utils.cc
index e1dc716..17cc877 100644
--- a/chrome/browser/web_applications/web_app_utils.cc
+++ b/chrome/browser/web_applications/web_app_utils.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/web_applications/web_app_utils.h"
 
+#include <utility>
+
 #include "base/containers/contains.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
@@ -19,7 +21,9 @@
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/grit/components_resources.h"
 #include "components/site_engagement/content/site_engagement_service.h"
+#include "components/strings/grit/components_strings.h"
 #include "skia/ext/skia_utils_base.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
@@ -137,18 +141,22 @@
       content::mojom::AlternativeErrorPageOverrideInfo::New();
   // TODO(crbug.com/1285128): Ensure sufficient contrast.
   base::Value dict(base::Value::Type::DICTIONARY);
-  dict.SetKey(content::mojom::kThemeColor,
-              base::Value(skia::SkColorToHexString(
-                  web_app_registrar.GetAppThemeColor(*app_id).value_or(
-                      SK_ColorBLACK))));
-  dict.SetKey(content::mojom::kBackgroundColor,
-              base::Value(skia::SkColorToHexString(
-                  web_app_registrar.GetAppBackgroundColor(*app_id).value_or(
-                      SK_ColorWHITE))));
-  dict.SetKey(content::mojom::kAppShortName,
-              base::Value(web_app_registrar.GetAppShortName(*app_id)));
+  dict.SetStringKey(
+      web_app::kThemeColor,
+      skia::SkColorToHexString(
+          web_app_registrar.GetAppThemeColor(*app_id).value_or(SK_ColorBLACK)));
+  dict.SetStringKey(
+      web_app::kBackgroundColor,
+      skia::SkColorToHexString(
+          web_app_registrar.GetAppBackgroundColor(*app_id).value_or(
+              SK_ColorWHITE)));
+  dict.SetStringKey(web_app::kAppShortName,
+                    web_app_registrar.GetAppShortName(*app_id));
+  dict.SetStringKey(
+      web_app::kMessage,
+      l10n_util::GetStringUTF16(IDS_ERRORPAGES_HEADING_INTERNET_DISCONNECTED));
   alternative_error_page_info->alternative_error_page_params = std::move(dict);
-
+  alternative_error_page_info->resource_id = IDR_WEBAPP_DEFAULT_OFFLINE_HTML;
   return alternative_error_page_info;
 }
 
diff --git a/chrome/browser/web_applications/web_app_utils.h b/chrome/browser/web_applications/web_app_utils.h
index 0efb352..0d00f41 100644
--- a/chrome/browser/web_applications/web_app_utils.h
+++ b/chrome/browser/web_applications/web_app_utils.h
@@ -12,6 +12,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_id.h"
+#include "chrome/browser/web_applications/web_app_offline.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
 #include "content/public/common/alternative_error_page_override_info.mojom.h"
 
diff --git a/chrome/browser/webauthn/cablev2_devices.cc b/chrome/browser/webauthn/cablev2_devices.cc
index 3a5fea6..7701627 100644
--- a/chrome/browser/webauthn/cablev2_devices.cc
+++ b/chrome/browser/webauthn/cablev2_devices.cc
@@ -216,7 +216,7 @@
       prefs->GetList(kWebAuthnCablePairingsPrefName);
 
   std::vector<std::unique_ptr<Pairing>> ret;
-  for (const auto& pairing : pref_pairings->GetList()) {
+  for (const auto& pairing : pref_pairings->GetListDeprecated()) {
     if (!pairing.is_dict()) {
       continue;
     }
@@ -414,7 +414,7 @@
   const std::string public_key_base64 = base::Base64Encode(public_key);
 
   ListPrefUpdate update(pref_service, kWebAuthnCablePairingsPrefName);
-  base::Value::ListView list = update.Get()->GetList();
+  base::Value::ListView list = update.Get()->GetListDeprecated();
 
   for (base::Value& value : list) {
     if (!value.is_dict()) {
diff --git a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
index 00f6f2ce..8ba5ef62 100644
--- a/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
+++ b/chrome/browser/webauthn/chrome_authenticator_request_delegate.cc
@@ -79,8 +79,8 @@
   const PrefService* prefs = profile->GetPrefs();
   const base::Value* permit_attestation =
       prefs->GetList(prefs::kSecurityKeyPermitAttestation);
-  return std::any_of(permit_attestation->GetList().begin(),
-                     permit_attestation->GetList().end(),
+  return std::any_of(permit_attestation->GetListDeprecated().begin(),
+                     permit_attestation->GetListDeprecated().end(),
                      [&relying_party_id](const base::Value& v) {
                        return v.GetString() == relying_party_id;
                      });
diff --git a/chrome/browser/webid/federated_identity_sharing_permission_context.cc b/chrome/browser/webid/federated_identity_sharing_permission_context.cc
index db1786e..718fc05a 100644
--- a/chrome/browser/webid/federated_identity_sharing_permission_context.cc
+++ b/chrome/browser/webid/federated_identity_sharing_permission_context.cc
@@ -142,8 +142,8 @@
   DCHECK(IsValidObject(object));
   const auto rp_string = *object.FindStringKey(kRelyingPartyOriginKey);
   if (auto* account_ids = object.FindListKey(kAccountIdsKey)) {
-    std::vector<std::string> ids(account_ids->GetList().size());
-    for (const base::Value& account_id : account_ids->GetList()) {
+    std::vector<std::string> ids(account_ids->GetListDeprecated().size());
+    for (const base::Value& account_id : account_ids->GetListDeprecated()) {
       ids.push_back(account_id.GetString());
     }
     return base::UTF8ToUTF16(base::StrCat(
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index a360998..ddb0fb1 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1643803100-e4a144ab2d0bd13bdb41f3a5d4360d0b74cfc411.profdata
+chrome-linux-main-1643845195-bd30320c0cfe68a85278a2f735b57354f6948944.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index df19cfe..6487df1 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1643780792-92f3af9610fb789dd009ac1fec97c2184824a3a7.profdata
+chrome-mac-arm-main-1643845195-08861c60ea4e81363d03d9e7a69cdd11c87c46a3.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 85c13bfe..35490598 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1643803100-1c8bb61d4ddc651f942031bb70df24b831d7a723.profdata
+chrome-mac-main-1643845195-08ea4f71ded9cbb0aa7f5b78231811af74e56967.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 539a410..f9fa4f05 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1643813630-76160fc9bae21d882d8861b5bc6c67bc94827935.profdata
+chrome-win32-main-1643845195-5ab655d3a865275c6322bfe1b1ee6e7fe47312ac.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index aa670603..cbcb43c 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1643813630-c1b688cf365eae9c352fce9dfccb6e6a714425e1.profdata
+chrome-win64-main-1643845195-d570ff41cfaca55c277a1bc8787242054eef387d.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index 9904bf50..b1118483 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -204,26 +204,26 @@
     }
     if (is_chromeos_ash) {
       sources += [
-        "$root_gen_dir/ash/ash_camera_app_resources.pak",
-        "$root_gen_dir/ash/ash_color_internals_resources.pak",
-        "$root_gen_dir/ash/ash_diagnostics_app_resources.pak",
-        "$root_gen_dir/ash/ash_eche_app_resources.pak",
-        "$root_gen_dir/ash/ash_eche_bundle_resources.pak",
-        "$root_gen_dir/ash/ash_firmware_update_app_resources.pak",
-        "$root_gen_dir/ash/ash_help_app_resources.pak",
-        "$root_gen_dir/ash/ash_media_app_resources.pak",
-        "$root_gen_dir/ash/ash_multidevice_debug_resources.pak",
-        "$root_gen_dir/ash/ash_os_feedback_resources.pak",
-        "$root_gen_dir/ash/ash_personalization_app_resources.pak",
-        "$root_gen_dir/ash/ash_print_management_resources.pak",
-        "$root_gen_dir/ash/ash_projector_app_trusted_resources.pak",
-        "$root_gen_dir/ash/ash_projector_app_untrusted_resources.pak",
-        "$root_gen_dir/ash/ash_scanning_app_resources.pak",
-        "$root_gen_dir/ash/ash_shimless_rma_resources.pak",
-        "$root_gen_dir/ash/ash_shortcut_customization_app_resources.pak",
-        "$root_gen_dir/ash/ash_system_extensions_internals_resources.pak",
-        "$root_gen_dir/ash/connectivity_diagnostics_resources.pak",
         "$root_gen_dir/ash/public/cpp/resources/ash_public_unscaled_resources.pak",
+        "$root_gen_dir/ash/webui/ash_camera_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_color_internals_resources.pak",
+        "$root_gen_dir/ash/webui/ash_diagnostics_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_eche_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_eche_bundle_resources.pak",
+        "$root_gen_dir/ash/webui/ash_firmware_update_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_help_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_media_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_multidevice_debug_resources.pak",
+        "$root_gen_dir/ash/webui/ash_os_feedback_resources.pak",
+        "$root_gen_dir/ash/webui/ash_personalization_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_print_management_resources.pak",
+        "$root_gen_dir/ash/webui/ash_projector_app_trusted_resources.pak",
+        "$root_gen_dir/ash/webui/ash_projector_app_untrusted_resources.pak",
+        "$root_gen_dir/ash/webui/ash_scanning_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_shimless_rma_resources.pak",
+        "$root_gen_dir/ash/webui/ash_shortcut_customization_app_resources.pak",
+        "$root_gen_dir/ash/webui/ash_system_extensions_internals_resources.pak",
+        "$root_gen_dir/ash/webui/connectivity_diagnostics_resources.pak",
         "$root_gen_dir/ash/webui/file_manager/resources/file_manager_swa_resources.pak",
         "$root_gen_dir/ash/webui/file_manager/untrusted_resources/file_manager_untrusted_resources.pak",
         "$root_gen_dir/chrome/audio_resources.pak",
@@ -303,9 +303,9 @@
 
       if (!is_official_build) {
         sources += [
-          "$root_gen_dir/ash/ash_demo_mode_app_resources.pak",
-          "$root_gen_dir/ash/ash_sample_system_web_app_resources.pak",
-          "$root_gen_dir/ash/ash_sample_system_web_app_untrusted_resources.pak",
+          "$root_gen_dir/ash/webui/ash_demo_mode_app_resources.pak",
+          "$root_gen_dir/ash/webui/ash_sample_system_web_app_resources.pak",
+          "$root_gen_dir/ash/webui/ash_sample_system_web_app_untrusted_resources.pak",
         ]
         deps += [
           "//ash/webui/resources:demo_mode_app_resources",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 8dcaf4d..b8853e1 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -330,7 +330,8 @@
 const base::Feature kDesktopPWAsWebBundles{"DesktopPWAsWebBundles",
                                            base::FEATURE_DISABLED_BY_DEFAULT};
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 // Serves web app settings at chrome://app-settings/<app-id>.
 const base::Feature kDesktopPWAsWebAppSettingsPage{
     "DesktopPWAsWebAppSettingsPage", base::FEATURE_DISABLED_BY_DEFAULT};
@@ -1201,4 +1202,12 @@
 const base::Feature kOmniboxTriggerForNoStatePrefetch{
     "OmniboxTriggerForNoStatePrefetch", base::FEATURE_ENABLED_BY_DEFAULT};
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// A feature to indicate whether setting wake time >24hours away is supported by
+// the platform's RTC.
+// TODO(b/187516317): Remove when the issue is resolved in FW.
+const base::Feature kSupportsRtcWakeOver24Hours{
+    "SupportsRtcWakeOver24Hours", base::FEATURE_ENABLED_BY_DEFAULT};
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 }  // namespace features
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 949b9145..195350fe 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -224,7 +224,8 @@
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDesktopPWAsWebBundles;
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDesktopPWAsWebAppSettingsPage;
 #endif
@@ -825,6 +826,11 @@
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kOmniboxTriggerForNoStatePrefetch;
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kSupportsRtcWakeOver24Hours;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 bool PrefServiceEnabled();
 
 // DON'T ADD RANDOM STUFF HERE. Put it in the main section above in
diff --git a/chrome/common/chrome_paths.cc b/chrome/common/chrome_paths.cc
index 8e466ff..97f406b0 100644
--- a/chrome/common/chrome_paths.cc
+++ b/chrome/common/chrome_paths.cc
@@ -321,11 +321,7 @@
     case chrome::DIR_BUNDLED_WIDEVINE_CDM:
       if (!GetComponentDirectory(&cur))
         return false;
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-      // TODO(crbug.com/971433): Move Widevine CDM to a separate folder on
-      // Chrome OS so that the manifest can be included.
       cur = cur.AppendASCII(kWidevineCdmBaseDirectory);
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
       break;
 
     case chrome::DIR_COMPONENT_UPDATED_WIDEVINE_CDM:
diff --git a/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc b/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc
index d4d159d..6396752d 100644
--- a/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc
+++ b/chrome/common/chromeos/extensions/chromeos_system_extensions_manifest_handler.cc
@@ -32,7 +32,8 @@
       !externally_connectable->FindKey("matches"))
     return false;
 
-  auto matches_list = externally_connectable->FindKey("matches")->GetList();
+  auto matches_list =
+      externally_connectable->FindKey("matches")->GetListDeprecated();
   if (matches_list.size() != 1)
     return false;
 
diff --git a/chrome/common/extensions/api/common_extension_api_unittest.cc b/chrome/common/extensions/api/common_extension_api_unittest.cc
index 1356ccca..e55bda3 100644
--- a/chrome/common/extensions/api/common_extension_api_unittest.cc
+++ b/chrome/common/extensions/api/common_extension_api_unittest.cc
@@ -844,7 +844,7 @@
       const base::ListValue* list, const std::string& key,
       const std::string& value) -> const base::DictionaryValue* {
     const base::DictionaryValue* ret = nullptr;
-    for (const auto& val : list->GetList()) {
+    for (const auto& val : list->GetListDeprecated()) {
       const base::DictionaryValue* dict = nullptr;
       if (!val.GetAsDictionary(&dict))
         continue;
diff --git a/chrome/common/extensions/api/developer_private.idl b/chrome/common/extensions/api/developer_private.idl
index c1fee591..e59638fb 100644
--- a/chrome/common/extensions/api/developer_private.idl
+++ b/chrome/common/extensions/api/developer_private.idl
@@ -770,6 +770,9 @@
 
     // Fired when the profile's state has changed.
     static void onProfileStateChanged(ProfileInfo info);
+
+    // Fired when the lists of sites in the user's site settings have changed.
+    static void onUserSiteSettingsChanged(UserSiteSettings settings);
   };
 
 };
diff --git a/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc b/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc
index f15e485..8aad94f 100644
--- a/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc
+++ b/chrome/common/extensions/api/file_browser_handlers/file_browser_handler.cc
@@ -168,11 +168,13 @@
   const base::Value* access_list_value =
       file_browser_handler->FindKey(keys::kFileAccessList);
   if (access_list_value) {
-    if (!access_list_value->is_list() || access_list_value->GetList().empty()) {
+    if (!access_list_value->is_list() ||
+        access_list_value->GetListDeprecated().empty()) {
       *error = errors::kInvalidFileAccessList;
       return nullptr;
     }
-    base::Value::ConstListView access_list_view = access_list_value->GetList();
+    base::Value::ConstListView access_list_view =
+        access_list_value->GetListDeprecated();
     for (size_t i = 0; i < access_list_view.size(); ++i) {
       const std::string* access = access_list_view[i].GetIfString();
       if (!access || result->AddFileAccessPermission(*access)) {
@@ -196,7 +198,8 @@
       *error = errors::kInvalidFileFiltersList;
       return nullptr;
     }
-    base::Value::ConstListView file_filters_list = file_filters->GetList();
+    base::Value::ConstListView file_filters_list =
+        file_filters->GetListDeprecated();
     for (size_t i = 0; i < file_filters_list.size(); ++i) {
       const std::string* filter_in = file_filters_list[i].GetIfString();
       if (!filter_in) {
@@ -291,7 +294,7 @@
 
   std::unique_ptr<FileBrowserHandlerInfo> info(new FileBrowserHandlerInfo);
   if (!LoadFileBrowserHandlers(extension->id(),
-                               file_browser_handlers_value->GetList(),
+                               file_browser_handlers_value->GetListDeprecated(),
                                &info->file_browser_handlers, error)) {
     return false;  // Failed to parse file browser actions definition.
   }
diff --git a/chrome/common/extensions/api/input_ime/input_components_handler.cc b/chrome/common/extensions/api/input_ime/input_components_handler.cc
index f37256f..37b37d6 100644
--- a/chrome/common/extensions/api/input_ime/input_components_handler.cc
+++ b/chrome/common/extensions/api/input_ime/input_components_handler.cc
@@ -55,8 +55,8 @@
   }
 
   auto info = std::make_unique<InputComponents>();
-  for (size_t i = 0; i < list_value->GetList().size(); ++i) {
-    const base::Value& module_value = list_value->GetList()[i];
+  for (size_t i = 0; i < list_value->GetListDeprecated().size(); ++i) {
+    const base::Value& module_value = list_value->GetListDeprecated()[i];
     if (!module_value.is_dict()) {
       *error = errors::kInvalidInputComponents16;
       return false;
@@ -85,7 +85,7 @@
       if (language_value->is_string()) {
         languages.insert(language_value->GetString());
       } else if (language_value->is_list()) {
-        for (const auto& language : language_value->GetList()) {
+        for (const auto& language : language_value->GetListDeprecated()) {
           if (language.is_string())
             languages.insert(language.GetString());
         }
@@ -96,8 +96,8 @@
     std::set<std::string> layouts;
     const base::Value* layouts_value = module_value.FindListKey(keys::kLayouts);
     if (layouts_value) {
-      for (size_t j = 0; j < layouts_value->GetList().size(); ++j) {
-        const auto& layout = layouts_value->GetList()[j];
+      for (size_t j = 0; j < layouts_value->GetListDeprecated().size(); ++j) {
+        const auto& layout = layouts_value->GetListDeprecated()[j];
         if (!layout.is_string()) {
           *error = ErrorUtils::FormatErrorMessageUTF16(
               errors::kInvalidInputComponentLayoutName, base::NumberToString(i),
diff --git a/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc b/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc
index a739a202..c155a105 100644
--- a/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc
+++ b/chrome/common/extensions/api/speech/tts_engine_manifest_handler.cc
@@ -90,7 +90,8 @@
         *error = errors::kInvalidTtsVoicesEventTypes;
         return false;
       }
-      for (const base::Value& event_type_val : event_types->GetList()) {
+      for (const base::Value& event_type_val :
+           event_types->GetListDeprecated()) {
         if (!event_type_val.is_string()) {
           *error = errors::kInvalidTtsVoicesEventTypes;
           return false;
@@ -154,7 +155,8 @@
     return false;
   }
 
-  if (!TtsVoices::Parse(tts_voices->GetList(), info.get(), error, extension))
+  if (!TtsVoices::Parse(tts_voices->GetListDeprecated(), info.get(), error,
+                        extension))
     return false;
 
   const base::Value* tts_engine_sample_rate =
diff --git a/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc b/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc
index 6583d93..26cb6c66 100644
--- a/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc
+++ b/chrome/common/extensions/api/url_handlers/url_handlers_parser.cc
@@ -124,13 +124,13 @@
 
   const base::ListValue* manif_patterns = NULL;
   if (!handler_info.GetList(mkeys::kMatches, &manif_patterns) ||
-      manif_patterns->GetList().size() == 0) {
+      manif_patterns->GetListDeprecated().size() == 0) {
     *error = ErrorUtils::FormatErrorMessageUTF16(
         merrors::kInvalidURLHandlerPattern, handler_id);
     return false;
   }
 
-  for (const auto& entry : manif_patterns->GetList()) {
+  for (const auto& entry : manif_patterns->GetListDeprecated()) {
     std::string str_pattern =
         entry.is_string() ? entry.GetString() : std::string();
     // TODO(sergeygs): Limit this to non-top-level domains.
diff --git a/chrome/common/extensions/api/web_authentication_proxy.idl b/chrome/common/extensions/api/web_authentication_proxy.idl
index 515d318c..f942978 100644
--- a/chrome/common/extensions/api/web_authentication_proxy.idl
+++ b/chrome/common/extensions/api/web_authentication_proxy.idl
@@ -27,15 +27,33 @@
     DOMString requestDetailsJson;
   };
 
+  // An object representing a WebAuthn navigator.credentials.get() call.
+  dictionary GetRequest {
+    // An opaque identifier for the request.
+    long requestId;
+
+    // An JSON serialized representation of the
+    // PublicKeyCredentialRequestOptions passed to navigator.credentials.get().
+    //
+    // TODO(crbug.com/1231802): Reference deserialization method or document
+    // format.
+    DOMString requestDetailsJson;
+  };
+
   // This interface defines Events that fire when any website makes a WebAuthn
   // request. Regular processing of WebAuthn requests in the local Chrome
   // instance is disabled when these events are subscribed to.
   interface Events {
     // Fires when a WebAuthn navigator.credentials.create() call occurs. The
     // extension must supply a response by calling
-    // completeCreateCredentialRequest() with the given requestId.
+    // completeCreateRequest() with the given requestId.
     static void onCreateRequest(CreateRequest requestInfo);
 
+    // Fires when a WebAuthn navigator.credentials.get() call occurs. The
+    // extension must supply a response by calling
+    // completeGetRequest() with the given requestId.
+    static void onGetRequest(GetRequest requestInfo);
+
     // Fires when a
     // PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() call
     // occurs. The extension must supply a response by calling
@@ -74,6 +92,22 @@
     DOMString? responseJson;
   };
 
+  dictionary GetResponseDetails {
+    // The requestId of the `CreateRequest`.
+    long requestId;
+
+    // The `DOMException`, if any, yielded by the remote request.
+    DOMExceptionDetails? error;
+
+    // A JSON serialized representation of the `PublicKeyCredential`
+    // (https://w3c.github.io/webauthn/#publickeycredential), if any, yielded
+    // by the remote request.
+    //
+    // TODO(crbug.com/1231802): Reference serialization method or document
+    // format.
+    DOMString? responseJson;
+  };
+
   dictionary IsUvpaaResponseDetails {
     long requestId;
     boolean isUvpaa;
@@ -82,17 +116,24 @@
   interface Functions {
     // Reports the result of a navigator.credentials.create() call. The
     // extension must call this for every onCreateRequest event it has
-    // received; but not if onRequestCanceled has been called for that
-    // particular requestId.
+    // received, unless the request was canceled (in which case, an
+    // onRequestCanceled event is fired).
     [supportsPromises] static void completeCreateRequest(
         CreateResponseDetails details,
         VoidCallback callback);
 
+    // Reports the result of a navigator.credentials.get() call. The extension
+    // must call this for every onGetRequest event it has received, unless the
+    // request was canceled (in which case, an onRequestCanceled event is
+    // fired).
+    [supportsPromises] static void completeGetRequest(
+        GetResponseDetails details,
+        VoidCallback callback);
+
     // Reports the result of a
     // PublicKeyCredential.isUserVerifyingPlatformAuthenticator() call. The
     // extension must call this for every onIsUvpaaRequest event it has
-    // received; but not if onRequestCanceled has been called for that
-    // particular requestId.
+    // received.
     [supportsPromises] static void completeIsUvpaaRequest(
         IsUvpaaResponseDetails details,
         VoidCallback callback);
diff --git a/chrome/common/extensions/chrome_extensions_client.cc b/chrome/common/extensions/chrome_extensions_client.cc
index c2d5ce0..f7b8a689a 100644
--- a/chrome/common/extensions/chrome_extensions_client.cc
+++ b/chrome/common/extensions/chrome_extensions_client.cc
@@ -169,7 +169,7 @@
   // therefore not determined by Chromium. If the location of the blocklist file
   // ever changes, we need to update this function. A DCHECK in the
   // ExtensionUpdater ensures that we notice a change. This is the full URL
-  // of a blacklist:
+  // of a blocklist:
   // http://www.gstatic.com/chrome/extensions/blocklist/l_0_0_0_7.txt
   return base::StartsWith(url.spec(), kExtensionBlocklistUrlPrefix,
                           base::CompareCase::SENSITIVE) ||
@@ -223,7 +223,7 @@
   }
 
   // TODO(jstritar): We should try to remove this special case. Also, these
-  // whitelist entries need to be updated when the kManagement permission
+  // allowed entries need to be updated when the kManagement permission
   // changes.
   if (is_extension_active && extension.permissions_data()->HasAPIPermission(
                                  mojom::APIPermissionID::kManagement)) {
diff --git a/chrome/common/extensions/manifest_handlers/linked_app_icons.cc b/chrome/common/extensions/manifest_handlers/linked_app_icons.cc
index ab91938..1ee3da8 100644
--- a/chrome/common/extensions/manifest_handlers/linked_app_icons.cc
+++ b/chrome/common/extensions/manifest_handlers/linked_app_icons.cc
@@ -63,7 +63,7 @@
       return false;
     }
 
-    for (const auto& icon_value : icons_value->GetList()) {
+    for (const auto& icon_value : icons_value->GetListDeprecated()) {
       const base::DictionaryValue* icon_dict = nullptr;
       if (!icon_value.GetAsDictionary(&icon_dict)) {
         *error = base::UTF8ToUTF16(
diff --git a/chrome/common/extensions/manifest_handlers/natively_connectable_handler.cc b/chrome/common/extensions/manifest_handlers/natively_connectable_handler.cc
index ea1d25e4..d6fab365 100644
--- a/chrome/common/extensions/manifest_handlers/natively_connectable_handler.cc
+++ b/chrome/common/extensions/manifest_handlers/natively_connectable_handler.cc
@@ -50,7 +50,7 @@
   }
 
   auto hosts = std::make_unique<NativelyConnectableHosts>();
-  for (const auto& host : natively_connectable_hosts->GetList()) {
+  for (const auto& host : natively_connectable_hosts->GetListDeprecated()) {
     if (!host.is_string() || host.GetString().empty()) {
       *error = manifest_errors::kInvalidNativelyConnectableValue16;
       return false;
diff --git a/chrome/common/extensions/permissions/permissions_data_unittest.cc b/chrome/common/extensions/permissions/permissions_data_unittest.cc
index 79932d1..b1414be30 100644
--- a/chrome/common/extensions/permissions/permissions_data_unittest.cc
+++ b/chrome/common/extensions/permissions/permissions_data_unittest.cc
@@ -141,7 +141,7 @@
       << name;
   EXPECT_TRUE(error.empty()) << name;
 
-  // We should only allow other schemes for extensions when it's a whitelisted
+  // We should only allow other schemes for extensions when it's an allowed
   // extension.
   error.clear();
   bool allow_on_other_schemes = PermissionsData::CanExecuteScriptEverywhere(
@@ -1018,8 +1018,8 @@
   extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed);
 
   // Adding example.com and all its subdomains to the blocked list and
-  // test.example.com to the whitelist. This is still the individual policy
-  // Since the whitelist overrides a blacklist we expect to allow access to
+  // test.example.com to the allowlist. This is still the individual policy
+  // Since the allowlist overrides a blocklist we expect to allow access to
   // test.example.com but block access to all other example.com subdomains
   // (sample.example.com) and example.com itself.
   EXPECT_EQ(DISALLOWED, GetExtensionAccess(extension.get(), example_com));
@@ -1105,8 +1105,8 @@
 
   // Supress host permission for example.com since its on the blocklist
   EXPECT_FALSE(extension->permissions_data()->HasHostPermission(example_com));
-  // Allow host permission for test.example.com since its on the whitelist and
-  // blacklist. The whitelist overrides the blacklist.
+  // Allow host permission for test.example.com since its on the allowlist and
+  // blocklist. The allowlist overrides the blocklist.
   EXPECT_TRUE(
       extension->permissions_data()->HasHostPermission(test_example_com));
   EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url));
diff --git a/chrome/common/extensions/sync_helper.h b/chrome/common/extensions/sync_helper.h
index c3c3741..b0545c8a 100644
--- a/chrome/common/extensions/sync_helper.h
+++ b/chrome/common/extensions/sync_helper.h
@@ -20,7 +20,7 @@
 
 // Component extensions usually aren't synced, but some are so that they'll
 // retain their position in the app list. Returns true for component extensions
-// on that whitelist.
+// that are allowed.
 bool IsSyncableComponentExtension(const Extension* extension);
 
 }  // namespace sync_helper
diff --git a/chrome/common/media/cdm_registration.cc b/chrome/common/media/cdm_registration.cc
index 64ddcc6..2fd0dc6 100644
--- a/chrome/common/media/cdm_registration.cc
+++ b/chrome/common/media/cdm_registration.cc
@@ -62,11 +62,10 @@
       kWidevineCdmType, version, cdm_library_path);
 }
 
-#if !BUILDFLAG(IS_CHROMEOS_ASH)
-// On desktop Linux, given |cdm_base_path| that points to a folder containing
-// the Widevine CDM and associated files, read the manifest included in that
-// directory and create a CdmInfo. If that is successful, return the CdmInfo. If
-// not, return nullptr.
+// On desktop Linux and ChromeOS, given |cdm_base_path| that points to a folder
+// containing the Widevine CDM and associated files, read the manifest included
+// in that directory and create a CdmInfo. If that is successful, return the
+// CdmInfo. If not, return nullptr.
 std::unique_ptr<content::CdmInfo> CreateCdmInfoFromWidevineDirectory(
     const base::FilePath& cdm_base_path) {
   // Library should be inside a platform specific directory.
@@ -86,7 +85,6 @@
   return CreateWidevineCdmInfo(version, cdm_library_path,
                                std::move(capability));
 }
-#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
 #endif  // (BUILDFLAG(BUNDLE_WIDEVINE_CDM) ||
         // BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)) && (BUILDFLAG(IS_LINUX) ||
         // BUILDFLAG(IS_CHROMEOS))
@@ -97,52 +95,6 @@
 // sandbox. On Windows and Mac, the bundled CDM is handled by the component
 // updater.
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-std::unique_ptr<content::CdmInfo> CreateCdmInfoForChromeOS(
-    const base::FilePath& install_dir) {
-  // On ChromeOS the Widevine CDM library is in the component directory and
-  // does not have a manifest.
-  // TODO(crbug.com/971433): Move Widevine CDM to a separate folder in the
-  // component directory so that the manifest can be included.
-  auto cdm_library_path =
-      install_dir.Append(base::GetNativeLibraryName(kWidevineCdmLibraryName));
-  if (!base::PathExists(cdm_library_path))
-    return nullptr;
-
-  // As there is no manifest, set |capability| as if it came from one. These
-  // values must match the CDM that is being bundled with Chrome.
-  media::CdmCapability capability;
-
-  // Note that desktop CDMs only support decryption of audio content,
-  // no decoding. Manifest does not contain any audio codecs, as decoding
-  // will be done by the browser. So use the standard set of audio codecs
-  // supported.
-  capability.audio_codecs = media::GetCdmSupportedAudioCodecs();
-
-  // Add the supported codecs as if they came from the component manifest.
-  // Not specifying any profiles to indicate that all relevant profiles
-  // should be considered supported.
-  const std::vector<media::VideoCodecProfile> kAllProfiles = {};
-  capability.video_codecs.emplace(media::VideoCodec::kVP8, kAllProfiles);
-  capability.video_codecs.emplace(media::VideoCodec::kVP9, kAllProfiles);
-  capability.video_codecs.emplace(media::VideoCodec::kAV1, kAllProfiles);
-#if BUILDFLAG(USE_PROPRIETARY_CODECS)
-  capability.video_codecs.emplace(media::VideoCodec::kH264, kAllProfiles);
-#endif  // BUILDFLAG(USE_PROPRIETARY_CODECS)
-
-  // Both encryption schemes are supported on ChromeOS.
-  capability.encryption_schemes.insert(media::EncryptionScheme::kCenc);
-  capability.encryption_schemes.insert(media::EncryptionScheme::kCbcs);
-
-  // Both temporary and persistent sessions are supported on ChromeOS.
-  capability.session_types.insert(media::CdmSessionType::kTemporary);
-  capability.session_types.insert(media::CdmSessionType::kPersistentLicense);
-
-  return CreateWidevineCdmInfo(base::Version(WIDEVINE_CDM_VERSION_STRING),
-                               cdm_library_path, std::move(capability));
-}
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
 // This code checks to see if the Widevine CDM was bundled with Chrome. If one
 // can be found and looks valid, it returns the CdmInfo for the CDM. Otherwise
 // it returns nullptr.
@@ -154,17 +106,7 @@
         base::FilePath install_dir;
         CHECK(base::PathService::Get(chrome::DIR_BUNDLED_WIDEVINE_CDM,
                                      &install_dir));
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-        // On ChromeOS the Widevine CDM library is in the component directory
-        // (returned above) and does not have a manifest.
-        // TODO(crbug.com/971433): Move Widevine CDM to a separate folder in
-        // the component directory so that the manifest can be included.
-        return CreateCdmInfoForChromeOS(install_dir);
-#else
-        // On desktop Linux the MANIFEST is bundled with the CDM.
         return CreateCdmInfoFromWidevineDirectory(install_dir);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
       }());
   return s_cdm_info->get();
 }
diff --git a/chrome/common/printing/printer_capabilities_unittest.cc b/chrome/common/printing/printer_capabilities_unittest.cc
index d72cff5..0f87f70 100644
--- a/chrome/common/printing/printer_capabilities_unittest.cc
+++ b/chrome/common/printing/printer_capabilities_unittest.cc
@@ -208,7 +208,7 @@
   const Value* media_option =
       media_size->FindKeyOfType("option", Value::Type::LIST);
   ASSERT_TRUE(media_option);
-  const auto& list = media_option->GetList();
+  const auto& list = media_option->GetListDeprecated();
   ASSERT_EQ(3U, list.size());
 
   // Verify the 3 paper sizes are the ones in |caps->papers|, followed by the
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index 1d9cf8c..1ee3fc56 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -546,7 +546,8 @@
 const char kPrivacySandboxSubPagePath[] = "/privacySandbox";
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 const char kChromeUIWebAppSettingsURL[] = "chrome://app-settings/";
 const char kChromeUIWebAppSettingsHost[] = "app-settings";
 #endif
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index afb9323..1fd300b4 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -384,7 +384,8 @@
 extern const char kChromeUIDiscardsURL[];
 #endif
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_FUCHSIA)
 extern const char kChromeUIWebAppSettingsURL[];
 extern const char kChromeUIWebAppSettingsHost[];
 #endif
diff --git a/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc b/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc
index 98243f4..32b5448 100644
--- a/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc
+++ b/chrome/credential_provider/gaiacp/event_logs_upload_manager.cc
@@ -458,7 +458,8 @@
     }
   }
 
-  if (log_entry_value_list && log_entry_value_list->GetList().size() > 0) {
+  if (log_entry_value_list &&
+      log_entry_value_list->GetListDeprecated().size() > 0) {
     upload_status_ = MakeUploadLogChunkRequest(access_token, chunk_id,
                                                std::move(log_entry_value_list));
     if (FAILED(upload_status_)) {
@@ -487,7 +488,8 @@
     return hr;
   }
 
-  size_t num_events_to_upload = log_entries_value_list->GetList().size();
+  size_t num_events_to_upload =
+      log_entries_value_list->GetListDeprecated().size();
 
   base::Value request_dict(base::Value::Type::DICTIONARY);
   request_dict.SetStringKey(kRequestSerialNumberParameterName,
diff --git a/chrome/credential_provider/gaiacp/experiments_manager.cc b/chrome/credential_provider/gaiacp/experiments_manager.cc
index 4c124a90..63ed148 100644
--- a/chrome/credential_provider/gaiacp/experiments_manager.cc
+++ b/chrome/credential_provider/gaiacp/experiments_manager.cc
@@ -87,7 +87,7 @@
   }
 
   if (experiments_value->is_list()) {
-    for (const auto& item : experiments_value->GetList()) {
+    for (const auto& item : experiments_value->GetListDeprecated()) {
       auto* f = item.FindStringKey(kResponseFeatureKeyName);
       auto* v = item.FindStringKey(kResponseValueKeyName);
       if (!f || !v) {
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
index 5107cfe..d7831de 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
@@ -3477,7 +3477,7 @@
 
   std::vector<std::string> actual_mac_address_list;
   for (const base::Value& value :
-       request_dict.FindKey("wlan_mac_addr")->GetList()) {
+       request_dict.FindKey("wlan_mac_addr")->GetListDeprecated()) {
     ASSERT_TRUE(value.is_string());
     actual_mac_address_list.push_back(value.GetString());
   }
diff --git a/chrome/credential_provider/gaiacp/gcp_utils.cc b/chrome/credential_provider/gaiacp/gcp_utils.cc
index 1110cc5..a7a1a900 100644
--- a/chrome/credential_provider/gaiacp/gcp_utils.cc
+++ b/chrome/credential_provider/gaiacp/gcp_utils.cc
@@ -1014,7 +1014,7 @@
 
   auto* value = json_obj->FindListPath(base::JoinString(path, "."));
   if (value && value->is_list()) {
-    for (const base::Value& entry : value->GetList()) {
+    for (const base::Value& entry : value->GetListDeprecated()) {
       if (entry.FindKey(list_key) && entry.FindKey(list_key)->is_string()) {
         output->push_back(entry.FindKey(list_key)->GetString());
       } else {
diff --git a/chrome/installer/util/initial_preferences.cc b/chrome/installer/util/initial_preferences.cc
index 04a80a3..e7c3c27 100644
--- a/chrome/installer/util/initial_preferences.cc
+++ b/chrome/installer/util/initial_preferences.cc
@@ -43,8 +43,8 @@
   if (!prefs->GetList(name, &value_list))
     return list;
 
-  list.reserve(value_list->GetList().size());
-  for (const base::Value& entry : value_list->GetList()) {
+  list.reserve(value_list->GetListDeprecated().size());
+  for (const base::Value& entry : value_list->GetListDeprecated()) {
     if (!entry.is_string()) {
       NOTREACHED();
       break;
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index f664cf0..17631441 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -356,20 +356,13 @@
     ]
   }
 
-  if (is_chromeos_ash || is_chromeos_lacros) {
+  if (is_chromeos) {
     sources += [
       "extensions/file_browser_handler_custom_bindings.cc",
       "extensions/file_browser_handler_custom_bindings.h",
       "extensions/platform_keys_natives.cc",
       "extensions/platform_keys_natives.h",
     ]
-  }
-
-  if (is_chromeos_ash) {
-    sources += [
-      "extensions/file_manager_private_custom_bindings.cc",
-      "extensions/file_manager_private_custom_bindings.h",
-    ]
     if (use_cups) {
       sources += [
         "extensions/printing_hooks_delegate.cc",
@@ -378,6 +371,13 @@
     }
   }
 
+  if (is_chromeos_ash) {
+    sources += [
+      "extensions/file_manager_private_custom_bindings.cc",
+      "extensions/file_manager_private_custom_bindings.h",
+    ]
+  }
+
   if (!is_android) {
     sources += [
       "cart/commerce_hint_agent.cc",
diff --git a/chrome/renderer/cart/commerce_hint_agent.cc b/chrome/renderer/cart/commerce_hint_agent.cc
index 2535b076..29cb08c1d 100644
--- a/chrome/renderer/cart/commerce_hint_agent.cc
+++ b/chrome/renderer/cart/commerce_hint_agent.cc
@@ -855,7 +855,7 @@
   bool is_partner = commerce_renderer_feature::IsPartnerMerchant(
       GURL(render_frame()->GetWebFrame()->GetDocument().Url()));
   std::vector<mojom::ProductPtr> products;
-  for (const auto& product : extracted_products->GetList()) {
+  for (const auto& product : extracted_products->GetListDeprecated()) {
     if (!product.is_dict())
       continue;
     const auto* image_url = product.FindKey("imageUrl");
diff --git a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc
index ca4cf32..c5b2cc0 100644
--- a/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc
+++ b/chrome/renderer/extensions/chrome_extensions_dispatcher_delegate.cc
@@ -42,17 +42,17 @@
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/web/web_security_policy.h"
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS)
 #include "chrome/renderer/extensions/file_browser_handler_custom_bindings.h"
 #include "chrome/renderer/extensions/platform_keys_natives.h"
+#if defined(USE_CUPS)
+#include "chrome/renderer/extensions/printing_hooks_delegate.h"
+#endif
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/renderer/extensions/accessibility_private_hooks_delegate.h"
 #include "chrome/renderer/extensions/file_manager_private_custom_bindings.h"
-#if defined(USE_CUPS)
-#include "chrome/renderer/extensions/printing_hooks_delegate.h"
-#endif
 #endif
 
 using extensions::NativeHandler;
@@ -70,14 +70,14 @@
       "sync_file_system",
       std::unique_ptr<NativeHandler>(
           new extensions::SyncFileSystemCustomBindings(context)));
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS)
   module_system->RegisterNativeHandler(
       "file_browser_handler",
       std::make_unique<extensions::FileBrowserHandlerCustomBindings>(context));
   module_system->RegisterNativeHandler(
       "platform_keys_natives",
       std::make_unique<extensions::PlatformKeysNatives>(context));
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#endif  // BUILDFLAG(IS_CHROMEOS)
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   module_system->RegisterNativeHandler(
       "file_manager_private",
@@ -141,7 +141,7 @@
   source_map->RegisterSource("tts", IDR_TTS_CUSTOM_BINDINGS_JS);
   source_map->RegisterSource("ttsEngine", IDR_TTS_ENGINE_CUSTOM_BINDINGS_JS);
 
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#if BUILDFLAG(IS_CHROMEOS)
   source_map->RegisterSource("enterprise.platformKeys",
                              IDR_ENTERPRISE_PLATFORM_KEYS_CUSTOM_BINDINGS_JS);
   source_map->RegisterSource("enterprise.platformKeys.KeyPair",
@@ -249,7 +249,7 @@
       ->SetDelegate(
           std::make_unique<extensions::AccessibilityPrivateHooksDelegate>());
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-#if BUILDFLAG(IS_CHROMEOS_ASH) && defined(USE_CUPS)
+#if BUILDFLAG(IS_CHROMEOS) && defined(USE_CUPS)
   bindings->GetHooksForAPI("printing")
       ->SetDelegate(std::make_unique<extensions::PrintingHooksDelegate>());
 #endif
diff --git a/chrome/renderer/net/net_error_helper.cc b/chrome/renderer/net/net_error_helper.cc
index 3a8438d..4a8f9d2 100644
--- a/chrome/renderer/net/net_error_helper.cc
+++ b/chrome/renderer/net/net_error_helper.cc
@@ -20,6 +20,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_resource_request_blocked_reason.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/renderer/chrome_render_thread_observer.h"
@@ -30,6 +31,7 @@
 #include "components/offline_pages/buildflags/buildflags.h"
 #include "components/offline_pages/core/offline_page_feature.h"
 #include "components/security_interstitials/content/renderer/security_interstitial_page_controller.h"
+#include "components/strings/grit/components_strings.h"
 #include "content/public/common/content_client.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/url_constants.h"
@@ -45,6 +47,7 @@
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/cpp/simple_url_loader.h"
+#include "skia/ext/skia_utils_base.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-shared.h"
@@ -58,6 +61,7 @@
 #include "third_party/blink/public/web/web_frame.h"
 #include "third_party/blink/public/web/web_history_item.h"
 #include "third_party/blink/public/web/web_local_frame.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/webui/jstemplate_builder.h"
 #include "url/gurl.h"
@@ -249,22 +253,34 @@
         alternative_error_page_info,
     std::string* error_html) const {
   error_html->clear();
-
   int resource_id = IDR_NET_ERROR_HTML;
+  LocalizedError::PageState page_state;
+  // If the user is viewing an offline web app then a default page is shown
+  // rather than the dino.
+  if (alternative_error_page_info) {
+    DCHECK(
+        base::FeatureList::IsEnabled(features::kDesktopPWAsDefaultOfflinePage));
+    // TODO(crbug.com/1290204): Add histogram for default web app offline page.
+    resource_id = alternative_error_page_info->resource_id;
+    page_state = LocalizedError::GetPageStateForOverriddenErrorPage(
+        std::move(alternative_error_page_info->alternative_error_page_params),
+        error.reason(), error.domain(), error.url(),
+        RenderThread::Get()->GetLocale());
+  } else {
+    page_state = LocalizedError::GetPageState(
+        error.reason(), error.domain(), error.url(), is_failed_post,
+        error.resolve_error_info().is_secure_network_error,
+        error.stale_copy_in_cache(), can_show_network_diagnostics_dialog,
+        ChromeRenderThreadObserver::is_incognito_process(),
+        IsOfflineContentOnNetErrorFeatureEnabled(), IsAutoFetchFeatureEnabled(),
+        IsRunningInForcedAppMode(), RenderThread::Get()->GetLocale(),
+        IsExtensionExtendedErrorCode(error.extended_reason()));
+  }
   std::string extracted_string =
       ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
           resource_id);
   base::StringPiece template_html(extracted_string.data(),
                                   extracted_string.size());
-
-  LocalizedError::PageState page_state = LocalizedError::GetPageState(
-      error.reason(), error.domain(), error.url(), is_failed_post,
-      error.resolve_error_info().is_secure_network_error,
-      error.stale_copy_in_cache(), can_show_network_diagnostics_dialog,
-      ChromeRenderThreadObserver::is_incognito_process(),
-      IsOfflineContentOnNetErrorFeatureEnabled(), IsAutoFetchFeatureEnabled(),
-      IsRunningInForcedAppMode(), RenderThread::Get()->GetLocale(),
-      IsExtensionExtendedErrorCode(error.extended_reason()));
   DCHECK(!template_html.empty()) << "unable to load template.";
   // "t" is the id of the template's root node.
   *error_html =
diff --git a/chrome/renderer/net/net_error_helper_core.cc b/chrome/renderer/net/net_error_helper_core.cc
index bf44ba92..6f5c47b 100644
--- a/chrome/renderer/net/net_error_helper_core.cc
+++ b/chrome/renderer/net/net_error_helper_core.cc
@@ -211,7 +211,8 @@
   std::string error_param;
   error_page::Error error = pending_error_page_info->error;
 
-  if (IsNetDnsError(pending_error_page_info->error)) {
+  if (!alternative_error_page_info &&
+      IsNetDnsError(pending_error_page_info->error)) {
     // The last probe status needs to be reset if this is a DNS error.  This
     // means that if a DNS error page is committed but has not yet finished
     // loading, a DNS probe status scheduled to be sent to it may be thrown
diff --git a/chrome/renderer/net/net_error_helper_core_unittest.cc b/chrome/renderer/net/net_error_helper_core_unittest.cc
index 4bfaf79..794283f 100644
--- a/chrome/renderer/net/net_error_helper_core_unittest.cc
+++ b/chrome/renderer/net/net_error_helper_core_unittest.cc
@@ -20,11 +20,14 @@
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/common/available_offline_content.mojom.h"
 #include "chrome/renderer/net/available_offline_content_helper.h"
 #include "components/error_page/common/error.h"
 #include "components/error_page/common/net_error_info.h"
+#include "components/grit/components_resources.h"
+#include "components/strings/grit/components_strings.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/mock_render_thread.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -32,8 +35,10 @@
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "net/base/net_errors.h"
 #include "net/dns/public/resolve_error_info.h"
+#include "skia/ext/skia_utils_base.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
 #if BUILDFLAG(IS_ANDROID)
@@ -836,6 +841,38 @@
   EXPECT_EQ(GURL(kFailedUrl), diagnose_error_url());
 }
 
+TEST_F(NetErrorHelperCoreTest, AlternativeErrorPageNoUpdates) {
+  // Relevant strings for the alternative error page can be found in
+  // `chrome/browser/web_applications/web_app_offline.h`
+  auto alternative_error_page_info =
+      content::mojom::AlternativeErrorPageOverrideInfo::New();
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetStringKey("theme_color", skia::SkColorToHexString(SK_ColorBLUE));
+  dict.SetStringKey("customized_background_color",
+                    skia::SkColorToHexString(SK_ColorYELLOW));
+  dict.SetStringKey("app_short_name", "Test Short Name");
+  dict.SetStringKey(
+      "web_app_default_offline_message",
+      l10n_util::GetStringUTF16(IDS_ERRORPAGES_HEADING_INTERNET_DISCONNECTED));
+  alternative_error_page_info->alternative_error_page_params = std::move(dict);
+  alternative_error_page_info->resource_id = IDR_WEBAPP_DEFAULT_OFFLINE_HTML;
+
+  // Loading fails, and an error page is requested.
+  std::string html;
+  core()->PrepareErrorPage(
+      NetErrorHelperCore::MAIN_FRAME, NetError(net::ERR_NAME_NOT_RESOLVED),
+      /*is_failed_post=*/false, std::move(alternative_error_page_info), &html);
+
+  // Expect that for all probe updates the error page does not change
+  core()->OnCommitLoad(NetErrorHelperCore::MAIN_FRAME, error_url());
+  core()->OnFinishLoad(NetErrorHelperCore::MAIN_FRAME);
+  core()->OnNetErrorInfo(error_page::DNS_PROBE_STARTED);
+  core()->OnNetErrorInfo(error_page::DNS_PROBE_FINISHED_NXDOMAIN);
+  core()->OnNetErrorInfo(error_page::DNS_PROBE_STARTED);
+  core()->OnNetErrorInfo(error_page::DNS_PROBE_FINISHED_NXDOMAIN);
+  EXPECT_EQ(0, update_count());
+}
+
 #if BUILDFLAG(IS_ANDROID)
 TEST_F(NetErrorHelperCoreTest, Download) {
   DoErrorLoad(net::ERR_INTERNET_DISCONNECTED);
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 0e5f796..d35a434 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4547,6 +4547,7 @@
     "../browser/component_updater/origin_trials_component_installer_unittest.cc",
     "../browser/component_updater/subresource_filter_component_installer_unittest.cc",
     "../browser/component_updater/trust_token_key_commitments_component_installer_unittest.cc",
+    "../browser/component_updater/updater_state_unittest.cc",
     "../browser/content_index/content_index_provider_unittest.cc",
     "../browser/content_settings/content_settings_default_provider_unittest.cc",
     "../browser/content_settings/content_settings_mock_observer.cc",
@@ -6492,8 +6493,14 @@
   }
 
   if (is_chromeos) {
-    sources += [ "../browser/chromeos/arc/open_with_menu_unittest.cc" ]
-    deps += [ "//components/arc/common" ]
+    sources += [
+      "../browser/chromeos/arc/arc_external_protocol_dialog_unittest.cc",
+      "../browser/chromeos/arc/open_with_menu_unittest.cc",
+    ]
+    deps += [
+      "//components/arc/common",
+      "//components/arc/common:arc_test_support",
+    ]
   }
 
   if (is_chromeos_lacros) {
@@ -7028,6 +7035,7 @@
       "../browser/extensions/safe_browsing_verdict_handler_unittest.cc",
       "../browser/extensions/scripting_permissions_modifier_unittest.cc",
       "../browser/extensions/shared_module_service_unittest.cc",
+      "../browser/extensions/site_permissions_helper_unittest.cc",
       "../browser/extensions/standard_management_policy_provider_unittest.cc",
       "../browser/extensions/tab_helper_unittest.cc",
       "../browser/extensions/update_install_gate_unittest.cc",
@@ -9939,7 +9947,6 @@
 
 if (is_linux || is_mac || is_win) {
   script_test("variations_smoke_tests") {
-    run_under_python2 = true
 
     if (is_linux) {
       script = "//testing/xvfb.py"
@@ -9958,8 +9965,8 @@
     ]
 
     data = [
+      "//.vpython3",
       "//testing/scripts/run_variations_smoke_tests.py",
-      "//testing/scripts/variations_http_test_server.py",
       "//testing/scripts/variations_seed_access_helper.py",
       "//testing/scripts/variations_smoke_test_data/",
       "//testing/scripts/variations_smoke_test_data/http_server/",
diff --git a/chrome/test/base/devtools_listener.cc b/chrome/test/base/devtools_listener.cc
index b5c5c44..53d3fce 100644
--- a/chrome/test/base/devtools_listener.cc
+++ b/chrome/test/base/devtools_listener.cc
@@ -152,8 +152,8 @@
   CHECK(result->GetList("result", &coverage_entries));
 
   auto entries = std::make_unique<base::ListValue>();
-  for (size_t i = 0; i != coverage_entries->GetList().size(); ++i) {
-    base::Value& entry = coverage_entries->GetList()[i];
+  for (size_t i = 0; i != coverage_entries->GetListDeprecated().size(); ++i) {
+    base::Value& entry = coverage_entries->GetListDeprecated()[i];
     CHECK(entry.is_dict());
 
     std::string* script_id = entry.FindStringKey("scriptId");
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc
index e6acafa..b9eb804 100644
--- a/chrome/test/base/test_browser_window.cc
+++ b/chrome/test/base/test_browser_window.cc
@@ -115,6 +115,10 @@
   return nullptr;
 }
 
+const ui::ThemeProvider* TestBrowserWindow::GetThemeProvider() const {
+  return nullptr;
+}
+
 const ui::ColorProvider* TestBrowserWindow::GetColorProvider() const {
   return ui::ColorProviderManager::Get().GetColorProviderFor(
       {ui::ColorProviderManager::ColorMode::kLight,
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h
index 009b58f5..e6689ced 100644
--- a/chrome/test/base/test_browser_window.h
+++ b/chrome/test/base/test_browser_window.h
@@ -74,6 +74,7 @@
   bool DoBrowserControlsShrinkRendererSize(
       const content::WebContents* contents) const override;
   ui::NativeTheme* GetNativeTheme() override;
+  const ui::ThemeProvider* GetThemeProvider() const override;
   const ui::ColorProvider* GetColorProvider() const override;
   ui::ElementContext GetElementContext() override;
   int GetTopControlsHeight() const override;
diff --git a/chrome/test/base/web_ui_browser_test.cc b/chrome/test/base/web_ui_browser_test.cc
index ec0936f..1b8a643 100644
--- a/chrome/test/base/web_ui_browser_test.cc
+++ b/chrome/test/base/web_ui_browser_test.cc
@@ -116,7 +116,7 @@
     // To ensure this gets done, do this before ASSERT* calls.
     RunQuitClosure();
 
-    const auto& list = test_result->GetList();
+    const auto& list = test_result->GetListDeprecated();
     ASSERT_FALSE(list.empty());
     const bool test_succeeded = list[0].is_bool() && list[0].GetBool();
     std::string message;
diff --git a/chrome/test/base/web_ui_browser_test_browsertest.cc b/chrome/test/base/web_ui_browser_test_browsertest.cc
index c0e7e46..6fc0f7c 100644
--- a/chrome/test/base/web_ui_browser_test_browsertest.cc
+++ b/chrome/test/base/web_ui_browser_test_browsertest.cc
@@ -163,7 +163,7 @@
 
     // Starts the test in |list_value|[0] with the runAsync wrapper.
     void HandleStartAsyncTest(const base::ListValue* list_value) {
-      const base::Value& test_name = list_value->GetList()[0];
+      const base::Value& test_name = list_value->GetListDeprecated()[0];
       web_ui()->CallJavascriptFunctionUnsafe("runAsync", test_name);
     }
   };
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc
index d12c3ea..fee0d90 100644
--- a/chrome/test/chromedriver/capabilities.cc
+++ b/chrome/test/chromedriver/capabilities.cc
@@ -358,7 +358,7 @@
       // In practice, library implementations are not always consistent,
       // so we accept both formats regardless of the W3C mode setting.
       if (option_value->is_list()) {
-        for (const base::Value& item : option_value->GetList()) {
+        for (const base::Value& item : option_value->GetListDeprecated()) {
           if (!item.is_string())
             return Status(kInvalidArgument,
                           "'noProxy' must be a list of strings");
diff --git a/chrome/test/chromedriver/chrome/chrome_android_impl.cc b/chrome/test/chromedriver/chrome/chrome_android_impl.cc
index ef777c9..691615f 100644
--- a/chrome/test/chromedriver/chrome/chrome_android_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_android_impl.cc
@@ -51,10 +51,10 @@
   if (status.IsError())
     return status;
 
-  window->left = static_cast<int>(result->GetList()[0].GetDouble());
-  window->top = static_cast<int>(result->GetList()[1].GetDouble());
-  window->width = static_cast<int>(result->GetList()[2].GetDouble());
-  window->height = static_cast<int>(result->GetList()[3].GetDouble());
+  window->left = static_cast<int>(result->GetListDeprecated()[0].GetDouble());
+  window->top = static_cast<int>(result->GetListDeprecated()[1].GetDouble());
+  window->width = static_cast<int>(result->GetListDeprecated()[2].GetDouble());
+  window->height = static_cast<int>(result->GetListDeprecated()[3].GetDouble());
   // Android does not use Window.id or have window states
   window->id = 0;
   window->state = "";
diff --git a/chrome/test/chromedriver/chrome/console_logger.cc b/chrome/test/chromedriver/chrome/console_logger.cc
index 35f38e8..4811988 100644
--- a/chrome/test/chromedriver/chrome/console_logger.cc
+++ b/chrome/test/chromedriver/chrome/console_logger.cc
@@ -115,7 +115,7 @@
     const base::ListValue* call_frames = nullptr;
     if (!stack_trace->GetList("callFrames", &call_frames))
       return Status(kUnknownError, "missing or invalid callFrames");
-    const base::Value& call_frame_value = call_frames->GetList()[0];
+    const base::Value& call_frame_value = call_frames->GetListDeprecated()[0];
     if (call_frame_value.is_dict()) {
       const base::DictionaryValue& call_frame =
           base::Value::AsDictionaryValue(call_frame_value);
@@ -137,13 +137,13 @@
   std::string text;
   const base::ListValue* args = nullptr;
 
-  if (!params.GetList("args", &args) || args->GetList().size() < 1) {
+  if (!params.GetList("args", &args) || args->GetListDeprecated().size() < 1) {
     return Status(kUnknownError, "missing or invalid args");
   }
 
-  int arg_count = args->GetList().size();
+  int arg_count = args->GetListDeprecated().size();
   for (int i = 0; i < arg_count; i++) {
-    const base::Value& current_arg_value = args->GetList()[i];
+    const base::Value& current_arg_value = args->GetListDeprecated()[i];
     if (!current_arg_value.is_dict()) {
       std::string error_message = base::StringPrintf("Argument %d is missing or invalid", i);
       return Status(kUnknownError, error_message );
@@ -204,7 +204,7 @@
       preview->GetList("properties", &properties)) {
     // If the event contains an object which is an instance of the JS Error
     // class, attempt to get the message property for the exception.
-    for (const base::Value& property_value : properties->GetList()) {
+    for (const base::Value& property_value : properties->GetListDeprecated()) {
       if (property_value.is_dict()) {
         const base::DictionaryValue& property =
             base::Value::AsDictionaryValue(property_value);
diff --git a/chrome/test/chromedriver/chrome/devtools_http_client.cc b/chrome/test/chromedriver/chrome/devtools_http_client.cc
index a973d34..aa0e6dc 100644
--- a/chrome/test/chromedriver/chrome/devtools_http_client.cc
+++ b/chrome/test/chromedriver/chrome/devtools_http_client.cc
@@ -283,7 +283,7 @@
     return Status(kUnknownError, "DevTools did not return list");
 
   std::vector<WebViewInfo> temp_views_info;
-  for (const base::Value& info_value : value->GetList()) {
+  for (const base::Value& info_value : value->GetListDeprecated()) {
     if (!info_value.is_dict())
       return Status(kUnknownError, "DevTools contains non-dictionary item");
     const base::DictionaryValue& info =
diff --git a/chrome/test/chromedriver/chrome/frame_tracker.cc b/chrome/test/chromedriver/chrome/frame_tracker.cc
index 05cd274e..9b66eca 100644
--- a/chrome/test/chromedriver/chrome/frame_tracker.cc
+++ b/chrome/test/chromedriver/chrome/frame_tracker.cc
@@ -164,7 +164,7 @@
     if (!type)
       return Status(kUnknownError,
                     "missing target type in Target.attachedToTarget event");
-    if (*type == "iframe") {
+    if (*type == "iframe" || *type == "page") {
       const std::string* target_id =
           params.FindStringPath("targetInfo.targetId");
       if (!target_id)
diff --git a/chrome/test/chromedriver/chrome/log.cc b/chrome/test/chromedriver/chrome/log.cc
index 564b211..ac725baf 100644
--- a/chrome/test/chromedriver/chrome/log.cc
+++ b/chrome/test/chromedriver/chrome/log.cc
@@ -57,8 +57,8 @@
     return std::move(dict_copy);
   } else if (value->is_list()) {
     std::unique_ptr<base::ListValue> list_copy(new base::ListValue());
-    for (const base::Value& child : value->GetList()) {
-      if (list_copy->GetList().size() >= kMaxChildren - 1) {
+    for (const base::Value& child : value->GetListDeprecated()) {
+      if (list_copy->GetListDeprecated().size() >= kMaxChildren - 1) {
         list_copy->Append("...");
         break;
       }
diff --git a/chrome/test/chromedriver/chrome/network_conditions.cc b/chrome/test/chromedriver/chrome/network_conditions.cc
index 039d3af5..62afb80 100644
--- a/chrome/test/chromedriver/chrome/network_conditions.cc
+++ b/chrome/test/chromedriver/chrome/network_conditions.cc
@@ -33,7 +33,7 @@
   if (!parsed_json.value->is_list())
     return Status(kUnknownError, "malformed networks list");
 
-  for (const auto& entry : parsed_json.value->GetList()) {
+  for (const auto& entry : parsed_json.value->GetListDeprecated()) {
     const base::DictionaryValue* network = nullptr;
     if (!entry.GetAsDictionary(&network)) {
       return Status(kUnknownError,
diff --git a/chrome/test/chromedriver/chrome/web_view_impl.cc b/chrome/test/chromedriver/chrome/web_view_impl.cc
index 352342c..5c25db3b 100644
--- a/chrome/test/chromedriver/chrome/web_view_impl.cc
+++ b/chrome/test/chromedriver/chrome/web_view_impl.cc
@@ -289,11 +289,11 @@
   base::Value* entries = result.FindListKey("entries");
   if (!entries)
     return Status(kUnknownError, "navigation history missing entries");
-  if (static_cast<int>(entries->GetList().size()) <= *current_index ||
-      !entries->GetList()[*current_index].is_dict()) {
+  if (static_cast<int>(entries->GetListDeprecated().size()) <= *current_index ||
+      !entries->GetListDeprecated()[*current_index].is_dict()) {
     return Status(kUnknownError, "navigation history missing entry");
   }
-  base::Value& entry = entries->GetList()[*current_index];
+  base::Value& entry = entries->GetListDeprecated()[*current_index];
   if (!entry.FindStringKey("url"))
     return Status(kUnknownError, "navigation history entry is missing url");
   *url = *entry.FindStringKey("url");
@@ -390,15 +390,16 @@
   if (!entries)
     return Status(kUnknownError, "DevTools didn't return entries");
 
-  if (static_cast<int>(entries->GetList().size()) <= *current_index + delta ||
-      !entries->GetList()[*current_index + delta].is_dict()) {
+  if (static_cast<int>(entries->GetListDeprecated().size()) <=
+          *current_index + delta ||
+      !entries->GetListDeprecated()[*current_index + delta].is_dict()) {
     // The WebDriver spec says that if there are no pages left in the browser's
     // history (i.e. |current_index + delta| is out of range), then we must not
     // navigate anywhere.
     return Status(kOk);
   }
 
-  base::Value& entry = entries->GetList()[*current_index + delta];
+  base::Value& entry = entries->GetListDeprecated()[*current_index + delta];
   absl::optional<int> entry_id = entry.FindIntKey("id");
   if (!entry_id)
     return Status(kUnknownError, "history entry does not have an id");
diff --git a/chrome/test/chromedriver/commands_unittest.cc b/chrome/test/chromedriver/commands_unittest.cc
index 1f9c7416..e96c62b90 100644
--- a/chrome/test/chromedriver/commands_unittest.cc
+++ b/chrome/test/chromedriver/commands_unittest.cc
@@ -512,7 +512,7 @@
                                      &result, nullptr)
                      .code());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(0U, result->GetList().size());
+  ASSERT_EQ(0U, result->GetListDeprecated().size());
 }
 
 TEST(CommandsTest, SuccessfulFindChildElement) {
@@ -590,7 +590,7 @@
                      base::Value::AsDictionaryValue(params), &result)
                      .code());
   ASSERT_TRUE(result->is_list());
-  ASSERT_EQ(0U, result->GetList().size());
+  ASSERT_EQ(0U, result->GetListDeprecated().size());
 }
 
 TEST(CommandsTest, TimeoutInFindElement) {
diff --git a/chrome/test/chromedriver/element_commands.cc b/chrome/test/chromedriver/element_commands.cc
index cd814cb6..6b91854 100644
--- a/chrome/test/chromedriver/element_commands.cc
+++ b/chrome/test/chromedriver/element_commands.cc
@@ -572,7 +572,7 @@
     }
     // Compress array into a single string.
     std::string paths_string;
-    for (const base::Value& i : key_list->GetList()) {
+    for (const base::Value& i : key_list->GetListDeprecated()) {
       const std::string* path_part = i.GetIfString();
       if (!path_part)
         return Status(kInvalidArgument, "'value' is invalid");
diff --git a/chrome/test/chromedriver/element_util.cc b/chrome/test/chromedriver/element_util.cc
index 0340968e..9e2b0ca 100644
--- a/chrome/test/chromedriver/element_util.cc
+++ b/chrome/test/chromedriver/element_util.cc
@@ -428,7 +428,7 @@
       }
       if (!temp->is_list())
         return Status(kUnknownError, "script returns unexpected result");
-      if (temp->GetList().size() > 0U) {
+      if (temp->GetListDeprecated().size() > 0U) {
         *value = std::move(temp);
         return Status(kOk);
       }
@@ -1014,7 +1014,7 @@
   if (!nodes)
     return Status(kUnknownError, "No `nodes` found in CDP response");
 
-  base::Value::ListView nodesList = nodes->GetList();
+  base::Value::ListView nodesList = nodes->GetListDeprecated();
   if (nodesList.size() < 1)
     return Status(kUnknownError, "Empty nodes list in CDP response");
 
diff --git a/chrome/test/chromedriver/logging.cc b/chrome/test/chromedriver/logging.cc
index 71cb531..da38ba6 100644
--- a/chrome/test/chromedriver/logging.cc
+++ b/chrome/test/chromedriver/logging.cc
@@ -196,7 +196,7 @@
 WebDriverLog::~WebDriverLog() {
   size_t sum = 0;
   for (const std::unique_ptr<base::ListValue>& batch : batches_of_entries_)
-    sum += batch->GetList().size();
+    sum += batch->GetListDeprecated().size();
   VLOG(1) << "Log type '" << type_ << "' lost " << sum
           << " entries on destruction";
 }
@@ -216,7 +216,7 @@
 
 bool GetFirstErrorMessageFromList(const base::ListValue* list,
                                   std::string* message) {
-  for (const auto& entry : list->GetList()) {
+  for (const auto& entry : list->GetListDeprecated()) {
     const base::DictionaryValue* log_entry = nullptr;
     if (entry.GetAsDictionary(&log_entry)) {
       std::string level;
@@ -253,7 +253,7 @@
     log_entry_dict->SetString("source", source);
   log_entry_dict->SetString("message", message);
   if (batches_of_entries_.empty() ||
-      batches_of_entries_.back()->GetList().size() >=
+      batches_of_entries_.back()->GetListDeprecated().size() >=
           internal::kMaxReturnedEntries) {
     std::unique_ptr<base::ListValue> list(new base::ListValue());
     list->Append(std::move(log_entry_dict));
diff --git a/chrome/test/chromedriver/logging_unittest.cc b/chrome/test/chromedriver/logging_unittest.cc
index e4c9aa27..226d7c55 100644
--- a/chrome/test/chromedriver/logging_unittest.cc
+++ b/chrome/test/chromedriver/logging_unittest.cc
@@ -56,7 +56,7 @@
                       int index,
                       const std::string& expected_level,
                       const std::string& expected_message) {
-  const base::Value& entry_value = entries->GetList()[index];
+  const base::Value& entry_value = entries->GetListDeprecated()[index];
   ASSERT_TRUE(entry_value.is_dict());
   const base::DictionaryValue& entry =
       base::Value::AsDictionaryValue(entry_value);
@@ -79,7 +79,7 @@
 
   std::unique_ptr<base::ListValue> entries(log.GetAndClearEntries());
 
-  ASSERT_EQ(2u, entries->GetList().size());
+  ASSERT_EQ(2u, entries->GetListDeprecated().size());
   ValidateLogEntry(entries.get(), 0, "INFO", "info message");
   ValidateLogEntry(entries.get(), 1, "SEVERE", "severe message");
 }
@@ -91,7 +91,7 @@
 
   std::unique_ptr<base::ListValue> entries(log.GetAndClearEntries());
 
-  ASSERT_EQ(0u, entries->GetList().size());
+  ASSERT_EQ(0u, entries->GetListDeprecated().size());
 }
 
 TEST(WebDriverLog, All) {
@@ -101,7 +101,7 @@
 
   std::unique_ptr<base::ListValue> entries(log.GetAndClearEntries());
 
-  ASSERT_EQ(2u, entries->GetList().size());
+  ASSERT_EQ(2u, entries->GetListDeprecated().size());
   ValidateLogEntry(entries.get(), 0, "SEVERE", "severe message");
   ValidateLogEntry(entries.get(), 1, "DEBUG", "debug message");
 }
@@ -181,7 +181,7 @@
   log.AddEntry(Log::kError, "the 1st error is in the 2nd batch");
   ASSERT_EQ("the 1st error is in the 2nd batch", log.GetFirstErrorMessage());
   std::unique_ptr<base::ListValue> entries = log.GetAndClearEntries();
-  ASSERT_EQ(internal::kMaxReturnedEntries, entries->GetList().size());
+  ASSERT_EQ(internal::kMaxReturnedEntries, entries->GetListDeprecated().size());
   entries = log.GetAndClearEntries();
-  ASSERT_EQ(1u, entries->GetList().size());
+  ASSERT_EQ(1u, entries->GetListDeprecated().size());
 }
diff --git a/chrome/test/chromedriver/performance_logger.cc b/chrome/test/chromedriver/performance_logger.cc
index 0223167..e44933b8 100644
--- a/chrome/test/chromedriver/performance_logger.cc
+++ b/chrome/test/chromedriver/performance_logger.cc
@@ -219,7 +219,7 @@
       return Status(kUnknownError,
                     "received DevTools trace data in unexpected format");
     }
-    for (const auto& trace : traces->GetList()) {
+    for (const auto& trace : traces->GetListDeprecated()) {
       const base::DictionaryValue* event_dict;
       if (!trace.GetAsDictionary(&event_dict))
         return Status(kUnknownError, "trace event must be a dictionary");
diff --git a/chrome/test/chromedriver/performance_logger_unittest.cc b/chrome/test/chromedriver/performance_logger_unittest.cc
index a742284..754b9cee 100644
--- a/chrome/test/chromedriver/performance_logger_unittest.cc
+++ b/chrome/test/chromedriver/performance_logger_unittest.cc
@@ -299,11 +299,11 @@
   base::ListValue* categories;
   EXPECT_TRUE(cmd->params->GetList("traceConfig.includedCategories",
                                    &categories));
-  ASSERT_EQ(2u, categories->GetList().size());
-  ASSERT_TRUE(categories->GetList()[0].is_string());
-  EXPECT_EQ("benchmark", categories->GetList()[0].GetString());
-  ASSERT_TRUE(categories->GetList()[1].is_string());
-  EXPECT_EQ("blink.console", categories->GetList()[1].GetString());
+  ASSERT_EQ(2u, categories->GetListDeprecated().size());
+  ASSERT_TRUE(categories->GetListDeprecated()[0].is_string());
+  EXPECT_EQ("benchmark", categories->GetListDeprecated()[0].GetString());
+  ASSERT_TRUE(categories->GetListDeprecated()[1].is_string());
+  EXPECT_EQ("blink.console", categories->GetListDeprecated()[1].GetString());
   int expected_interval =
       cmd->params->FindIntKey("bufferUsageReportingInterval").value_or(-1);
   EXPECT_GT(expected_interval, 0);
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index 0759534..97cb31c 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -117,8 +117,8 @@
   }
 
   const base::Value* list = params.FindListPath("capabilities.firstMatch");
-  if (list && list->GetList().size()) {
-    const base::Value& caps_dict_ref = std::move(list->GetList()[0]);
+  if (list && list->GetListDeprecated().size()) {
+    const base::Value& caps_dict_ref = std::move(list->GetListDeprecated()[0]);
     if (caps_dict_ref.is_dict() &&
         GetChromeOptionsDictionary(
             base::Value::AsDictionaryValue(caps_dict_ref), &options_dict)) {
@@ -556,7 +556,7 @@
     default_list.Append(base::Value(base::Value::Type::DICTIONARY));
     all_first_match_capabilities = &default_list;
   } else if (all_first_match_capabilities->is_list()) {
-    if (all_first_match_capabilities->GetList().size() < 1)
+    if (all_first_match_capabilities->GetListDeprecated().size() < 1)
       return Status(kInvalidArgument,
                     "'firstMatch' must contain at least one entry");
   } else {
@@ -567,8 +567,10 @@
   std::vector<const base::DictionaryValue*> validated_first_match_capabilities;
 
   // 5. Validate all first match capabilities.
-  for (size_t i = 0; i < all_first_match_capabilities->GetList().size(); ++i) {
-    const base::Value& first_match = all_first_match_capabilities->GetList()[i];
+  for (size_t i = 0;
+       i < all_first_match_capabilities->GetListDeprecated().size(); ++i) {
+    const base::Value& first_match =
+        all_first_match_capabilities->GetListDeprecated()[i];
     if (!first_match.is_dict()) {
       return Status(kInvalidArgument,
                     base::StringPrintf(
diff --git a/chrome/test/chromedriver/session_commands_unittest.cc b/chrome/test/chromedriver/session_commands_unittest.cc
index 6684dc1b..64cf00e7 100644
--- a/chrome/test/chromedriver/session_commands_unittest.cc
+++ b/chrome/test/chromedriver/session_commands_unittest.cc
@@ -183,7 +183,7 @@
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // Empty JSON object allowed as an entry
-  list_ptr->GetList()[0] = base::DictionaryValue();
+  list_ptr->GetListDeprecated()[0] = base::DictionaryValue();
   status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_TRUE(result.DictEmpty());
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py
index d8e2c04..713b3099 100755
--- a/chrome/test/chromedriver/test/run_py_tests.py
+++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -4053,6 +4053,42 @@
     events = self._driver.FindElement('css selector', '#events')
     self.assertEqual('events: touchstart touchend', events.GetText())
 
+class ChromeDriverFencedFrame(ChromeDriverBaseTestWithWebServer):
+  def setUp(self):
+    self._driver = self.CreateDriver(chrome_switches=['--site-per-process', '--enable-features=FencedFrames:implementation_type/mparch'])
+
+  def testCanSwitchToFencedFrame(self):
+    self._http_server.SetDataForPath('/main.html', bytes("""
+      <!DOCTYPE html>
+        <html>
+          <body>
+            <fencedframe src="/fencedframe.html"></fencedframe>
+          </body>
+        </html>
+      """, 'utf-8'))
+
+    def respondWithFencedFrameContents(request):
+      return {'Supports-Loading-Mode': 'fenced-frame'}, bytes("""
+        <!DOCTYPE html>
+        <html>
+          <body>
+            <button></button>
+          </body>
+        </html>""", 'utf-8')
+    self._http_server.SetCallbackForPath('/fencedframe.html', respondWithFencedFrameContents)
+
+    self._driver.Load(self.GetHttpUrlForFile('/main.html'))
+    self._driver.SetTimeouts({'implicit': 2000})
+    fencedframe = self._driver.FindElement('tag name', 'fencedframe')
+    self._driver.SwitchToFrame(fencedframe)
+    button = self._driver.FindElement('tag name', 'button')
+    self.assertIsNotNone(button)
+
+  def tearDown(self):
+    super(ChromeDriverFencedFrame, self).tearDown()
+    self._http_server.SetDataForPath('/main.html', None)
+    self._http_server.SetCallbackForPath('/fencedframe.html', None)
+
 class ChromeDriverSiteIsolation(ChromeDriverBaseTestWithWebServer):
   """Tests for ChromeDriver with the new Site Isolation Chrome feature.
 
diff --git a/chrome/test/chromedriver/util.cc b/chrome/test/chromedriver/util.cc
index 711269fa..d2de7b9 100644
--- a/chrome/test/chromedriver/util.cc
+++ b/chrome/test/chromedriver/util.cc
@@ -45,7 +45,7 @@
 
 Status FlattenStringArray(const base::ListValue* src, std::u16string* dest) {
   std::u16string keys;
-  for (const base::Value& i : src->GetList()) {
+  for (const base::Value& i : src->GetListDeprecated()) {
     if (!i.is_string())
       return Status(kUnknownError, "keys should be a string");
     std::u16string keys_list_part = base::UTF8ToUTF16(i.GetString());
diff --git a/chrome/test/chromedriver/webauthn_commands.cc b/chrome/test/chromedriver/webauthn_commands.cc
index 0dfe3366..96b6294 100644
--- a/chrome/test/chromedriver/webauthn_commands.cc
+++ b/chrome/test/chromedriver/webauthn_commands.cc
@@ -125,7 +125,7 @@
   if (extensions) {
     if (!extensions->is_list())
       return Status(kInvalidArgument, kExtensionsMustBeList);
-    for (const base::Value& extension : extensions->GetList()) {
+    for (const base::Value& extension : extensions->GetListDeprecated()) {
       if (!extension.is_string())
         return Status(kInvalidArgument, kExtensionsMustBeList);
       const std::string& extension_string = extension.GetString();
@@ -220,7 +220,7 @@
   if (!credentials)
     return Status(kUnknownError, kDevToolsDidNotReturnExpectedValue);
 
-  for (base::Value& credential : credentials->GetList()) {
+  for (base::Value& credential : credentials->GetListDeprecated()) {
     ConvertBase64ToBase64Url(
         &credential, {"credentialId", "privateKey", "userHandle", "largeBlob"});
   }
diff --git a/chrome/test/chromedriver/window_commands.cc b/chrome/test/chromedriver/window_commands.cc
index 267c9a3..9b05024b 100644
--- a/chrome/test/chromedriver/window_commands.cc
+++ b/chrome/test/chromedriver/window_commands.cc
@@ -612,7 +612,7 @@
   }
 
   std::vector<std::string> ranges;
-  for (const base::Value& page_range : page_range_list->GetList()) {
+  for (const base::Value& page_range : page_range_list->GetListDeprecated()) {
     if (page_range.is_int()) {
       if (page_range.GetInt() < 0) {
         return Status(kInvalidArgument,
@@ -1354,7 +1354,7 @@
     return Status(kInvalidArgument, "'actions' must be an array");
 
   std::unique_ptr<base::ListValue> actions_result(new base::ListValue);
-  for (const base::Value& action_item_value : actions->GetList()) {
+  for (const base::Value& action_item_value : actions->GetListDeprecated()) {
     std::unique_ptr<base::DictionaryValue> action(new base::DictionaryValue());
 
     if (!action_item_value.is_dict()) {
@@ -1577,7 +1577,8 @@
 
   // the processed actions
   std::vector<std::vector<std::unique_ptr<base::DictionaryValue>>> actions_list;
-  for (const base::Value& action_sequence : actions_input->GetList()) {
+  for (const base::Value& action_sequence :
+       actions_input->GetListDeprecated()) {
     // process input action sequence
     if (!action_sequence.is_dict())
       return Status(kInvalidArgument, "each argument must be a dictionary");
diff --git a/chrome/test/data/banners/background-color.html b/chrome/test/data/banners/background-color.html
index 887ef48..7425a16 100644
--- a/chrome/test/data/banners/background-color.html
+++ b/chrome/test/data/banners/background-color.html
@@ -5,7 +5,7 @@
     <meta id="background-color" name="background-color" content="blue">
     <script>
       window.onload = () => {
-        navigator.serviceWorker.register('service_worker.js');
+        navigator.serviceWorker.register('service_worker_empty_fetch_handler.js');
       };
     </script>
   </head>
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/background.js b/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/background.js
index 2e18a8c..bbfe806 100644
--- a/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/background.js
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/background.js
@@ -39,6 +39,9 @@
   chrome.test.assertEq(expectedRuleInfo, matchedRule);
 }
 
+// Opaque initiators serialize to "null".
+const kOpaqueInitiator = "null";
+
 var tests = [
   function setup() {
     chrome.declarativeNetRequest.onRuleMatchedDebug.addListener(
@@ -60,7 +63,7 @@
     navigateTab(url, (tab) => {
       const expectedRuleInfo = {
         request: {
-          initiator: getServerURL('a.com'),
+          initiator: mparchEnabled ? kOpaqueInitiator : getServerURL('a.com'),
           method: 'GET',
           frameId: mparchEnabled ? 5 : 4,
           parentFrameId: 0,
@@ -76,7 +79,8 @@
   },
 
   // Makes sure rule 4 for subframes applies and not rule 2 for main frames
-  // or rule 3 for thirdParty domains.
+  // or rule 3 for thirdParty domains. Note for shadowDOM the initiator is
+  // not opaque so the initiator is available and a rule 3 applies.
   function testAllowRule() {
     resetMatchedRules();
 
@@ -87,7 +91,7 @@
     navigateTab(url, (tab) => {
       const expectedRuleInfo = {
         request: {
-          initiator: getServerURL('a.com'),
+          initiator: mparchEnabled ? kOpaqueInitiator : getServerURL('a.com'),
           method: 'GET',
           frameId: mparchEnabled ? 7 : 5,
           parentFrameId: 0,
@@ -95,7 +99,7 @@
           tabId: tab.id,
           url: fencedFrameUrl
         },
-        rule: {ruleId: 4, rulesetId: 'rules'}
+        rule: {ruleId: mparchEnabled ? 4 : 3, rulesetId: 'rules'}
       };
       verifyExpectedRuleInfo(expectedRuleInfo);
       chrome.test.succeed();
diff --git a/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/rules.json b/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/rules.json
index 631a803..56bb5785 100644
--- a/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/rules.json
+++ b/chrome/test/data/extensions/api_test/declarative_net_request/fenced_frames/rules.json
@@ -18,13 +18,13 @@
 {
   "_comment": [
     "Add a rule to block any thirdParty frames with 'allowed'. Since the only",
-    "frame matching 'allowed' is a fenced frame and is considered firstParty",
+    "frame matching 'allowed' is a fenced frame and is considered thirdParty",
     "it shouldn't match this rule."
   ],
   "id" : 3,
   "priority": 2,
   "action": { "type" : "block" },
-  "condition" : { "domainType": "thirdParty", "urlFilter" : "allowed", "resourceTypes" : [ "sub_frame" ] }
+  "condition" : { "domainType": "firstParty", "urlFilter" : "allowed", "resourceTypes" : [ "sub_frame" ] }
 },
 {
   "id" : 4,
diff --git a/chrome/test/data/extensions/api_test/service_worker/worker_based_background/component/background.js b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/component/background.js
new file mode 100644
index 0000000..df09bb1
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/component/background.js
@@ -0,0 +1,16 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+chrome.test.runTests([
+  async function basicTest() {
+    let config = await chrome.test.getConfig();
+    let testUrl =
+        `http://b.com:${config.testServer.port}/extensions/test_file.html`;
+    chrome.tabs.onCreated.addListener((tab) => {
+      if (tab.pendingUrl == testUrl)
+        chrome.test.succeed();
+    });
+    chrome.tabs.create({url: testUrl});
+  }
+]);
diff --git a/chrome/test/data/extensions/api_test/service_worker/worker_based_background/component/manifest.json b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/component/manifest.json
new file mode 100644
index 0000000..37446aec
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/service_worker/worker_based_background/component/manifest.json
@@ -0,0 +1,9 @@
+{
+  // chrome-extension://pkplfbidichfdicaijlchgnapepdginl
+  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDfX9dHNh948bt00YhZBm3P6E5QLaOt+v8kXVtibQfiPtOD2FTScB/f0wX/EQWVO7BkaSOsRkTPcPIgocyMPYr2FLgqGLFlYT9nQpKJZUFNF5oJ5rG6Nv7ppf4zEB3j6da1IBRTz2yOZ+6O1TMZxol/V62/QcqrJeggsHTEPGLdr9Ua4b1Ka0xKJnJngZljsbw93FI1o+P9dAh5BS6wTPiZI/vmJVjvMTkSTnaZ3n9Go2t7A0XLcSxLcVyuLAd2mAvSN0mIviOukdM66wr7llif71nKuUt+4qvlr/r9HfwzN6pA4jkwhtS1UD+3CmB+wsHwsnohNcuu4FIQ6rgq/7QIDAQAB",
+  "name": "Component MV3 extension",
+  "background": { "service_worker": "background.js" },
+  "manifest_version": 3,
+  "version": "1.0",
+  "permissions": ["tabs"]
+}
diff --git a/chrome/test/data/extensions/api_test/web_authentication_proxy/main/test.js b/chrome/test/data/extensions/api_test/web_authentication_proxy/main/test.js
index 09d368f..cca6401 100644
--- a/chrome/test/data/extensions/api_test/web_authentication_proxy/main/test.js
+++ b/chrome/test/data/extensions/api_test/web_authentication_proxy/main/test.js
@@ -21,8 +21,25 @@
   }
 }`;
 
+//  A dummy JSON-encoded PublicKeyCredential for completeGetRequest(). The
+//  credential ID is base64url('test') = 'dGVzdA'.
+const GET_ASSERTION_RESPONSE_JSON = `{
+  "id": "dGVzdA",
+  "rawId": "dGVzdA",
+  "type": "public-key",
+  "authenticatorAttachment": "cross-platform",
+  "response": {
+    "authenticatorData": "YoNLjwSfqzThzqXUg6At1bvcOxxscAyaoCRefuCi6I0BAAAAAA",
+    "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uY3JlYXRlIiwiY2hhbGxlbmdlIjoiZEdWemRBIiwib3JpZ2luIjoiaHR0cHM6Ly9leGFtcGxlLmNvbSIsImNyb3NzT3JpZ2luIjpmYWxzZX0",
+    "signature": "RTAhAoIAbL78xmC6MWDpx8-SN1FlNUXo2VcqwxDeNukhh5diAtpUINntpYqNyzR4JaEmhEBdgnHBv82bW-2LZj1l6CgzKABz",
+    "userHandle": "dXNlcklk"
+  }
+}`;
+
 const TEST_ERROR_MESSAGE = 'test error message';
 
+// completeCreateRequest completes the request with the given request ID
+// using the fake response in `MAKE_CREDENTIAL_RESPONSE_JSON`.
 function completeCreateRequest(requestId, optErrorName) {
   let response = {
     requestId: requestId,
@@ -35,6 +52,20 @@
   return chrome.webAuthenticationProxy.completeCreateRequest(response);
 }
 
+// completeGetRequest completes the request with the given request ID
+// using the fake response in `GET_ASSERTION_RESPONSE_JSON`.
+function completeGetRequest(requestId, optErrorName) {
+  let response = {
+    requestId: requestId,
+  };
+  if (optErrorName) {
+    response.error = {name: optErrorName, message: TEST_ERROR_MESSAGE};
+  } else {
+    response.responseJson = GET_ASSERTION_RESPONSE_JSON;
+  }
+  return chrome.webAuthenticationProxy.completeGetRequest(response);
+}
+
 let availableTests = [
   async function attachDetach() {
     await chrome.webAuthenticationProxy.attach();
@@ -148,13 +179,17 @@
   },
   async function makeCredentialCancel() {
     let canceled = false;
-    chrome.webAuthenticationProxy.onRequestCanceled.addListener(() => {
-      chrome.test.assertFalse(canceled);
-      canceled = true;
-    });
+    let requestId;
+    chrome.webAuthenticationProxy.onRequestCanceled.addListener(
+        (canceledRequestId) => {
+          chrome.test.assertFalse(canceled);
+          canceled = true;
+          chrome.test.assertTrue(canceledRequestId == requestId);
+        });
     chrome.webAuthenticationProxy.onCreateRequest.addListener(
         async (request) => {
           chrome.test.assertFalse(canceled);
+          requestId = request.requestId;
           await chrome.test.sendMessage('request');
           // Browser indicates the request completed, which means the cancel
           // handler should have been invoked.
@@ -170,6 +205,72 @@
     await chrome.webAuthenticationProxy.attach();
     chrome.test.sendMessage('ready');
   },
+  async function getAssertion() {
+    chrome.webAuthenticationProxy.onGetRequest.addListener(async (request) => {
+      await completeGetRequest(request.requestId);
+      chrome.test.assertNoLastError();
+      chrome.test.succeed();
+    });
+    await chrome.webAuthenticationProxy.attach();
+    chrome.test.sendMessage('ready');
+  },
+  async function getAssertionError() {
+    let nextError;
+    chrome.webAuthenticationProxy.onGetRequest.addListener(async (request) => {
+      chrome.test.assertTrue(nextError.length > 0);
+      // The C++ side verifies that the passed in errorName matches the
+      // error that  the WebAuthn client-side JS receives.
+      await completeGetRequest(request.requestId, nextError);
+      chrome.test.assertNoLastError();
+      nextError = await chrome.test.sendMessage('nextError');
+      if (!nextError) {
+        chrome.test.succeed();
+      } else {
+        chrome.test.sendMessage('nextRequest');
+      }
+    });
+    await chrome.webAuthenticationProxy.attach();
+    // The C++ side passes error names to be used in completeGetRequest().
+    nextError = await chrome.test.sendMessage('nextError');
+    chrome.test.sendMessage('nextRequest');
+  },
+  async function getAssertionResolvesOnDetach() {
+    chrome.webAuthenticationProxy.onGetRequest.addListener(async (request) => {
+      await chrome.webAuthenticationProxy.detach();
+      await chrome.test.assertPromiseRejects(
+          completeGetRequest(request.requestId), ERROR_INVALID_SENDER);
+      chrome.test.assertNoLastError();
+      chrome.test.succeed();
+    });
+    await chrome.webAuthenticationProxy.attach();
+    chrome.test.sendMessage('ready');
+  },
+  async function getAssertionCancel() {
+    let canceled = false;
+    let requestId;
+    chrome.webAuthenticationProxy.onRequestCanceled.addListener(
+        (canceledRequestId) => {
+          chrome.test.assertFalse(canceled);
+          canceled = true;
+          chrome.test.assertTrue(canceledRequestId == requestId);
+        });
+    chrome.webAuthenticationProxy.onGetRequest.addListener(async (request) => {
+      chrome.test.assertFalse(canceled);
+      requestId = request.requestId;
+      await chrome.test.sendMessage('request');
+      // Browser indicates the request completed, which means the cancel
+      // handler should have been invoked.
+      chrome.test.assertTrue(canceled);
+
+      // Completing the canceled request should fail.
+      await chrome.test.assertPromiseRejects(
+          completeGetRequest(request.requestId), ERROR_INVALID_REQUEST_ID);
+      chrome.test.assertNoLastError();
+      chrome.test.succeed();
+    });
+    await chrome.webAuthenticationProxy.attach();
+    chrome.test.sendMessage('ready');
+  },
 ];
 
 chrome.test.getConfig((config) => {
diff --git a/chrome/test/data/extensions/api_test/webrequest/test_fenced_frames.js b/chrome/test/data/extensions/api_test/webrequest/test_fenced_frames.js
index 640febc17..318c517 100644
--- a/chrome/test/data/extensions/api_test/webrequest/test_fenced_frames.js
+++ b/chrome/test/data/extensions/api_test/webrequest/test_fenced_frames.js
@@ -28,6 +28,11 @@
   // frame. This allows us to test that the parentFrameId is the iframe
   // and redirection events are dispatched correctly.
   function simpleLoadHttp() {
+    // MPArch assigns an opaque origin as the initiator.
+    // Opaque initiators serialize to "null".
+    var fencedFrameInitiator = mparchEnabled ? "null" :
+        getServerDomain(initiators.WEB_INITIATED);
+
     expect(
       [
         // events
@@ -173,7 +178,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onBeforeSendHeaders-3',
@@ -184,7 +189,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onSendHeaders-3',
@@ -195,7 +200,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onHeadersReceived-3',
@@ -208,7 +213,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onBeforeRedirect-3',
@@ -224,7 +229,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onBeforeRequest-4',
@@ -235,7 +240,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onBeforeSendHeaders-4',
@@ -246,7 +251,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onSendHeaders-4',
@@ -257,7 +262,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onHeadersReceived-4',
@@ -270,7 +275,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onResponseStarted-4',
@@ -285,7 +290,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
         { label: 'onCompleted-4',
@@ -300,7 +305,7 @@
             type: 'sub_frame',
             frameId: 2,
             parentFrameId: 1,
-            initiator: getServerDomain(initiators.WEB_INITIATED),
+            initiator: fencedFrameInitiator,
           }
         },
       ],
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index b63a632..cfb7628d 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -11836,6 +11836,9 @@
   "ReportDeviceCrashReportInfo": {
     "reason_for_missing_test": "Maps into CrosSettings"
   },
+  "ReportDevicePeripherals": {
+    "reason_for_missing_test": "Maps into CrosSettings"
+  },
   "ReportDevicePowerStatus": {
     "reason_for_missing_test": "Maps into CrosSettings"
   },
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index d955b57..cef4db7 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -459,6 +459,9 @@
         "chromeos/personalization_app/personalization_app_controller_browsertest.js",
       ]
     }
+    if (is_win || is_mac || is_linux || is_fuchsia) {
+      sources += [ "app_settings/app_settings_browsertest.js" ]
+    }
     if (is_win || is_mac || is_linux || is_chromeos) {
       sources += [ "discards/discards_browsertest.js" ]
     }
@@ -659,6 +662,11 @@
     ]
   }
 
+  if (is_win || is_mac || is_linux) {
+    deps += [ "app_settings:build_grdp" ]
+    grdp_files += [ "$target_gen_dir/app_settings/resources.grdp" ]
+  }
+
   if (is_chromeos_ash) {
     deps += [ "chromeos/personalization_app:build_grdp" ]
     grdp_files +=
diff --git a/chrome/test/data/webui/app_settings/BUILD.gn b/chrome/test/data/webui/app_settings/BUILD.gn
new file mode 100644
index 0000000..5090821
--- /dev/null
+++ b/chrome/test/data/webui/app_settings/BUILD.gn
@@ -0,0 +1,37 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+assert(is_win || is_mac || is_linux || is_fuchsia)
+
+generate_grd("build_grdp") {
+  grd_prefix = "webui_app_settings"
+  out_grd = "$target_gen_dir/resources.grdp"
+
+  deps = [ ":build_ts" ]
+  manifest_files = [ "$target_gen_dir/tsconfig.manifest" ]
+  resource_path_prefix = "app_settings"
+}
+
+ts_library("build_ts") {
+  root_dir = "."
+  out_dir = "$target_gen_dir/tsc"
+  tsconfig_base = "tsconfig_base.json"
+  path_mappings = [
+    "chrome://app-settings/*|" +
+        rebase_path("$root_gen_dir/chrome/browser/resources/app_settings/tsc/*",
+                    target_gen_dir),
+    "chrome://webui-test/*|" +
+        rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
+                    target_gen_dir),
+  ]
+  in_files = [
+    "app_test.ts",
+    "test_app_management_browser_proxy.ts",
+  ]
+  deps = [ "//chrome/browser/resources/app_settings:build_ts" ]
+  extra_deps = [ "..:generate_definitions" ]
+}
diff --git a/chrome/test/data/webui/app_settings/OWNERS b/chrome/test/data/webui/app_settings/OWNERS
new file mode 100644
index 0000000..00cd55c
--- /dev/null
+++ b/chrome/test/data/webui/app_settings/OWNERS
@@ -0,0 +1 @@
+file://chrome/browser/resources/app_settings/OWNERS
diff --git a/chrome/test/data/webui/app_settings/app_settings_browsertest.js b/chrome/test/data/webui/app_settings/app_settings_browsertest.js
new file mode 100644
index 0000000..bf0a005
--- /dev/null
+++ b/chrome/test/data/webui/app_settings/app_settings_browsertest.js
@@ -0,0 +1,37 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/** @fileoverview Test suite for the WebUI app settings. */
+
+GEN_INCLUDE(['//chrome/test/data/webui/polymer_browser_test_base.js']);
+GEN('#include "content/public/test/browser_test.h"');
+GEN('#include "chrome/common/chrome_features.h"');
+GEN('#include "chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.h"');
+
+/* eslint-disable no-var */
+
+class AppSettingsBrowserTest extends PolymerTest {
+  get browsePreload() {
+    throw 'this is abstract and should be overriden by subclasses';
+  }
+
+  testGenPreamble() {
+    GEN('WebAppSettingsNavigationThrottle::DisableForTesting();');
+  }
+
+  get featureList() {
+    return {enabled: ['features::kDesktopPWAsWebAppSettingsPage']};
+  }
+}
+
+var AppSettingsAppTest = class extends AppSettingsBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://app-settings/test_loader.html?module=app_settings/app_test.js&host=webui-test';
+  }
+};
+
+TEST_F('AppSettingsAppTest', 'All', function() {
+  mocha.run();
+});
diff --git a/chrome/test/data/webui/app_settings/app_test.ts b/chrome/test/data/webui/app_settings/app_test.ts
new file mode 100644
index 0000000..1058e7d
--- /dev/null
+++ b/chrome/test/data/webui/app_settings/app_test.ts
@@ -0,0 +1,51 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://webui-test/mojo_webui_test_support.js';
+import 'chrome://app-settings/web_app_settings.js';
+
+import {WebAppSettingsAppElement} from 'chrome://app-settings/web_app_settings.js';
+import {App} from 'chrome://resources/cr_components/app_management/app_management.mojom-webui.js';
+import {BrowserProxy} from 'chrome://resources/cr_components/app_management/browser_proxy.js';
+import {AppType, InstallReason, OptionalBool, WindowMode} from 'chrome://resources/cr_components/app_management/types.mojom-webui.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
+
+import {TestAppManagementBrowserProxy} from './test_app_management_browser_proxy.js';
+
+suite('AppSettingsAppTest', () => {
+  setup(async () => {
+    const app: App = {
+      id: 'test_loader.html',
+      type: AppType.kWeb,
+      title: 'App Title',
+      description: '',
+      version: '5.1',
+      size: '9.0MB',
+      isPinned: OptionalBool.kFalse,
+      isPolicyPinned: OptionalBool.kFalse,
+      installReason: InstallReason.kUser,
+      permissions: {},
+      hideMoreSettings: false,
+      hidePinToShelf: false,
+      isPreferredApp: false,
+      windowMode: WindowMode.kWindow,
+      resizeLocked: false,
+      hideResizeLocked: true,
+      supportedLinks: [],
+    };
+
+    const testProxy = new TestAppManagementBrowserProxy();
+    BrowserProxy.setInstance(testProxy);
+
+    testProxy.fakeHandler.setApp(app);
+
+    document.body.innerHTML = '';
+    const appSettingsApp: WebAppSettingsAppElement =
+        document.createElement('web-app-settings-app');
+    document.body.appendChild(appSettingsApp);
+    await waitAfterNextRender(appSettingsApp);
+  });
+
+  test('sanity check', function() {});
+});
diff --git a/chrome/test/data/webui/app_settings/test_app_management_browser_proxy.ts b/chrome/test/data/webui/app_settings/test_app_management_browser_proxy.ts
new file mode 100644
index 0000000..b4ac886
--- /dev/null
+++ b/chrome/test/data/webui/app_settings/test_app_management_browser_proxy.ts
@@ -0,0 +1,62 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {App, PageCallbackRouter, PageHandlerInterface, PageRemote} from 'chrome://resources/cr_components/app_management/app_management.mojom-webui.js';
+import {BrowserProxy} from 'chrome://resources/cr_components/app_management/browser_proxy.js';
+import {OptionalBool, Permission, WindowMode} from 'chrome://resources/cr_components/app_management/types.mojom-webui.js';
+
+export class FakePageHandler implements PageHandlerInterface {
+  private app: App|null = null;
+
+  setApp(app: App) {
+    this.app = app;
+  }
+
+  getApps() {
+    return Promise.resolve({apps: []});
+  }
+
+  getApp(_appId: string) {
+    return Promise.resolve({app: this.app});
+  }
+
+  getExtensionAppPermissionMessages(_appId: string) {
+    return Promise.resolve({messages: []});
+  }
+
+  setPinned(_appId: string, _pinned: OptionalBool) {}
+
+  setPermission(_appId: string, _permission: Permission) {}
+
+  setResizeLocked(_appId: string, _locked: boolean) {}
+
+  uninstall(_appId: string) {}
+
+  openNativeSettings(_appId: string) {}
+
+  setPreferredApp(_appId: string, _isPreferredApp: boolean) {}
+
+  getOverlappingPreferredApps(_appId: string) {
+    return Promise.resolve({appIds: []});
+  }
+
+  setWindowMode(_appId: string, _windowMode: WindowMode) {}
+}
+
+export class TestAppManagementBrowserProxy implements BrowserProxy {
+  callbackRouter: PageCallbackRouter;
+  callbackRouterRemote: PageRemote;
+  handler: PageHandlerInterface;
+  fakeHandler: FakePageHandler;
+
+  constructor() {
+    this.callbackRouter = new PageCallbackRouter();
+
+    this.callbackRouterRemote =
+        this.callbackRouter.$.bindNewPipeAndPassRemote();
+
+    this.fakeHandler = new FakePageHandler();
+    this.handler = this.fakeHandler;
+  }
+}
diff --git a/chrome/test/data/webui/app_settings/tsconfig_base.json b/chrome/test/data/webui/app_settings/tsconfig_base.json
new file mode 100644
index 0000000..371e43b
--- /dev/null
+++ b/chrome/test/data/webui/app_settings/tsconfig_base.json
@@ -0,0 +1,8 @@
+{
+  "extends": "../../../../../tools/typescript/tsconfig_base.json",
+  "compilerOptions": {
+    "typeRoots": [
+       "./../../../../../third_party/node/node_modules/@types"
+    ]
+  }
+}
diff --git a/chrome/test/data/webui/async_gen.cc b/chrome/test/data/webui/async_gen.cc
index f3f84cd..8056683 100644
--- a/chrome/test/data/webui/async_gen.cc
+++ b/chrome/test/data/webui/async_gen.cc
@@ -21,7 +21,7 @@
 
 void WebUIBrowserAsyncGenTest::AsyncWebUIMessageHandler::HandleCallJS(
     const base::ListValue* list_value) {
-  base::Value::ConstListView list_view = list_value->GetList();
+  base::Value::ConstListView list_view = list_value->GetListDeprecated();
   ASSERT_TRUE(0u < list_view.size() && list_view[0].is_string());
   std::string call_js = list_view[0].GetString();
   web_ui()->CallJavascriptFunctionUnsafe(call_js);
diff --git a/chrome/test/data/webui/chromeos/firmware_update/firmware_update_dialog_test.js b/chrome/test/data/webui/chromeos/firmware_update/firmware_update_dialog_test.js
index 964abfd7..38e4785 100644
--- a/chrome/test/data/webui/chromeos/firmware_update/firmware_update_dialog_test.js
+++ b/chrome/test/data/webui/chromeos/firmware_update/firmware_update_dialog_test.js
@@ -47,6 +47,14 @@
     return flushTasks();
   }
 
+  /**
+   * @suppress {visibility}
+   * @param {boolean} inflight
+   */
+  function setIsInitiallyInflight(inflight) {
+    updateDialogElement.isInitiallyInflight_ = inflight;
+  }
+
   test('DialogStateUpdatesCorrectly', async () => {
     // Start update.
     await setInstallationProgress(1, UpdateState.kUpdating);
@@ -158,4 +166,22 @@
     assertFalse(
         !!updateDialogElement.shadowRoot.querySelector('#updateProgressBar'));
   });
+
+  test('ProgressBarAppears', async () => {
+    // Simulate update inflight, but restarting. Idle state during inflight
+    // is equivalent as a restart phase.
+    setIsInitiallyInflight(/*inflight=*/ true);
+    await flushTasks();
+    await setInstallationProgress(0, UpdateState.kIdle);
+    assertTrue(
+        updateDialogElement.shadowRoot.querySelector('#updateDialog').open);
+    assertTrue(!!updateDialogElement.shadowRoot.querySelector(
+        '#indeterminateProgressBar'));
+
+    // Set inflight to false, expect no progress bar.
+    setIsInitiallyInflight(/*inflight=*/ false);
+    await flushTasks();
+    assertFalse(!!updateDialogElement.shadowRoot.querySelector(
+        '#indeterminateProgressBar'));
+  });
 }
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/BUILD.gn b/chrome/test/data/webui/cr_components/chromeos/bluetooth/BUILD.gn
index d1989438..7c4437d 100644
--- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/BUILD.gn
+++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/BUILD.gn
@@ -14,6 +14,7 @@
                   ]
   deps = [
     ":bluetooth_base_page_test",
+    ":bluetooth_battery_icon_percentage_tests",
     ":bluetooth_device_battery_info_tests",
     ":bluetooth_icon_test",
     ":bluetooth_pairing_confirm_code_page_test",
@@ -56,6 +57,14 @@
   externs_list = [ "$externs_path/mocha-2.5.js" ]
 }
 
+js_library("bluetooth_battery_icon_percentage_tests") {
+  deps = [
+    "../../..:chai_assert",
+    "//ui/webui/resources/cr_components/chromeos/bluetooth:bluetooth_battery_icon_percentage",
+  ]
+  externs_list = [ "$externs_path/mocha-2.5.js" ]
+}
+
 js_library("bluetooth_device_battery_info_tests") {
   deps = [
     "../../..:chai_assert",
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage_tests.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage_tests.js
new file mode 100644
index 0000000..cfa6f85
--- /dev/null
+++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage_tests.js
@@ -0,0 +1,261 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// clang-format off
+import 'chrome://bluetooth-pairing/strings.m.js';
+
+import {BluetoothBatteryIconPercentageElement} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js';
+import {BatteryType} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_types.js';
+import {flush, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {assertEquals, assertFalse, assertTrue} from '../../../chai_assert.js';
+
+import {createDefaultBluetoothDevice} from './fake_bluetooth_config.js';
+
+// clang-format on
+
+suite('CrComponentsBluetoothBatteryIconPercentageTest', function() {
+  /** @type {?BluetoothBatteryIconPercentageElement} */
+  let bluetoothBatteryIconPercentage;
+
+  setup(function() {
+    bluetoothBatteryIconPercentage = /**
+                            @type {?BluetoothBatteryIconPercentageElement}
+                            */
+        (document.createElement('bluetooth-battery-icon-percentage'));
+    document.body.appendChild(bluetoothBatteryIconPercentage);
+    flush();
+  });
+
+  function flushAsync() {
+    flush();
+    return new Promise(resolve => setTimeout(resolve));
+  }
+
+  /**
+   * @param {BatteryType} batteryType
+   * @param {number} batteryPercentage
+   */
+  async function setBatteryTypePercentage(batteryType, batteryPercentage) {
+    bluetoothBatteryIconPercentage.device.batteryInfo = {};
+    if (batteryType === BatteryType.DEFAULT) {
+      bluetoothBatteryIconPercentage.device.batteryInfo.defaultProperties = {
+        batteryPercentage: batteryPercentage
+      };
+    } else if (batteryType === BatteryType.LEFT_BUD) {
+      bluetoothBatteryIconPercentage.device.batteryInfo.leftBudInfo = {
+        batteryPercentage: batteryPercentage
+      };
+    } else if (batteryType === BatteryType.CASE) {
+      bluetoothBatteryIconPercentage.device.batteryInfo.caseInfo = {
+        batteryPercentage: batteryPercentage
+      };
+    } else if (batteryType === BatteryType.RIGHT_BUD) {
+      bluetoothBatteryIconPercentage.device.batteryInfo.rightBudInfo = {
+        batteryPercentage: batteryPercentage
+      };
+    }
+    bluetoothBatteryIconPercentage.batteryType = batteryType;
+    bluetoothBatteryIconPercentage.device =
+        /**
+         * @type {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
+         */
+        (Object.assign({}, bluetoothBatteryIconPercentage.device));
+    return flushAsync();
+  }
+
+  /**
+   * @param {number} batteryPercentage
+   * @param {boolean} isLowBattery
+   * @param {string} batteryIconRange
+   * @param {BatteryType} batteryType
+   */
+  function assertBatteryUIState(
+      batteryPercentage, isLowBattery, batteryIconRange, batteryType) {
+    let percentageText = '';
+    switch (batteryType) {
+      case BatteryType.LEFT_BUD:
+        percentageText =
+            'bluetoothPairedDeviceItemLeftBudTrueWirelessBatteryPercentage';
+        break;
+      case BatteryType.CASE:
+        percentageText =
+            'bluetoothPairedDeviceItemCaseTrueWirelessBatteryPercentage';
+        break;
+      case BatteryType.RIGHT_BUD:
+        percentageText =
+            'bluetoothPairedDeviceItemRightBudTrueWirelessBatteryPercentage';
+        break;
+      case BatteryType.DEFAULT:
+      default:
+        percentageText = 'bluetoothPairedDeviceItemBatteryPercentage';
+    }
+    assertEquals(
+        bluetoothBatteryIconPercentage.i18n(percentageText, batteryPercentage),
+        bluetoothBatteryIconPercentage.shadowRoot
+            .querySelector('#batteryPercentage')
+            .innerText.trim());
+    assertEquals(
+        isLowBattery, bluetoothBatteryIconPercentage.getIsLowBatteryForTest());
+    assertTrue(!!bluetoothBatteryIconPercentage.shadowRoot.querySelector(
+        '#batteryIcon'));
+    assertEquals(
+        'bluetooth:battery-' + batteryIconRange,
+        bluetoothBatteryIconPercentage.shadowRoot.querySelector('#batteryIcon')
+            .icon);
+  }
+
+  test('Battery text, icon and color', async function() {
+    const device = createDefaultBluetoothDevice(
+        /* id= */ '123456789', /* publicName= */ 'BeatsX',
+        /* connectionState= */
+        chromeos.bluetoothConfig.mojom.DeviceConnectionState.kConnected);
+    bluetoothBatteryIconPercentage.device = device.deviceProperties;
+
+    // Lower bound edge case.
+    let batteryPercentage = 0;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage, /* isLowBattery= */ true,
+        /* batteryIconRange= */ '0-7',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    batteryPercentage = 3;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ true,
+        /* batteryIconRange= */ '0-7',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    // Maximum 'low battery' percentage.
+    batteryPercentage = 24;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ true,
+        /* batteryIconRange= */ '22-28',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    // Minimum non-'low battery' percentage.
+    batteryPercentage = 25;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '22-28',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    batteryPercentage = 94;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    // Upper bound edge case.
+    batteryPercentage = 100;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    // Broken cases where the battery doesn't show.
+    batteryPercentage = 110;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertEquals(
+        '',
+        bluetoothBatteryIconPercentage.shadowRoot
+            .querySelector('#batteryPercentage')
+            .innerText.trim());
+    assertEquals(
+        '',
+        bluetoothBatteryIconPercentage.shadowRoot.querySelector('#batteryIcon')
+            .icon);
+    batteryPercentage = -5;
+    await setBatteryTypePercentage(BatteryType.DEFAULT, batteryPercentage);
+    assertEquals(
+        '',
+        bluetoothBatteryIconPercentage.shadowRoot
+            .querySelector('#batteryPercentage')
+            .innerText.trim());
+    assertEquals(
+        '',
+        bluetoothBatteryIconPercentage.shadowRoot.querySelector('#batteryIcon')
+            .icon);
+  });
+
+  test('Custom percentage text when type labeled true', async function() {
+    const device = createDefaultBluetoothDevice(
+        /* id= */ '123456789', /* publicName= */ 'BeatsX',
+        /* connectionState= */
+        chromeos.bluetoothConfig.mojom.DeviceConnectionState.kConnected);
+    bluetoothBatteryIconPercentage.device = device.deviceProperties;
+    bluetoothBatteryIconPercentage.isTypeLabeled = true;
+
+    let batteryPercentage = 100;
+
+    // Left bud percentage text
+    await setBatteryTypePercentage(BatteryType.LEFT_BUD, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.LEFT_BUD);
+
+    // Case percentage text
+    await setBatteryTypePercentage(BatteryType.CASE, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.CASE);
+
+    // Right bud percentage text
+    await setBatteryTypePercentage(BatteryType.RIGHT_BUD, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.RIGHT_BUD);
+  });
+
+  test('Default percentage text when type labeled false', async function() {
+    const device = createDefaultBluetoothDevice(
+        /* id= */ '123456789', /* publicName= */ 'BeatsX',
+        /* connectionState= */
+        chromeos.bluetoothConfig.mojom.DeviceConnectionState.kConnected);
+    bluetoothBatteryIconPercentage.device = device.deviceProperties;
+    bluetoothBatteryIconPercentage.isTypeLabeled = false;
+
+    let batteryPercentage = 100;
+
+    // Left bud with default percentage text
+    await setBatteryTypePercentage(BatteryType.LEFT_BUD, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    // Case with default percentage text
+    await setBatteryTypePercentage(BatteryType.CASE, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.DEFAULT);
+
+    // Right bud with default percentage text
+    await setBatteryTypePercentage(BatteryType.RIGHT_BUD, batteryPercentage);
+    assertBatteryUIState(
+        batteryPercentage,
+        /* isLowBattery= */ false,
+        /* batteryIconRange= */ '93-100',
+        /* batteryType= */ BatteryType.DEFAULT);
+  });
+});
diff --git a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_device_battery_info_tests.js b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_device_battery_info_tests.js
index 1ae24fd..8491220 100644
--- a/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_device_battery_info_tests.js
+++ b/chrome/test/data/webui/cr_components/chromeos/bluetooth/bluetooth_device_battery_info_tests.js
@@ -64,252 +64,75 @@
     return flushAsync();
   }
 
-  /**
-   * @param {number} batteryPercentage
-   * @param {boolean} isLowBattery
-   * @param {string} batteryIconRange
-   */
-  function assertDefaultBatteryUIState(
-      batteryPercentage, isLowBattery, batteryIconRange) {
+  function assertDefaultBatteryUIState() {
     assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#defaultBatteryPercentage'));
+        '#defaultBattery'));
     assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#leftBudBatteryPercentage'));
+        '#leftBudBattery'));
+    assertFalse(
+        !!bluetoothDeviceBatteryInfo.shadowRoot.querySelector('#caseBattery'));
     assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#caseBatteryPercentage'));
-    assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#rightBudBatteryPercentage'));
-    assertEquals(
-        bluetoothDeviceBatteryInfo.i18n(
-            'bluetoothPairedDeviceItemBatteryPercentage', batteryPercentage),
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#defaultBatteryPercentage')
-            .innerText.trim());
-    assertEquals(
-        isLowBattery, bluetoothDeviceBatteryInfo.getIsLowBatteryForTest());
-    assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#defaultBatteryIcon'));
-    assertEquals(
-        'bluetooth:battery-' + batteryIconRange,
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#defaultBatteryIcon')
-            .icon);
+        '#rightBudBattery'));
   }
 
-  /**
-   * @param {number} batteryPercentage
-   * @param {boolean} isLowBattery
-   * @param {string} batteryIconRange
-   */
-  function assertMultipleBatteryUIState(
-      batteryPercentage, isLowBattery, batteryIconRange) {
+  function assertMultipleBatteryUIState() {
     assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#defaultBatteryPercentage'));
+        '#defaultBattery'));
     assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#leftBudBatteryPercentage'));
-    assertEquals(
-        bluetoothDeviceBatteryInfo.i18n(
-            'bluetoothPairedDeviceItemLeftBudTrueWirelessBatteryPercentage',
-            batteryPercentage),
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#leftBudBatteryPercentage')
-            .innerText.trim());
-    assertEquals(
-        isLowBattery,
-        bluetoothDeviceBatteryInfo.getIsLeftBudLowBatteryForTest());
+        '#leftBudBattery'));
+    assertTrue(
+        !!bluetoothDeviceBatteryInfo.shadowRoot.querySelector('#caseBattery'));
     assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#leftBudBatteryIcon'));
-    assertEquals(
-        'bluetooth:battery-' + batteryIconRange,
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#leftBudBatteryIcon')
-            .icon);
-
-    assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#caseBatteryPercentage'));
-    assertEquals(
-        bluetoothDeviceBatteryInfo.i18n(
-            'bluetoothPairedDeviceItemCaseTrueWirelessBatteryPercentage',
-            batteryPercentage),
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#caseBatteryPercentage')
-            .innerText.trim());
-    assertEquals(
-        isLowBattery, bluetoothDeviceBatteryInfo.getIsCaseLowBatteryForTest());
-    assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#caseBatteryIcon'));
-    assertEquals(
-        'bluetooth:battery-' + batteryIconRange,
-        bluetoothDeviceBatteryInfo.shadowRoot.querySelector('#caseBatteryIcon')
-            .icon);
-
-    assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#rightBudBatteryPercentage'));
-    assertEquals(
-        bluetoothDeviceBatteryInfo.i18n(
-            'bluetoothPairedDeviceItemRightBudTrueWirelessBatteryPercentage',
-            batteryPercentage),
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#rightBudBatteryPercentage')
-            .innerText.trim());
-    assertEquals(
-        isLowBattery,
-        bluetoothDeviceBatteryInfo.getIsRightBudLowBatteryForTest());
-    assertTrue(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#rightBudBatteryIcon'));
-    assertEquals(
-        'bluetooth:battery-' + batteryIconRange,
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#rightBudBatteryIcon')
-            .icon);
+        '#rightBudBattery'));
   }
 
-  test('Battery text, icon and color', async function() {
+  test('Default battery state', async function() {
     const device = createDefaultBluetoothDevice(
         /*id=*/ '123456789', /*publicName=*/ 'BeatsX',
         /*connectionState=*/
         chromeos.bluetoothConfig.mojom.DeviceConnectionState.kConnected);
     bluetoothDeviceBatteryInfo.device = device.deviceProperties;
 
-    // Lower bound edge case.
     let batteryPercentage = 0;
     await setDefaultBatteryPercentage(batteryPercentage);
-    assertDefaultBatteryUIState(
-        batteryPercentage, /*isLowBattery=*/ true, /*batteryIconRange=*/ '0-7');
+    assertDefaultBatteryUIState();
 
-    batteryPercentage = 3;
-    await setDefaultBatteryPercentage(batteryPercentage);
-    assertDefaultBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ true,
-        /*batteryIconRange=*/ '0-7');
-
-    // Maximum 'low battery' percentage.
-    batteryPercentage = 24;
-    await setDefaultBatteryPercentage(batteryPercentage);
-    assertDefaultBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ true,
-        /*batteryIconRange=*/ '22-28');
-
-    // Minimum non-'low battery' percentage.
-    batteryPercentage = 25;
-    await setDefaultBatteryPercentage(batteryPercentage);
-    assertDefaultBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ false,
-        /*batteryIconRange=*/ '22-28');
-
-    batteryPercentage = 94;
-    await setDefaultBatteryPercentage(batteryPercentage);
-    assertDefaultBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ false,
-        /*batteryIconRange=*/ '93-100');
-
-    // Upper bound edge case.
     batteryPercentage = 100;
     await setDefaultBatteryPercentage(batteryPercentage);
-    assertDefaultBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ false,
-        /*batteryIconRange=*/ '93-100');
+    assertDefaultBatteryUIState();
 
-    // Broken cases where the battery doesn't show.
-    batteryPercentage = 110;
+    // We don't handle illegal battery percentages in this component.
+    batteryPercentage = 105;
     await setDefaultBatteryPercentage(batteryPercentage);
-    assertEquals(
-        '',
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#defaultBatteryPercentage')
-            .innerText.trim());
-    assertEquals(
-        '',
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#defaultBatteryIcon')
-            .icon);
-    batteryPercentage = -5;
+    assertDefaultBatteryUIState();
+
+    batteryPercentage = -1;
     await setDefaultBatteryPercentage(batteryPercentage);
-    assertEquals(
-        '',
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#defaultBatteryPercentage')
-            .innerText.trim());
-    assertEquals(
-        '',
-        bluetoothDeviceBatteryInfo.shadowRoot
-            .querySelector('#defaultBatteryIcon')
-            .icon);
+    assertDefaultBatteryUIState();
   });
 
-  test('Battery text, icon and color multiple batteries', async function() {
+  test('Multiple battery state', async function() {
     const device = createDefaultBluetoothDevice(
         /*id=*/ '123456789', /*publicName=*/ 'BeatsX',
         /*connectionState=*/
         chromeos.bluetoothConfig.mojom.DeviceConnectionState.kConnected);
     bluetoothDeviceBatteryInfo.device = device.deviceProperties;
 
-    // Lower bound edge case.
     let batteryPercentage = 0;
     await setMultipleBatteryPercentage(batteryPercentage);
-    assertMultipleBatteryUIState(
-        batteryPercentage, /*isLowBattery=*/ true, /*batteryIconRange=*/ '0-7');
+    assertMultipleBatteryUIState();
 
-    batteryPercentage = 3;
-    await setMultipleBatteryPercentage(batteryPercentage);
-    assertMultipleBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ true,
-        /*batteryIconRange=*/ '0-7');
-
-    // Maximum 'low battery' percentage.
-    batteryPercentage = 24;
-    await setMultipleBatteryPercentage(batteryPercentage);
-    assertMultipleBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ true,
-        /*batteryIconRange=*/ '22-28');
-
-    // Minimum non-'low battery' percentage.
-    batteryPercentage = 25;
-    await setMultipleBatteryPercentage(batteryPercentage);
-    assertMultipleBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ false,
-        /*batteryIconRange=*/ '22-28');
-
-    batteryPercentage = 94;
-    await setMultipleBatteryPercentage(batteryPercentage);
-    assertMultipleBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ false,
-        /*batteryIconRange=*/ '93-100');
-
-    // Upper bound edge case.
     batteryPercentage = 100;
     await setMultipleBatteryPercentage(batteryPercentage);
-    assertMultipleBatteryUIState(
-        batteryPercentage,
-        /*isLowBattery=*/ false,
-        /*batteryIconRange=*/ '93-100');
+    assertMultipleBatteryUIState();
 
-    // Broken cases where the battery doesn't show.
-    batteryPercentage = 110;
+    // Revert to default UI in case of illegal battery percentage.
+    batteryPercentage = 105;
     await setMultipleBatteryPercentage(batteryPercentage);
-    assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#leftBudBatteryPercentage'));
-    assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#caseBatteryPercentage'));
-    assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#rightBudBatteryPercentage'));
+    assertDefaultBatteryUIState();
 
-    batteryPercentage = -5;
+    batteryPercentage = -1;
     await setMultipleBatteryPercentage(batteryPercentage);
-    assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#leftBudBatteryPercentage'));
-    assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#caseBatteryPercentage'));
-    assertFalse(!!bluetoothDeviceBatteryInfo.shadowRoot.querySelector(
-        '#rightBudBatteryPercentage'));
+    assertDefaultBatteryUIState();
   });
 });
diff --git a/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js b/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js
index b4d936a..d7daac3 100644
--- a/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js
+++ b/chrome/test/data/webui/cr_components/chromeos/cr_components_chromeos_v3_browsertest.js
@@ -14,6 +14,10 @@
 [
   ['BasePage', 'bluetooth/bluetooth_base_page_test.js'],
   ['BluetoothIcon', 'bluetooth/bluetooth_icon_test.js'],
+  [
+    'BatteryIconPercentage',
+    'bluetooth/bluetooth_battery_icon_percentage_tests.js'
+  ],
   ['DeviceBatteryInfo', 'bluetooth/bluetooth_device_battery_info_tests.js'],
   [
     'DeviceSelectionPage',
diff --git a/chrome/test/data/webui/history/BUILD.gn b/chrome/test/data/webui/history/BUILD.gn
index 9d4d813..c89355f3 100644
--- a/chrome/test/data/webui/history/BUILD.gn
+++ b/chrome/test/data/webui/history/BUILD.gn
@@ -24,8 +24,8 @@
   "history_toolbar_test.js",
   "link_click_test.js",
   "searched_label_test.js",
-  "test_browser_service.js",
-  "test_util.js",
+  "test_browser_service.ts",
+  "test_util.ts",
 ]
 
 generate_grd("build_grdp") {
diff --git a/chrome/test/data/webui/history/history_drawer_test.js b/chrome/test/data/webui/history/history_drawer_test.js
index 8342b095..cd3982b 100644
--- a/chrome/test/data/webui/history/history_drawer_test.js
+++ b/chrome/test/data/webui/history/history_drawer_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {TestBrowserService} from './test_browser_service.js';
@@ -13,7 +13,7 @@
   setup(function() {
     document.body.innerHTML = '';
     const testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
     app = document.createElement('history-app');
     document.body.appendChild(app);
     return Promise.all([
diff --git a/chrome/test/data/webui/history/history_item_focus_test.js b/chrome/test/data/webui/history/history_item_focus_test.js
index 2f54c24..74150c62 100644
--- a/chrome/test/data/webui/history/history_item_focus_test.js
+++ b/chrome/test/data/webui/history/history_item_focus_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService} from 'chrome://history/history.js';
+import {BrowserServiceImpl} from 'chrome://history/history.js';
 import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {TestBrowserService} from './test_browser_service.js';
@@ -13,7 +13,7 @@
 
   setup(function() {
     document.body.innerHTML = '';
-    BrowserService.setInstance(new TestBrowserService());
+    BrowserServiceImpl.setInstance(new TestBrowserService());
 
     item = document.createElement('history-item');
     item.item = createHistoryEntry('2016-03-16 10:00', 'http://www.google.com');
diff --git a/chrome/test/data/webui/history/history_item_test.js b/chrome/test/data/webui/history/history_item_test.js
index 5360b18..e710b13 100644
--- a/chrome/test/data/webui/history/history_item_test.js
+++ b/chrome/test/data/webui/history/history_item_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
@@ -29,7 +29,7 @@
 
   setup(function() {
     document.body.innerHTML = '';
-    BrowserService.setInstance(new TestBrowserService());
+    BrowserServiceImpl.setInstance(new TestBrowserService());
 
     item = document.createElement('history-item');
     item.item = TEST_HISTORY_RESULTS[0];
@@ -73,7 +73,7 @@
   setup(function() {
     document.body.innerHTML = '';
     const testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
 
     const app = document.createElement('history-app');
     document.body.appendChild(app);
diff --git a/chrome/test/data/webui/history/history_list_focus_test.js b/chrome/test/data/webui/history/history_list_focus_test.js
index 47570e3..2b20892 100644
--- a/chrome/test/data/webui/history/history_list_focus_test.js
+++ b/chrome/test/data/webui/history/history_list_focus_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {isMac} from 'chrome://resources/js/cr.m.js';
 import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -27,7 +27,7 @@
     window.history.replaceState({}, '', '/');
     document.body.innerHTML = '';
     testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
     testService.setQueryResult({
       info: createHistoryInfo(),
       value: TEST_HISTORY_RESULTS,
diff --git a/chrome/test/data/webui/history/history_list_test.js b/chrome/test/data/webui/history/history_list_test.js
index d24e3a9..600288a 100644
--- a/chrome/test/data/webui/history/history_list_test.js
+++ b/chrome/test/data/webui/history/history_list_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {isMac, webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
@@ -70,7 +70,7 @@
     window.history.replaceState({}, '', '/');
     document.body.innerHTML = '';
     testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
 
     app = document.createElement('history-app');
   });
@@ -123,7 +123,7 @@
         .then(function(visits) {
           assertEquals(1, visits.length);
           assertEquals('http://example.com', visits[0].url);
-          assertEquals('2015-01-01 UTC', visits[0].timestamps[0]);
+          assertEquals(Date.parse('2015-01-01 UTC'), visits[0].timestamps[0]);
 
           // The list should fire a query-history event which results in a
           // queryHistory call, since deleting the only item results in an
@@ -728,8 +728,10 @@
         .then(function(toRemove) {
           assertEquals('https://www.example.com', toRemove[0].url);
           assertEquals('https://www.google.com', toRemove[1].url);
-          assertEquals('2016-03-14 10:00 UTC', toRemove[0].timestamps[0]);
-          assertEquals('2016-03-14 9:00 UTC', toRemove[1].timestamps[0]);
+          assertEquals(
+              Date.parse('2016-03-14 10:00 UTC'), toRemove[0].timestamps[0]);
+          assertEquals(
+              Date.parse('2016-03-14 9:00 UTC'), toRemove[1].timestamps[0]);
         });
   });
 
diff --git a/chrome/test/data/webui/history/history_metrics_test.js b/chrome/test/data/webui/history/history_metrics_test.js
index b808197..de9eba46 100644
--- a/chrome/test/data/webui/history/history_metrics_test.js
+++ b/chrome/test/data/webui/history/history_metrics_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded, HistoryPageViewHistogram, SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded, HistoryPageViewHistogram, SYNCED_TABS_HISTOGRAM_NAME, SyncedTabsHistogram} from 'chrome://history/history.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
@@ -23,8 +23,8 @@
   setup(async () => {
     document.body.innerHTML = '';
 
-    BrowserService.setInstance(new TestBrowserService());
-    testService = BrowserService.getInstance();
+    BrowserServiceImpl.setInstance(new TestBrowserService());
+    testService = BrowserServiceImpl.getInstance();
 
     actionMap = testService.actionMap;
     histogramMap = testService.histogramMap;
diff --git a/chrome/test/data/webui/history/history_overflow_menu_test.js b/chrome/test/data/webui/history/history_overflow_menu_test.js
index 20545e7..5ca82948 100644
--- a/chrome/test/data/webui/history/history_overflow_menu_test.js
+++ b/chrome/test/data/webui/history/history_overflow_menu_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {TestBrowserService} from './test_browser_service.js';
 
 suite('#overflow-menu', function() {
@@ -15,7 +15,7 @@
   setup(function() {
     document.body.innerHTML = '';
     const testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
 
     const app = document.createElement('history-app');
     document.body.appendChild(app);
diff --git a/chrome/test/data/webui/history/history_routing_test.js b/chrome/test/data/webui/history/history_routing_test.js
index 80cc6be..a3fe0b2 100644
--- a/chrome/test/data/webui/history/history_routing_test.js
+++ b/chrome/test/data/webui/history/history_routing_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserProxyImpl, BrowserService, MetricsProxyImpl} from 'chrome://history/history.js';
+import {BrowserProxyImpl, BrowserServiceImpl, MetricsProxyImpl} from 'chrome://history/history.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
@@ -37,7 +37,7 @@
     setup(function() {
       window.history.replaceState({}, '', '/');
       document.body.innerHTML = '';
-      BrowserService.setInstance(new TestBrowserService());
+      BrowserServiceImpl.setInstance(new TestBrowserService());
       BrowserProxyImpl.setInstance(new TestBrowserProxy());
       MetricsProxyImpl.setInstance(new TestMetricsProxy());
       app = document.createElement('history-app');
diff --git a/chrome/test/data/webui/history/history_routing_with_query_param_test.js b/chrome/test/data/webui/history/history_routing_with_query_param_test.js
index 9b89b6d3..625a52f 100644
--- a/chrome/test/data/webui/history/history_routing_with_query_param_test.js
+++ b/chrome/test/data/webui/history/history_routing_with_query_param_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService} from 'chrome://history/history.js';
+import {BrowserServiceImpl} from 'chrome://history/history.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {TestBrowserService} from './test_browser_service.js';
@@ -18,7 +18,7 @@
     document.body.innerHTML = '';
     window.history.replaceState({}, '', '/?q=query');
     testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
     // Ignore the initial empty query so that we can correctly check the
     // search term for the second call to queryHistory().
     testService.ignoreNextQuery();
diff --git a/chrome/test/data/webui/history/history_supervised_user_test.js b/chrome/test/data/webui/history/history_supervised_user_test.js
index 1894ece..c0900ed 100644
--- a/chrome/test/data/webui/history/history_supervised_user_test.js
+++ b/chrome/test/data/webui/history/history_supervised_user_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {TestBrowserService} from './test_browser_service.js';
@@ -19,7 +19,7 @@
   setup(function() {
     document.body.innerHTML = '';
     testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
 
     testService.setQueryResult({
       info: createHistoryInfo(),
diff --git a/chrome/test/data/webui/history/history_synced_tabs_test.js b/chrome/test/data/webui/history/history_synced_tabs_test.js
index 66b93f8..4c0748a 100644
--- a/chrome/test/data/webui/history/history_synced_tabs_test.js
+++ b/chrome/test/data/webui/history/history_synced_tabs_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {flushTasks, waitBeforeNextRender} from 'chrome://webui-test/test_util.js';
 
@@ -35,7 +35,7 @@
     document.body.innerHTML = '';
     window.history.replaceState({}, '', '/');
     testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
 
     // Need to ensure lazy_load.html has been imported so that the device
     // manager custom element is defined.
@@ -257,7 +257,7 @@
         })
         .then(args => {
           assertEquals('Chromebook', args.sessionTag, 'sessionTag is correct');
-          assertEquals('123', args.windowId, 'windowId is correct');
+          assertEquals(123, args.windowId, 'windowId is correct');
           assertEquals(456, args.tabId, 'tabId is correct');
           assertFalse(args.e.altKey, 'altKey is defined');
           assertFalse(args.e.ctrlKey, 'ctrlKey is defined');
diff --git a/chrome/test/data/webui/history/history_toolbar_focus_test.js b/chrome/test/data/webui/history/history_toolbar_focus_test.js
index 20bbed0..83e25c0a 100644
--- a/chrome/test/data/webui/history/history_toolbar_focus_test.js
+++ b/chrome/test/data/webui/history/history_toolbar_focus_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService} from 'chrome://history/history.js';
+import {BrowserServiceImpl} from 'chrome://history/history.js';
 import {isMac} from 'chrome://resources/js/cr.m.js';
 import {pressAndReleaseKeyOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
@@ -16,7 +16,7 @@
   setup(function() {
     document.body.innerHTML = '';
     window.history.replaceState({}, '', '/');
-    BrowserService.setInstance(new TestBrowserService());
+    BrowserServiceImpl.setInstance(new TestBrowserService());
 
     app = document.createElement('history-app');
     document.body.appendChild(app);
diff --git a/chrome/test/data/webui/history/history_toolbar_test.js b/chrome/test/data/webui/history/history_toolbar_test.js
index 206e6c73..61d56694 100644
--- a/chrome/test/data/webui/history/history_toolbar_test.js
+++ b/chrome/test/data/webui/history/history_toolbar_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, ensureLazyLoaded} from 'chrome://history/history.js';
+import {BrowserServiceImpl, ensureLazyLoaded} from 'chrome://history/history.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
@@ -20,7 +20,7 @@
   setup(function() {
     document.body.innerHTML = '';
     testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
 
     app = document.createElement('history-app');
     document.body.appendChild(app);
diff --git a/chrome/test/data/webui/history/link_click_test.js b/chrome/test/data/webui/history/link_click_test.js
index 7c20bad8..604dea3 100644
--- a/chrome/test/data/webui/history/link_click_test.js
+++ b/chrome/test/data/webui/history/link_click_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BrowserService, listenForPrivilegedLinkClicks} from 'chrome://history/history.js';
+import {BrowserServiceImpl, listenForPrivilegedLinkClicks} from 'chrome://history/history.js';
 import {$} from 'chrome://resources/js/util.m.js';
 import {TestBrowserService} from './test_browser_service.js';
 
@@ -10,7 +10,7 @@
   test('click handler', async () => {
     document.body.innerHTML = '';
     const testService = new TestBrowserService();
-    BrowserService.setInstance(testService);
+    BrowserServiceImpl.setInstance(testService);
 
     listenForPrivilegedLinkClicks();
     document.body.innerHTML = `
diff --git a/chrome/test/data/webui/history/test_browser_service.js b/chrome/test/data/webui/history/test_browser_service.ts
similarity index 67%
rename from chrome/test/data/webui/history/test_browser_service.js
rename to chrome/test/data/webui/history/test_browser_service.ts
index 956cb55..ad7890d 100644
--- a/chrome/test/data/webui/history/test_browser_service.js
+++ b/chrome/test/data/webui/history/test_browser_service.ts
@@ -2,12 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {BrowserService, ForeignSession, QueryResult, RemoveVisitsRequest} from 'chrome://history/history.js';
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
+import {assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 import {createHistoryInfo} from './test_util.js';
 
-export class TestBrowserService extends TestBrowserProxy {
+export class TestBrowserService extends TestBrowserProxy implements
+    BrowserService {
+  histogramMap: {[key: string]: {[key: string]: number}} = {};
+  actionMap: {[key: string]: number} = {};
+  private delayedRemove_: PromiseResolver<void>|null = null;
+  private delayedQueryResult_: PromiseResolver<QueryResult>|null = null;
+  private ignoreNextQuery_: boolean = false;
+  private foreignSessions_: ForeignSession[] = [];
+  private queryResult_: QueryResult;
+
   constructor() {
     super([
       'deleteForeignSession',
@@ -16,21 +27,13 @@
       'navigateToUrl',
       'openForeignSessionTab',
       'otherDevicesInitialized',
-      'recordHistogram',
-      'removeVisits',
       'queryHistory',
       'queryHistoryContinuation',
+      'recordHistogram',
+      'removeVisits',
+      'startSignInFlow',
     ]);
-    this.histogramMap = {};
-    this.actionMap = {};
-    /** @private {?PromiseResolver} */
-    this.delayedRemove_ = null;
-    /** @private {?PromiseResolver} */
-    this.delayedQueryResult_ = null;
-    this.ignoreNextQuery_ = false;
-    /** @private {!Array<!ForeignSession>} */
-    this.foreignSessions_ = [];
-    /** @private {!{info: !HistoryQuery, value: !Array<!HistoryEntry>}} */
+
     this.queryResult_ = {info: createHistoryInfo(), value: []};
   }
 
@@ -51,25 +54,21 @@
     this.ignoreNextQuery_ = true;
   }
 
-  /** @override */
-  deleteForeignSession(sessionTag) {
+  deleteForeignSession(sessionTag: string) {
     this.methodCalled('deleteForeignSession', sessionTag);
   }
 
-  /** @override */
   getForeignSessions() {
     this.methodCalled('getForeignSessions');
     return Promise.resolve(this.foreignSessions_);
   }
 
-  /** @param {!Array<!ForeignSession>} sessions */
-  setForeignSessions(sessions) {
+  setForeignSessions(sessions: ForeignSession[]) {
     this.foreignSessions_ = sessions;
   }
 
-  /** @override */
-  removeVisits(visits) {
-    this.methodCalled('removeVisits', visits);
+  removeVisits(removalList: RemoveVisitsRequest) {
+    this.methodCalled('removeVisits', removalList);
     if (this.delayedRemove_) {
       return this.delayedRemove_.promise;
     }
@@ -78,35 +77,31 @@
 
   // Resolves the removeVisits promise. delayRemove() must be called first.
   finishRemoveVisits() {
-    this.delayedRemove_.resolve();
+    this.delayedRemove_!.resolve();
     this.delayedRemove_ = null;
   }
 
   // Resolves the queryHistory promise. delayQueryHistory() must be called
   // first.
   finishQueryHistory() {
-    this.delayedQueryResult_.resolve(this.queryResult_);
+    this.delayedQueryResult_!.resolve(this.queryResult_);
     this.delayedQueryResult_ = null;
   }
 
-  /** @override */
   historyLoaded() {
     this.methodCalled('historyLoaded');
   }
 
-  /** @override */
-  navigateToUrl(url, target, e) {
+  navigateToUrl(url: string, _target: string, _e: MouseEvent) {
     this.methodCalled('navigateToUrl', url);
   }
 
-  /** @override */
   openClearBrowsingData() {}
 
-  /** @override */
   openForeignSessionAllTabs() {}
 
-  /** @override */
-  openForeignSessionTab(sessionTag, windowId, tabId, e) {
+  openForeignSessionTab(
+      sessionTag: string, windowId: number, tabId: number, e: MouseEvent) {
     this.methodCalled('openForeignSessionTab', {
       sessionTag: sessionTag,
       windowId: windowId,
@@ -115,18 +110,15 @@
     });
   }
 
-  /** @override */
   otherDevicesInitialized() {
     this.methodCalled('otherDevicesInitialized');
   }
 
-  /** @param {{info: !HistoryQuery, value: !Array<!QueryResult>}} queryResult */
-  setQueryResult(queryResult) {
+  setQueryResult(queryResult: QueryResult) {
     this.queryResult_ = queryResult;
   }
 
-  /** @override */
-  queryHistory(searchTerm) {
+  queryHistory(searchTerm: string) {
     if (!this.ignoreNextQuery_) {
       this.methodCalled('queryHistory', searchTerm);
     } else {
@@ -138,14 +130,12 @@
     return Promise.resolve(this.queryResult_);
   }
 
-  /** @override */
   queryHistoryContinuation() {
     this.methodCalled('queryHistoryContinuation');
     return Promise.resolve(this.queryResult_);
   }
 
-  /** @override */
-  recordAction(action) {
+  recordAction(action: string) {
     if (!(action in this.actionMap)) {
       this.actionMap[action] = 0;
     }
@@ -153,25 +143,22 @@
     this.actionMap[action]++;
   }
 
-  /** @override */
-  recordHistogram(histogram, value, max) {
+  recordHistogram(histogram: string, value: number, max: number) {
     assertTrue(value <= max);
 
     if (!(histogram in this.histogramMap)) {
       this.histogramMap[histogram] = {};
     }
 
-    if (!(value in this.histogramMap[histogram])) {
-      this.histogramMap[histogram][value] = 0;
+    if (!(value in this.histogramMap[histogram]!)) {
+      this.histogramMap[histogram]![value] = 0;
     }
 
-    this.histogramMap[histogram][value]++;
+    this.histogramMap[histogram]![value]++;
     this.methodCalled('recordHistogram');
   }
 
-  /** @override */
   recordTime() {}
-
-  /** @override */
   removeBookmark() {}
+  startSignInFlow() {}
 }
diff --git a/chrome/test/data/webui/history/test_util.js b/chrome/test/data/webui/history/test_util.js
deleted file mode 100644
index 4a90798..0000000
--- a/chrome/test/data/webui/history/test_util.js
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * Create a fake history result with the given timestamp.
- * @param {number|string} timestamp Timestamp of the entry, as a number in ms or
- * a string which can be parsed by Date.parse().
- * @param {string} urlStr The URL to set on this entry.
- * @return {!HistoryEntry} An object representing a history entry.
- */
-export function createHistoryEntry(timestamp, urlStr) {
-  if (typeof timestamp === 'string') {
-    timestamp += ' UTC';
-  }
-
-  const d = new Date(timestamp);
-  const url = new URL(urlStr);
-  const domain = url.host;
-  return {
-    allTimestamps: [timestamp],
-    // Formatting the relative day is too hard, will instead display
-    // YYYY-MM-DD.
-    dateRelativeDay: d.toISOString().split('T')[0],
-    dateTimeOfDay: d.getUTCHours() + ':' + d.getUTCMinutes(),
-    domain: domain,
-    starred: false,
-    time: d.getTime(),
-    title: urlStr,
-    url: urlStr
-  };
-}
-
-/**
- * Create a fake history search result with the given timestamp. Replaces fields
- * from createHistoryEntry to look like a search result.
- * @param {number|string} timestamp Timestamp of the entry, as a number in ms or
- * a string which can be parsed by Date.parse().
- * @param {string} urlStr The URL to set on this entry.
- * @return {!HistoryEntry} An object representing a history entry.
- */
-export function createSearchEntry(timestamp, urlStr) {
-  const entry = createHistoryEntry(timestamp, urlStr);
-  entry.dateShort = entry.dateRelativeDay;
-  entry.dateTimeOfDay = '';
-  entry.dateRelativeDay = '';
-
-  return entry;
-}
-
-/**
- * Create a simple HistoryQuery.
- * @param {?string} searchTerm The search term that the info has. Will be empty
- *     string if not specified.
- * @return {!HistoryQuery}
- */
-export function createHistoryInfo(searchTerm) {
-  return {finished: true, term: searchTerm || ''};
-}
-
-/**
- * @param {Element} element
- * @param {string} selector
- * @return {!NodeList<!Element>}
- */
-export function polymerSelectAll(element, selector) {
-  return element.shadowRoot.querySelectorAll(selector);
-}
-
-/**
- * Returns a promise which is resolved when |eventName| is fired on |element|
- * and |predicate| is true.
- * @param {HTMLElement} element
- * @param {string} eventName
- * @param {function(Event): boolean} predicate
- * @return {Promise}
- */
-export function waitForEvent(element, eventName, predicate) {
-  if (!predicate) {
-    predicate = function() {
-      return true;
-    };
-  }
-
-  return new Promise(function(resolve) {
-    const listener = function(e) {
-      if (!predicate(e)) {
-        return;
-      }
-
-      resolve();
-      element.removeEventListener(eventName, listener);
-    };
-
-    element.addEventListener(eventName, listener);
-  });
-}
-
-/**
- * Sends a shift click event to |element|.
- * @param {HTMLElement} element
- */
-export function shiftClick(element) {
-  const xy = MockInteractions.middleOfNode(element);
-  const props = {
-    bubbles: true,
-    cancelable: true,
-    clientX: xy.x,
-    clientY: xy.y,
-    buttons: 1,
-    shiftKey: true,
-  };
-
-  element.dispatchEvent(new MouseEvent('mousedown', props));
-  element.dispatchEvent(new MouseEvent('mouseup', props));
-  element.dispatchEvent(new MouseEvent('click', props));
-}
-
-export function disableLinkClicks() {
-  document.addEventListener('click', function(e) {
-    if (e.defaultPrevented) {
-      return;
-    }
-
-    const eventPath = e.path;
-    let anchor = null;
-    if (eventPath) {
-      for (let i = 0; i < eventPath.length; i++) {
-        const element = eventPath[i];
-        if (element.tagName === 'A' && element.href) {
-          anchor = element;
-          break;
-        }
-      }
-    }
-
-    if (!anchor) {
-      return;
-    }
-
-    e.preventDefault();
-  });
-}
-
-export function createSession(name, windows) {
-  return {
-    collapsed: false,
-    deviceType: '',
-    name: name,
-    modifiedTime: '2 seconds ago',
-    tag: name,
-    timestamp: 0,
-    windows: windows
-  };
-}
-
-export function createWindow(tabUrls) {
-  const tabs = tabUrls.map(function(tabUrl) {
-    return {sessionId: 456, timestamp: 0, title: tabUrl, url: tabUrl};
-  });
-
-  return {tabs: tabs, sessionId: '123'};
-}
diff --git a/chrome/test/data/webui/history/test_util.ts b/chrome/test/data/webui/history/test_util.ts
new file mode 100644
index 0000000..a4d0272
--- /dev/null
+++ b/chrome/test/data/webui/history/test_util.ts
@@ -0,0 +1,178 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {ForeignSession, ForeignSessionTab, ForeignSessionWindow, HistoryEntry, HistoryQuery} from 'chrome://history/history.js';
+import {middleOfNode} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
+
+
+/**
+ * Create a fake history result with the given timestamp.
+ * @param timestamp Timestamp of the entry, as a number in ms or a string which
+ *     can be parsed by Date.parse().
+ * @param urlStr The URL to set on this entry.
+ */
+export function createHistoryEntry(
+    timestamp: number|string, urlStr: string): HistoryEntry {
+  if (typeof timestamp === 'string') {
+    timestamp += ' UTC';
+  }
+
+  const d = new Date(timestamp);
+  const url = new URL(urlStr);
+  const domain = url.host;
+  return {
+    allTimestamps: [d.getTime()],
+    remoteIconUrlForUma: '',
+    isUrlInRemoteUserData: false,
+    blockedVisit: false,
+
+    // Formatting the relative day is too hard, will instead display
+    // YYYY-MM-DD.
+    dateRelativeDay: d.toISOString().split('T')[0]!,
+    dateShort: '',
+    dateTimeOfDay: d.getUTCHours() + ':' + d.getUTCMinutes(),
+    deviceName: '',
+    deviceType: '',
+    domain: domain,
+    fallbackFaviconText: '',
+    hostFilteringBehavior: 0,
+    readableTimestamp: '',
+    selected: false,
+    snippet: '',
+    starred: false,
+    time: d.getTime(),
+    title: urlStr,
+    url: urlStr,
+  };
+}
+
+/**
+ * Create a fake history search result with the given timestamp. Replaces fields
+ * from createHistoryEntry to look like a search result.
+ * @param timestamp Timestamp of the entry, as a number in ms or a string which
+ *     can be parsed by Date.parse().
+ * @param urlStr The URL to set on this entry.
+ */
+export function createSearchEntry(
+    timestamp: number|string, urlStr: string): HistoryEntry {
+  const entry = createHistoryEntry(timestamp, urlStr);
+  entry.dateShort = entry.dateRelativeDay;
+  entry.dateTimeOfDay = '';
+  entry.dateRelativeDay = '';
+
+  return entry;
+}
+
+/**
+ * Create a simple HistoryQuery.
+ * @param searchTerm The search term that the info has. Will be empty  string if
+ *     not specified.
+ */
+export function createHistoryInfo(searchTerm?: string): HistoryQuery {
+  return {finished: true, term: searchTerm || ''};
+}
+
+export function polymerSelectAll(element: Element, selector: string): NodeList {
+  return element.shadowRoot!.querySelectorAll(selector);
+}
+
+/**
+ * Returns a promise which is resolved when |eventName| is fired on |element|
+ * and |predicate| is true.
+ */
+export function waitForEvent(
+    element: HTMLElement, eventName: string,
+    predicate?: (e: Event) => boolean): Promise<void> {
+  if (!predicate) {
+    predicate = () => true;
+  }
+
+  return new Promise<void>(function(resolve) {
+    const listener = function(e: Event) {
+      if (!predicate!(e)) {
+        return;
+      }
+
+      resolve();
+      element.removeEventListener(eventName, listener);
+    };
+
+    element.addEventListener(eventName, listener);
+  });
+}
+
+/**
+ * Sends a shift click event to |element|.
+ */
+export function shiftClick(element: HTMLElement) {
+  const xy = middleOfNode(element);
+  const props = {
+    bubbles: true,
+    cancelable: true,
+    clientX: xy.x,
+    clientY: xy.y,
+    buttons: 1,
+    shiftKey: true,
+  };
+
+  element.dispatchEvent(new MouseEvent('mousedown', props));
+  element.dispatchEvent(new MouseEvent('mouseup', props));
+  element.dispatchEvent(new MouseEvent('click', props));
+}
+
+export function disableLinkClicks() {
+  document.addEventListener('click', function(e) {
+    if (e.defaultPrevented) {
+      return;
+    }
+
+    const eventPath = e.composedPath();
+    let anchor = null;
+    if (eventPath) {
+      for (let i = 0; i < eventPath.length; i++) {
+        const element = eventPath[i] as HTMLElement;
+        if (element.tagName === 'A' && (element as HTMLAnchorElement).href) {
+          anchor = element;
+          break;
+        }
+      }
+    }
+
+    if (!anchor) {
+      return;
+    }
+
+    e.preventDefault();
+  });
+}
+
+export function createSession(
+    name: string, windows: ForeignSessionWindow[]): ForeignSession {
+  return {
+    collapsed: false,
+    deviceType: '',
+    name,
+    modifiedTime: '2 seconds ago',
+    tag: name,
+    timestamp: 0,
+    windows,
+  };
+}
+
+export function createWindow(tabUrls: string[]): ForeignSessionWindow {
+  const tabs: ForeignSessionTab[] = tabUrls.map(function(tabUrl) {
+    return {
+      direction: '',
+      remoteIconUrlForUma: '',
+      sessionId: 456,
+      timestamp: 0,
+      title: tabUrl,
+      type: 'tab',
+      url: tabUrl,
+      windowId: 0,
+    };
+  });
+
+  return {tabs: tabs, sessionId: 123, timestamp: 0};
+}
diff --git a/chrome/test/data/webui/new_tab_page/test_support.js b/chrome/test/data/webui/new_tab_page/test_support.js
index 520401cd..1f9d0781 100644
--- a/chrome/test/data/webui/new_tab_page/test_support.js
+++ b/chrome/test/data/webui/new_tab_page/test_support.js
@@ -99,6 +99,7 @@
     bg: {value: 0xff000000},
     icon: {value: 0xff000001},
     iconSelected: {value: 0xff000002},
+    ntpBg: {value: 0xff00000e},
     placeholder: {value: 0xff000003},
     resultsBg: {value: 0xff000004},
     resultsBgHovered: {value: 0xff000005},
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
index 6cd85bb..e20275f 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
@@ -674,9 +674,15 @@
         setNearbyShareDisallowedByPolicy(false);
         assertTrue(test_util.isChildVisible(
             multidevicePage, '#nearbySetUp', /*checkLightDom=*/ false));
-        assertFalse(test_util.isChildVisible(
-            multidevicePage, '#nearbyShareSubpageArrow',
-            /*checkLightDom=*/ false));
+        if (loadTimeData.getValue('isNearbyShareBackgroundScanningEnabled')) {
+          assertTrue(test_util.isChildVisible(
+              multidevicePage, '#nearbyShareSubpageArrow',
+              /*checkLightDom=*/ false));
+        } else {
+          assertFalse(test_util.isChildVisible(
+              multidevicePage, '#nearbyShareSubpageArrow',
+              /*checkLightDom=*/ false));
+        }
 
         setNearbyShareIsOnboardingComplete(true);
         setNearbyShareEnabled(true);
@@ -692,24 +698,40 @@
         setNearbyShareDisallowedByPolicy(false);
         assertTrue(test_util.isChildVisible(
             multidevicePage, '#nearbySetUp', /*checkLightDom=*/ false));
-        assertFalse(test_util.isChildVisible(
-            multidevicePage, '#nearbyShareSubpageArrow',
-            /*checkLightDom=*/ false));
+        if (loadTimeData.getValue('isNearbyShareBackgroundScanningEnabled')) {
+          assertTrue(test_util.isChildVisible(
+              multidevicePage, '#nearbyShareSubpageArrow',
+              /*checkLightDom=*/ false));
+        } else {
+          assertFalse(test_util.isChildVisible(
+              multidevicePage, '#nearbyShareSubpageArrow',
+              /*checkLightDom=*/ false));
+        }
 
         const router = settings.Router.getInstance();
         multidevicePage.$$('#nearbyLinkWrapper').click();
         await flushAsync();
         assertEquals(settings.routes.NEARBY_SHARE, router.getCurrentRoute());
-        assertTrue(router.getQueryParameters().has('onboarding'));
+        if (loadTimeData.getValue('isNearbyShareBackgroundScanningEnabled')) {
+          assertFalse(router.getQueryParameters().has('onboarding'));
+        } else {
+          assertTrue(router.getQueryParameters().has('onboarding'));
+        }
       });
 
   test('Clicking nearby subpage after onboarding enters subpage', async () => {
     setNearbyShareDisallowedByPolicy(false);
     assertTrue(test_util.isChildVisible(
         multidevicePage, '#nearbySetUp', /*checkLightDom=*/ false));
-    assertFalse(test_util.isChildVisible(
-        multidevicePage, '#nearbyShareSubpageArrow',
-        /*checkLightDom=*/ false));
+    if (loadTimeData.getValue('isNearbyShareBackgroundScanningEnabled')) {
+      assertTrue(test_util.isChildVisible(
+          multidevicePage, '#nearbyShareSubpageArrow',
+          /*checkLightDom=*/ false));
+    } else {
+      assertFalse(test_util.isChildVisible(
+          multidevicePage, '#nearbyShareSubpageArrow',
+          /*checkLightDom=*/ false));
+    }
 
     setNearbyShareIsOnboardingComplete(true);
     setNearbyShareEnabled(true);
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
index f271216..51f5252 100644
--- a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
@@ -182,7 +182,11 @@
     assertEquals(false, featureToggleButton.checked);
     assertEquals(false, subpage.prefs.nearby_sharing.enabled.value);
     assertEquals('Off', featureToggleButton.label.trim());
-    subpageControlsHidden(true);
+    if (loadTimeData.getValue('isNearbyShareBackgroundScanningEnabled')) {
+      subpageControlsHidden(false);
+    } else {
+      subpageControlsHidden(true);
+    }
   });
 
   test('toggle row controls preference', function() {
@@ -553,12 +557,20 @@
     assertEquals('Off', featureToggleButton.label.trim());
     assertEquals('none', subpageContent.style.display);
     assertEquals('none', subpage.$$('#helpContent').style.display);
-    subpageControlsHidden(true);
+    if (loadTimeData.getValue('isNearbyShareBackgroundScanningEnabled')) {
+      subpageControlsHidden(false);
+    } else {
+      subpageControlsHidden(true);
+    }
     assertFalse(doesElementExist('#help'));
   });
 
   test('Fast init toggle doesn\'t exist', function() {
-    assertFalse(!!subpage.$$('#fastInitiationNotificationToggle'));
+    if (loadTimeData.getValue('isNearbyShareBackgroundScanningEnabled')) {
+      assertTrue(!!subpage.$$('#fastInitiationNotificationToggle'));
+    } else {
+      assertFalse(!!subpage.$$('#fastInitiationNotificationToggle'));
+    }
   });
 
   suite('Background Scanning Enabled', function() {
diff --git a/chrome/test/data/webui/settings/privacy_sandbox_test.ts b/chrome/test/data/webui/settings/privacy_sandbox_test.ts
index 3a3e117d..279d0bc 100644
--- a/chrome/test/data/webui/settings/privacy_sandbox_test.ts
+++ b/chrome/test/data/webui/settings/privacy_sandbox_test.ts
@@ -7,11 +7,11 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {PrivacySandboxAppElement} from 'chrome://settings/privacy_sandbox/app.js';
 import {PrivacySandboxBrowserProxy, PrivacySandboxBrowserProxyImpl} from 'chrome://settings/privacy_sandbox/privacy_sandbox_browser_proxy.js';
-import {CrSettingsPrefs, HatsBrowserProxyImpl, MetricsBrowserProxyImpl, TrustSafetyInteraction} from 'chrome://settings/settings.js';
+import {CrButtonElement, CrSettingsPrefs, HatsBrowserProxyImpl, loadTimeData, MetricsBrowserProxyImpl, TrustSafetyInteraction} from 'chrome://settings/settings.js';
 
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
-import {flushTasks} from 'chrome://webui-test/test_util.js';
+import {flushTasks, isChildVisible} from 'chrome://webui-test/test_util.js';
 
 import {TestHatsBrowserProxy} from './test_hats_browser_proxy.js';
 import {TestMetricsBrowserProxy} from './test_metrics_browser_proxy.js';
@@ -43,6 +43,12 @@
   let testHatsBrowserProxy: TestHatsBrowserProxy;
   let testPrivacySandboxBrowserProxy: TestPrivacySandboxBrowserProxy;
 
+  suiteSetup(function() {
+    loadTimeData.overrideValues({
+      privacySandboxSettings3Enabled: false,
+    });
+  });
+
   setup(function() {
     testHatsBrowserProxy = new TestHatsBrowserProxy();
     HatsBrowserProxyImpl.setInstance(testHatsBrowserProxy);
@@ -69,6 +75,12 @@
     CrSettingsPrefs.resetForTesting();
   });
 
+  test('testSandboxSettings3Visibility', function() {
+    assertTrue(isChildVisible(page, '#trialsCard'));
+    assertTrue(isChildVisible(page, '#flocCard'));
+    assertFalse(isChildVisible(page, '#trialsCardSettings3'));
+  });
+
   test('clickApiToggleTest', async function() {
     const toggleButton =
         page.shadowRoot!.querySelector<HTMLElement>('#apiToggleButton')!;
@@ -110,10 +122,21 @@
     // The page should automatically retrieve the FLoC state when it is attached
     // to the document.
     await testPrivacySandboxBrowserProxy.whenCalled('getFlocId');
-    assertEquals('test-trial-status', page.$.flocStatus.textContent!.trim());
-    assertEquals('test-id', page.$.flocId.textContent!.trim());
-    assertEquals('test-time', page.$.flocUpdatedOn!.textContent!.trim());
-    assertFalse(page.$.resetFlocIdButton.disabled);
+    assertEquals(
+        'test-trial-status',
+        page.shadowRoot!.querySelector<HTMLElement>(
+                            '#flocStatus')!.textContent!.trim());
+    assertEquals(
+        'test-id',
+        page.shadowRoot!.querySelector<HTMLElement>(
+                            '#flocId')!.textContent!.trim());
+    assertEquals(
+        'test-time',
+        page.shadowRoot!.querySelector<HTMLElement>(
+                            '#flocUpdatedOn')!.textContent!.trim());
+    assertFalse(
+        page.shadowRoot!.querySelector<CrButtonElement>(
+                            '#resetFlocIdButton')!.disabled);
 
     // The page should listen for changes via a WebUI listener.
     webUIListenerCallback('floc-id-changed', {
@@ -125,14 +148,24 @@
 
     await flushTasks();
     assertEquals(
-        'new-test-trial-status', page.$.flocStatus.textContent!.trim());
-    assertEquals('new-test-id', page.$.flocId.textContent!.trim());
-    assertEquals('new-test-time', page.$.flocUpdatedOn!.textContent!.trim());
-    assertTrue(page.$.resetFlocIdButton.disabled);
+        'new-test-trial-status',
+        page.shadowRoot!.querySelector<HTMLElement>(
+                            '#flocStatus')!.textContent!.trim());
+    assertEquals(
+        'new-test-id',
+        page.shadowRoot!.querySelector<HTMLElement>(
+                            '#flocId')!.textContent!.trim());
+    assertEquals(
+        'new-test-time',
+        page.shadowRoot!.querySelector<HTMLElement>(
+                            '#flocUpdatedOn')!.textContent!.trim());
+    assertTrue(
+        page.shadowRoot!.querySelector<CrButtonElement>(
+                            '#resetFlocIdButton')!.disabled);
   });
 
   test('resetFlocId', function() {
-    page.$.resetFlocIdButton.click();
+    page.shadowRoot!.querySelector<HTMLElement>('#resetFlocIdButton')!.click();
     return testPrivacySandboxBrowserProxy.whenCalled('resetFlocId');
   });
 
@@ -148,13 +181,13 @@
   });
 
   test('userActions', async function() {
-    page.$.flocToggleButton.click();
+    page.shadowRoot!.querySelector<HTMLElement>('#flocToggleButton')!.click();
     assertEquals(
         'Settings.PrivacySandbox.FlocDisabled',
         await metricsBrowserProxy.whenCalled('recordAction'));
     metricsBrowserProxy.resetResolver('recordAction');
 
-    page.$.flocToggleButton.click();
+    page.shadowRoot!.querySelector<HTMLElement>('#flocToggleButton')!.click();
     assertEquals(
         'Settings.PrivacySandbox.FlocEnabled',
         await metricsBrowserProxy.whenCalled('recordAction'));
@@ -167,3 +200,29 @@
     assertEquals(0, metricsBrowserProxy.getCallCount('recordAction'));
   });
 });
+
+suite('PrivacySandboxSettings3', function() {
+  let page: PrivacySandboxAppElement;
+
+  suiteSetup(function() {
+    loadTimeData.overrideValues({
+      privacySandboxSettings3Enabled: true,
+    });
+  });
+
+  setup(function() {
+    assertTrue(loadTimeData.getBoolean('privacySandboxSettings3Enabled'));
+    document.body.innerHTML = '';
+    page = /** @type {!PrivacySandboxAppElement} */
+        (document.createElement('privacy-sandbox-app'));
+    document.body.appendChild(page);
+
+    return flushTasks();
+  });
+
+  test('testSandboxSettings3Visibility', function() {
+    assertFalse(isChildVisible(page, '#trialsCard'));
+    assertFalse(isChildVisible(page, '#flocCard'));
+    assertTrue(isChildVisible(page, '#trialsCardSettings3'));
+  });
+});
diff --git a/chrome/test/data/webui/settings/security_page_test.ts b/chrome/test/data/webui/settings/security_page_test.ts
index e2cc1c1..fbf9c2f 100644
--- a/chrome/test/data/webui/settings/security_page_test.ts
+++ b/chrome/test/data/webui/settings/security_page_test.ts
@@ -7,6 +7,10 @@
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {SafeBrowsingSetting, SettingsSecurityPageElement} from 'chrome://settings/lazy_load.js';
 import {MetricsBrowserProxyImpl, PrivacyElementInteractions, PrivacyPageBrowserProxyImpl, Router, routes, SafeBrowsingInteractions, SecureDnsMode} from 'chrome://settings/settings.js';
+// <if expr="is_win">
+import {buildRouter} from 'chrome://settings/settings.js';
+import {SettingsRoutes} from 'chrome://settings/settings_routes.js';
+// </if>
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks, isChildVisible} from 'chrome://webui-test/test_util.js';
 
@@ -15,6 +19,25 @@
 
 // clang-format on
 
+function pagePrefs() {
+  return {
+    profile: {password_manager_leak_detection: {value: false}},
+    safebrowsing: {
+      scout_reporting_enabled: {value: true},
+    },
+    generated: {
+      safe_browsing: {
+        type: chrome.settingsPrivate.PrefType.NUMBER,
+        value: SafeBrowsingSetting.STANDARD,
+      },
+      password_leak_detection: {value: false},
+    },
+    dns_over_https:
+        {mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}},
+    https_only_mode_enabled: {value: false},
+  };
+}
+
 suite('CrSettingsSecurityPageTest', function() {
   let testMetricsBrowserProxy: TestMetricsBrowserProxy;
   let testPrivacyBrowserProxy: TestPrivacyPageBrowserProxy;
@@ -23,6 +46,7 @@
   suiteSetup(function() {
     loadTimeData.overrideValues({
       enableSecurityKeysSubpage: true,
+      enableSecurityKeysPhonesSubpage: false,
       showHttpsOnlyModeSetting: true,
     });
   });
@@ -34,22 +58,7 @@
     PrivacyPageBrowserProxyImpl.setInstance(testPrivacyBrowserProxy);
     document.body.innerHTML = '';
     page = document.createElement('settings-security-page');
-    page.prefs = {
-      profile: {password_manager_leak_detection: {value: false}},
-      safebrowsing: {
-        scout_reporting_enabled: {value: true},
-      },
-      generated: {
-        safe_browsing: {
-          type: chrome.settingsPrivate.PrefType.NUMBER,
-          value: SafeBrowsingSetting.STANDARD,
-        },
-        password_leak_detection: {value: false},
-      },
-      dns_over_https:
-          {mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}},
-      https_only_mode_enabled: {value: false},
-    };
+    page.prefs = pagePrefs();
     document.body.appendChild(page);
     page.$.safeBrowsingEnhanced.updateCollapsed();
     page.$.safeBrowsingStandard.updateCollapsed();
@@ -92,6 +101,10 @@
     assertTrue(isChildVisible(page, '#security-keys-subpage-trigger'));
   });
 
+  test('ManageSecurityKeysPhonesSubpageHidden', function() {
+    assertFalse(isChildVisible(page, '#security-keys-phones-subpage-trigger'));
+  });
+
   test('PasswordsLeakDetectionSubLabel', function() {
     const toggle = page.$.passwordsLeakToggle;
     const defaultSubLabel =
@@ -575,6 +588,7 @@
   suiteSetup(function() {
     loadTimeData.overrideValues({
       enableSecurityKeysSubpage: false,
+      enableSecurityKeysPhonesSubpage: false,
       showHttpsOnlyModeSetting: false,
     });
   });
@@ -582,21 +596,7 @@
   setup(function() {
     document.body.innerHTML = '';
     page = document.createElement('settings-security-page');
-    page.prefs = {
-      profile: {password_manager_leak_detection: {value: true}},
-      safebrowsing: {
-        scout_reporting_enabled: {value: true},
-      },
-      generated: {
-        safe_browsing: {
-          type: chrome.settingsPrivate.PrefType.NUMBER,
-          value: SafeBrowsingSetting.STANDARD,
-        },
-        password_leak_detection: {value: true, userControlDisabled: false},
-      },
-      dns_over_https:
-          {mode: {value: SecureDnsMode.AUTOMATIC}, templates: {value: ''}},
-    };
+    page.prefs = pagePrefs();
     document.body.appendChild(page);
     flush();
   });
@@ -609,7 +609,63 @@
     assertFalse(isChildVisible(page, '#security-keys-subpage-trigger'));
   });
 
+  test('ManageSecurityKeysPhonesSubpageHidden', function() {
+    assertFalse(isChildVisible(page, '#security-keys-phones-subpage-trigger'));
+  });
+
   test('HttpsOnlyModeSettingHidden', function() {
     assertFalse(isChildVisible(page, '#httpsOnlyModeToggle'));
   });
 });
+
+suite('CrSettingsSecurityPageTest_SecurityKeysWindowsApi', function() {
+  // On modern versions of Windows the security keys subpage will be disabled
+  // because Windows manages that itself, but a link to the subpage for
+  // managing phones as security keys will be included.
+  let page: SettingsSecurityPageElement;
+
+  suiteSetup(function() {
+    loadTimeData.overrideValues({
+      enableSecurityKeysSubpage: false,
+      enableSecurityKeysPhonesSubpage: true,
+    });
+
+    // <if expr="is_win">
+    // Setting `enableSecurityKeysPhonesSubpage` updates the list of routes,
+    // thus the `Router` needs to be rebuilt.
+    Router.resetInstanceForTesting(buildRouter());
+    // The code under test needs to be able to find `SECURITY_KEYS_PHONES`.
+    routes.SECURITY_KEYS_PHONES =
+        (Router.getInstance().getRoutes() as SettingsRoutes)
+            .SECURITY_KEYS_PHONES;
+    // </if>
+  });
+
+  setup(function() {
+    document.body.innerHTML = '';
+    page = document.createElement('settings-security-page');
+    page.prefs = pagePrefs();
+    document.body.appendChild(page);
+    flush();
+  });
+
+  teardown(function() {
+    page.remove();
+  });
+
+  test('ManageSecurityKeysSubpageHidden', function() {
+    assertFalse(isChildVisible(page, '#security-keys-subpage-trigger'));
+  });
+
+  // The element only exists on Windows.
+  // <if expr="is_win">
+  test('ManageSecurityKeysPhonesSubpageVisibleAndNavigates', function() {
+    const triggerId = '#security-keys-phones-subpage-trigger';
+    assertTrue(isChildVisible(page, triggerId));
+    page.shadowRoot!.querySelector<HTMLElement>(triggerId)!.click();
+    flush();
+    assertEquals(
+        routes.SECURITY_KEYS_PHONES, Router.getInstance().getCurrentRoute());
+  });
+  // </if>
+});
diff --git a/chrome/test/data/webui/tab_search/tab_search_app_test.ts b/chrome/test/data/webui/tab_search/tab_search_app_test.ts
index 69466d5..72684919 100644
--- a/chrome/test/data/webui/tab_search/tab_search_app_test.ts
+++ b/chrome/test/data/webui/tab_search/tab_search_app_test.ts
@@ -872,9 +872,11 @@
         {alsoShowMediaTabsinOpenTabsSection: false});
 
     const searchField = tabSearchApp.$.searchField;
-    searchField.setValue('meet');
+    searchField.setValue('google');
     await flushTasks();
+    // No media tabs section when there is a search query.
     assertEquals(1, queryListTitle().length);
+    assertEquals(2, queryRows().length);
   });
 
   test(
@@ -887,11 +889,11 @@
             {alsoShowMediaTabsinOpenTabsSection: true});
 
         const searchField = tabSearchApp.$.searchField;
-        searchField.setValue('meet');
+        searchField.setValue('google');
         await flushTasks();
-        // Media tab is only shown in the Open Tabs section when a search
-        // criteria is applied.
+        // No media tabs section when there is a search query.
         assertEquals(1, queryListTitle().length);
+        assertEquals(2, queryRows().length);
       });
 
 });
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc
index 59295cd..48fdd6f 100644
--- a/chrome/test/ppapi/ppapi_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -130,7 +130,7 @@
 
 #define MAYBE_PPAPI_NACL(test_name) test_name
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
-    defined(OS_MACOSX) || defined(ADDRESS_SANITIZER)
+    BUILDFLAG(IS_MAC) || defined(ADDRESS_SANITIZER)
 // http://crbug.com/633067, http://crbug.com/727989, http://crbug.com/1076806
 #define MAYBE_PPAPI_PNACL(test_name) DISABLED_##test_name
 #else
diff --git a/chrome/tools/build/chromeos/FILES.cfg b/chrome/tools/build/chromeos/FILES.cfg
index 22aefc26..f245fa2 100644
--- a/chrome/tools/build/chromeos/FILES.cfg
+++ b/chrome/tools/build/chromeos/FILES.cfg
@@ -102,10 +102,10 @@
     'buildtype': ['official'],
   },
   {
-    'filename': 'libwidevinecdm.so',
-    'arch': ['32bit', '64bit', 'arm'],
+    'filename': 'WidevineCdm',
     'buildtype': ['official'],
     'direct_archive': 1,
+    'type': 'folder',
   },
   # Native Client plugin files:
   {
diff --git a/chrome/utility/importer/nss_decryptor.cc b/chrome/utility/importer/nss_decryptor.cc
index 57ce79f0..ac56513af 100644
--- a/chrome/utility/importer/nss_decryptor.cc
+++ b/chrome/utility/importer/nss_decryptor.cc
@@ -159,7 +159,7 @@
   const base::Value* disabled_hosts =
       parsed_json->FindListKey("disabledHosts");
   if (disabled_hosts) {
-    for (const auto& value : disabled_hosts->GetList()) {
+    for (const auto& value : disabled_hosts->GetListDeprecated()) {
       if (!value.is_string())
         continue;
       forms->push_back(CreateBlockedPasswordForm(value.GetString()));
@@ -168,7 +168,7 @@
 
   const base::Value* password_list = parsed_json->FindListKey("logins");
   if (password_list) {
-    for (const auto& value : password_list->GetList()) {
+    for (const auto& value : password_list->GetListDeprecated()) {
       if (!value.is_dict())
         continue;
 
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
index 5561e3d..22475f4 100644
--- a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
+++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
@@ -5,18 +5,23 @@
 package org.chromium.chromecast.shell;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.anyObject;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.reset;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
 import android.app.Activity;
 import android.content.Intent;
 import android.media.AudioManager;
 import android.os.Build;
 import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.Window;
 import android.view.WindowManager;
 
 import org.junit.Assert;
@@ -258,4 +263,49 @@
         mActivity.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
         Assert.assertFalse(mShadowActivity.isFinishing());
     }
+
+    @Test
+    public void testDispatchTouchEventWithTouchDisabled() {
+        CastWebContentsSurfaceHelper surfaceHelper = mock(CastWebContentsSurfaceHelper.class);
+        when(surfaceHelper.isTouchInputEnabled()).thenReturn(false);
+        mActivity.setSurfaceHelperForTesting(surfaceHelper);
+        mActivityLifecycle.create().start().resume();
+        MotionEvent event = mock(MotionEvent.class);
+        assertFalse(mActivity.dispatchTouchEvent(event));
+    }
+
+    @Test
+    public void testDispatchTouchEventWithTouchEnabled() {
+        CastWebContentsSurfaceHelper surfaceHelper = mock(CastWebContentsSurfaceHelper.class);
+        when(surfaceHelper.isTouchInputEnabled()).thenReturn(true);
+        mActivity.setSurfaceHelperForTesting(surfaceHelper);
+        Window window = mock(Window.class);
+        MotionEvent event = mock(MotionEvent.class);
+        when(event.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
+        when(window.superDispatchTouchEvent(event)).thenReturn(true);
+        mActivityLifecycle.create().start().resume();
+        mShadowActivity.setWindow(window);
+        assertTrue(mActivity.dispatchTouchEvent(event));
+    }
+
+    @Test
+    public void testDispatchTouchEventWithTouchEnabledButWindowDoesNotHandleIt() {
+        CastWebContentsSurfaceHelper surfaceHelper = mock(CastWebContentsSurfaceHelper.class);
+        when(surfaceHelper.isTouchInputEnabled()).thenReturn(true);
+        mActivity.setSurfaceHelperForTesting(surfaceHelper);
+        Window window = mock(Window.class);
+        MotionEvent event = mock(MotionEvent.class);
+        when(event.getAction()).thenReturn(MotionEvent.ACTION_DOWN);
+        when(window.superDispatchTouchEvent(event)).thenReturn(false);
+        mActivityLifecycle.create().start().resume();
+        mShadowActivity.setWindow(window);
+        assertFalse(mActivity.dispatchTouchEvent(event));
+    }
+
+    @Test
+    public void testDispatchTouchEventWithNoSurfaceHelper() {
+        mActivityLifecycle.create().start().resume();
+        MotionEvent event = mock(MotionEvent.class);
+        assertFalse(mActivity.dispatchTouchEvent(event));
+    }
 }
diff --git a/chromecast/browser/extensions/api/tts/tts_extension_api.cc b/chromecast/browser/extensions/api/tts/tts_extension_api.cc
index e3a18a6..aeb84fb 100644
--- a/chromecast/browser/extensions/api/tts/tts_extension_api.cc
+++ b/chromecast/browser/extensions/api/tts/tts_extension_api.cc
@@ -231,7 +231,7 @@
     const base::Value* list =
         options->FindListKey(constants::kRequiredEventTypesKey);
     EXTENSION_FUNCTION_VALIDATE(list);
-    for (const base::Value& i : list->GetList()) {
+    for (const base::Value& i : list->GetListDeprecated()) {
       const std::string* event_type = i.GetIfString();
       if (event_type) {
         required_event_types.insert(
@@ -245,7 +245,7 @@
     const base::Value* list =
         options->FindListKey(constants::kDesiredEventTypesKey);
     EXTENSION_FUNCTION_VALIDATE(list);
-    for (const base::Value& i : list->GetList()) {
+    for (const base::Value& i : list->GetListDeprecated()) {
       const std::string* event_type = i.GetIfString();
       if (event_type)
         desired_event_types.insert(TtsEventTypeFromString(event_type->c_str()));
diff --git a/chromecast/crash/linux/crash_testing_utils.cc b/chromecast/crash/linux/crash_testing_utils.cc
index 369ec92..dfd65268 100644
--- a/chromecast/crash/linux/crash_testing_utils.cc
+++ b/chromecast/crash/linux/crash_testing_utils.cc
@@ -71,7 +71,7 @@
   DCHECK(contents);
   std::string lockfile;
 
-  for (const auto& elem : contents->GetList()) {
+  for (const auto& elem : contents->GetListDeprecated()) {
     std::string dump_info;
     bool ret = base::JSONWriter::Write(elem, &dump_info);
     RCHECK(ret, -1, "Failed to serialize DumpInfo");
@@ -107,7 +107,7 @@
 
   dumps->clear();
 
-  for (const auto& elem : dump_list->GetList()) {
+  for (const auto& elem : dump_list->GetListDeprecated()) {
     std::unique_ptr<DumpInfo> dump(new DumpInfo(&elem));
     RCHECK(dump->valid(), false, "Invalid DumpInfo");
     dumps->push_back(std::move(dump));
diff --git a/chromecast/crash/linux/dump_info.cc b/chromecast/crash/linux/dump_info.cc
index 472146a..d946026 100644
--- a/chromecast/crash/linux/dump_info.cc
+++ b/chromecast/crash/linux/dump_info.cc
@@ -135,7 +135,7 @@
   const base::ListValue* attachments_list;
   if (dict->GetList(kAttachmentsKey, &attachments_list)) {
     ++num_params;
-    for (const auto& attachment : attachments_list->GetList()) {
+    for (const auto& attachment : attachments_list->GetListDeprecated()) {
       attachments_.push_back(attachment.GetString());
     }
   }
diff --git a/chromecast/crash/linux/synchronized_minidump_manager.cc b/chromecast/crash/linux/synchronized_minidump_manager.cc
index 4d073d9..b705883 100644
--- a/chromecast/crash/linux/synchronized_minidump_manager.cc
+++ b/chromecast/crash/linux/synchronized_minidump_manager.cc
@@ -326,7 +326,7 @@
   DCHECK(metadata);
   std::string lockfile;
 
-  for (const auto& elem : dumps->GetList()) {
+  for (const auto& elem : dumps->GetListDeprecated()) {
     std::string dump_info;
     bool ret = base::JSONWriter::Write(elem, &dump_info);
     RCHECK(ret, false);
@@ -372,7 +372,7 @@
 }
 
 bool SynchronizedMinidumpManager::RemoveEntryFromLockFile(int index) {
-  base::Value::ListView dumps_view = dumps_->GetList();
+  base::Value::ListView dumps_view = dumps_->GetListDeprecated();
   if (index < 0 || static_cast<size_t>(index) >= dumps_view.size())
     return false;
   return dumps_->EraseListIter(dumps_view.begin() + index);
@@ -396,7 +396,7 @@
 std::vector<std::unique_ptr<DumpInfo>> SynchronizedMinidumpManager::GetDumps() {
   std::vector<std::unique_ptr<DumpInfo>> dumps;
 
-  for (const auto& elem : dumps_->GetList()) {
+  for (const auto& elem : dumps_->GetListDeprecated()) {
     dumps.push_back(std::unique_ptr<DumpInfo>(new DumpInfo(&elem)));
   }
 
diff --git a/chromecast/media/cma/backend/mixer/mixer_pipeline.cc b/chromecast/media/cma/backend/mixer/mixer_pipeline.cc
index 8119961..1f229b33 100644
--- a/chromecast/media/cma/backend/mixer/mixer_pipeline.cc
+++ b/chromecast/media/cma/backend/mixer/mixer_pipeline.cc
@@ -73,11 +73,11 @@
     int input_channels = (stream_pipeline.num_input_channels.has_value()
                               ? stream_pipeline.num_input_channels.value()
                               : expected_input_channels);
-    const std::string& name = device_ids->GetList()[0].GetString();
+    const std::string& name = device_ids->GetListDeprecated()[0].GetString();
     LOG(INFO) << input_channels << " input channels to '" << name << "' group";
 
-    DCHECK(!device_ids->GetList().empty());
-    DCHECK(device_ids->GetList()[0].is_string());
+    DCHECK(!device_ids->GetListDeprecated().empty());
+    DCHECK(device_ids->GetListDeprecated()[0].is_string());
     filter_groups_.push_back(
         CreateFilterGroup(input_channels, name, stream_pipeline.pipeline,
                           factory, stream_pipeline.volume_limits));
@@ -150,7 +150,7 @@
   DCHECK(filter_group);
   DCHECK(ids->is_list());
 
-  for (const base::Value& stream_type_val : ids->GetList()) {
+  for (const base::Value& stream_type_val : ids->GetListDeprecated()) {
     DCHECK(stream_type_val.is_string());
     const std::string& stream_type = stream_type_val.GetString();
     if (!IsOutputDeviceId(stream_type)) {
diff --git a/chromecast/media/cma/backend/mixer/mock_post_processor_factory.cc b/chromecast/media/cma/backend/mixer/mock_post_processor_factory.cc
index 2cc24735..8310f35 100644
--- a/chromecast/media/cma/backend/mixer/mock_post_processor_factory.cc
+++ b/chromecast/media/cma/backend/mixer/mock_post_processor_factory.cc
@@ -31,7 +31,7 @@
   }
 
   // Parse |filter_description_list| for parameters.
-  for (const base::Value& elem : filter_description_list->GetList()) {
+  for (const base::Value& elem : filter_description_list->GetListDeprecated()) {
     CHECK(elem.is_dict());
     const base::Value* processor_val =
         elem.FindKeyOfType("processor", base::Value::Type::STRING);
diff --git a/chromecast/media/cma/backend/mixer/post_processing_pipeline_impl.cc b/chromecast/media/cma/backend/mixer/post_processing_pipeline_impl.cc
index e336146..adaa1252 100644
--- a/chromecast/media/cma/backend/mixer/post_processing_pipeline_impl.cc
+++ b/chromecast/media/cma/backend/mixer/post_processing_pipeline_impl.cc
@@ -56,7 +56,7 @@
     return;  // Warning logged.
   }
   for (const base::Value& processor_description_dict :
-       filter_description_list->GetList()) {
+       filter_description_list->GetListDeprecated()) {
     DCHECK(processor_description_dict.is_dict());
 
     std::string processor_name;
diff --git a/chromecast/media/cma/backend/mixer/post_processing_pipeline_parser.cc b/chromecast/media/cma/backend/mixer/post_processing_pipeline_parser.cc
index 2805c64..3f2eb26 100644
--- a/chromecast/media/cma/backend/mixer/post_processing_pipeline_parser.cc
+++ b/chromecast/media/cma/backend/mixer/post_processing_pipeline_parser.cc
@@ -95,7 +95,7 @@
     return descriptors;
   }
   for (const base::Value& pipeline_description_dict :
-       pipelines_list->GetList()) {
+       pipelines_list->GetListDeprecated()) {
     CHECK(pipeline_description_dict.is_dict());
 
     const base::Value* processors_list =
diff --git a/chromecast/media/cma/backend/volume_map.cc b/chromecast/media/cma/backend/volume_map.cc
index 9dbce0d..da361cd 100644
--- a/chromecast/media/cma/backend/volume_map.cc
+++ b/chromecast/media/cma/backend/volume_map.cc
@@ -66,7 +66,7 @@
 
   double prev_level = -1.0;
   std::vector<LevelToDb> new_map;
-  for (size_t i = 0; i < volume_map_list->GetList().size(); ++i) {
+  for (size_t i = 0; i < volume_map_list->GetListDeprecated().size(); ++i) {
     const base::DictionaryValue* volume_map_entry;
     CHECK(volume_map_list->GetDictionary(i, &volume_map_entry));
 
diff --git a/chromecast/public/reboot_shlib.h b/chromecast/public/reboot_shlib.h
index 3c6d3b9b..e34f1289 100644
--- a/chromecast/public/reboot_shlib.h
+++ b/chromecast/public/reboot_shlib.h
@@ -168,6 +168,15 @@
   // must result in any available OTA update getting applied upon the next
   // reboot (regardless of the RebootSource or cause of reboot).
   static void SetOtaForNextReboot();
+
+  // If IsClearOtaFromNextRebootSupported() returns true and
+  // ClearOtaForNextReboot() has been called, then the device will cancel any
+  // pending OTA waiting to be applied.
+  static bool IsClearOtaForNextRebootSupported();
+
+  // If IsClearOtaForNextRebootSupported() returns true then calling
+  // ClearOtaForNextReboot voids any prior call to SetOtaForNextReboot.
+  static void ClearOtaForNextReboot();
 };
 
 }  // namespace chromecast
diff --git a/chromecast/system/reboot/reboot_dummy.cc b/chromecast/system/reboot/reboot_dummy.cc
index dc2292a..0e525d3 100644
--- a/chromecast/system/reboot/reboot_dummy.cc
+++ b/chromecast/system/reboot/reboot_dummy.cc
@@ -45,4 +45,13 @@
 void RebootShlib::SetOtaForNextReboot() {
   NOTREACHED();
 }
+
+bool RebootShlib::IsClearOtaForNextRebootSupported() {
+  return false;
+}
+
+void RebootShlib::ClearOtaForNextReboot() {
+  NOTREACHED();
+}
+
 }  // namespace chromecast
diff --git a/chromecast/system/reboot/reboot_fuchsia.cc b/chromecast/system/reboot/reboot_fuchsia.cc
index e14975a6..d085540a 100644
--- a/chromecast/system/reboot/reboot_fuchsia.cc
+++ b/chromecast/system/reboot/reboot_fuchsia.cc
@@ -164,6 +164,14 @@
 // static
 void RebootShlib::SetOtaForNextReboot() {}
 
+// static
+bool RebootShlib::IsClearOtaForNextRebootSupported() {
+  return false;
+}
+
+// static
+void RebootShlib::ClearOtaForNextReboot() {}
+
 // RebootUtil implementation:
 
 // static
diff --git a/chromecast/system/reboot/reboot_util.h b/chromecast/system/reboot/reboot_util.h
index 21dd79e5c..433be28 100644
--- a/chromecast/system/reboot/reboot_util.h
+++ b/chromecast/system/reboot/reboot_util.h
@@ -45,6 +45,11 @@
   static bool IsOtaForNextRebootSupported();
   static void SetOtaForNextReboot();
 
+  // Before calling IsClearOtaForNextRebootSupported, the called must check
+  // if clearing the ota is supported.
+  static bool IsClearOtaForNextRebootSupported();
+  static void ClearOtaForNextReboot();
+
   // Returns last reboot source. This value persists throughout each boot.
   static RebootShlib::RebootSource GetLastRebootSource();
 
diff --git a/chromecast/system/reboot/reboot_util_core.cc b/chromecast/system/reboot/reboot_util_core.cc
index 1e27430..183171a 100644
--- a/chromecast/system/reboot/reboot_util_core.cc
+++ b/chromecast/system/reboot/reboot_util_core.cc
@@ -101,6 +101,18 @@
 }
 
 // static
+bool RebootUtil::IsClearOtaForNextRebootSupported() {
+  return RebootShlib::IsSupported() &&
+         RebootShlib::IsClearOtaForNextRebootSupported();
+}
+
+// static
+void RebootUtil::ClearOtaForNextReboot() {
+  DCHECK(IsClearOtaForNextRebootSupported());
+  RebootShlib::ClearOtaForNextReboot();
+}
+
+// static
 void RebootUtil::SetRebootCallbackForTest(
     const RebootUtil::RebootCallback& callback) {
   GetTestRebootCallback() = callback;
diff --git a/chromeos/components/onc/onc_parsed_certificates.cc b/chromeos/components/onc/onc_parsed_certificates.cc
index 04147f9f..14554fe4 100644
--- a/chromeos/components/onc/onc_parsed_certificates.cc
+++ b/chromeos/components/onc/onc_parsed_certificates.cc
@@ -49,7 +49,7 @@
   if (!trust_list)
     return false;
 
-  for (const base::Value& trust_entry : trust_list->GetList()) {
+  for (const base::Value& trust_entry : trust_list->GetListDeprecated()) {
     DCHECK(trust_entry.is_string());
 
     if (trust_entry.GetString() == ::onc::certificate::kWeb) {
diff --git a/chromeos/components/onc/onc_parsed_certificates_unittest.cc b/chromeos/components/onc/onc_parsed_certificates_unittest.cc
index 6dc5252..548a3e3 100644
--- a/chromeos/components/onc/onc_parsed_certificates_unittest.cc
+++ b/chromeos/components/onc/onc_parsed_certificates_unittest.cc
@@ -404,7 +404,7 @@
         authority_web_trust_mangled.GetList()[1].FindKeyOfType(
             "TrustBits", base::Value::Type::LIST);
     ASSERT_TRUE(trust_bits);
-    trust_bits->GetList()[0] = base::Value("UnknownTrustBit");
+    trust_bits->GetListDeprecated()[0] = base::Value("UnknownTrustBit");
 
     OncParsedCertificates parsed_authority_web_trust_mangled(
         authority_web_trust_mangled);
diff --git a/chromeos/components/onc/onc_utils.cc b/chromeos/components/onc/onc_utils.cc
index 7e137ff..a49d6fd 100644
--- a/chromeos/components/onc/onc_utils.cc
+++ b/chromeos/components/onc/onc_utils.cc
@@ -140,13 +140,13 @@
 
 // Fills HexSSID fields in all entries in the |network_configs| list.
 void FillInHexSSIDFieldsInNetworks(base::Value* network_configs) {
-  for (auto& network : network_configs->GetList())
+  for (auto& network : network_configs->GetListDeprecated())
     FillInHexSSIDFieldsInOncObject(kNetworkConfigurationSignature, &network);
 }
 
 // Sets HiddenSSID fields in all entries in the |network_configs| list.
 void SetHiddenSSIDFieldsInNetworks(base::Value* network_configs) {
-  for (auto& network : network_configs->GetList())
+  for (auto& network : network_configs->GetListDeprecated())
     SetHiddenSSIDFieldInOncObject(kNetworkConfigurationSignature, &network);
 }
 
@@ -212,7 +212,7 @@
     return true;
 
   base::Value pem_list(base::Value::Type::LIST);
-  for (const auto& entry : guid_ref_list->GetList()) {
+  for (const auto& entry : guid_ref_list->GetListDeprecated()) {
     std::string pem_encoded;
     if (!GUIDRefToPEMEncoding(certs_by_guid, entry.GetString(), &pem_encoded))
       return false;
@@ -483,7 +483,7 @@
 
 void ExpandStringsInNetworks(const VariableExpander& variable_expander,
                              base::Value* network_configs) {
-  for (auto& network : network_configs->GetList()) {
+  for (auto& network : network_configs->GetListDeprecated()) {
     DCHECK(network.is_dict());
     ExpandStringsInOncObject(kNetworkConfigurationSignature, variable_expander,
                              &network);
@@ -703,7 +703,7 @@
                                      base::Value* network_configs) {
   bool success = true;
   base::Value::ListStorage filtered_configs;
-  for (base::Value& network : network_configs->GetList()) {
+  for (base::Value& network : network_configs->GetListDeprecated()) {
     DCHECK(network.is_dict());
     if (!ResolveServerCertRefsInNetwork(certs_by_guid, &network)) {
       std::string* guid = network.FindStringKey(::onc::network_config::kGUID);
diff --git a/chromeos/components/onc/onc_utils_unittest.cc b/chromeos/components/onc/onc_utils_unittest.cc
index c294eebf..470c0bc46 100644
--- a/chromeos/components/onc/onc_utils_unittest.cc
+++ b/chromeos/components/onc/onc_utils_unittest.cc
@@ -117,8 +117,9 @@
     const base::ListValue* expected_resolved_onc = NULL;
     test_case->GetList("WithResolvedRefs", &expected_resolved_onc);
 
-    bool expected_success = (networks_with_cert_refs->GetList().size() ==
-                             expected_resolved_onc->GetList().size());
+    bool expected_success =
+        (networks_with_cert_refs->GetListDeprecated().size() ==
+         expected_resolved_onc->GetListDeprecated().size());
 
     base::Value actual_resolved_onc(networks_with_cert_refs->Clone());
     bool success = ResolveServerCertRefsInNetworks(certs, &actual_resolved_onc);
diff --git a/chromeos/components/onc/onc_validator.cc b/chromeos/components/onc/onc_validator.cc
index 5707327..f9fae2a 100644
--- a/chromeos/components/onc/onc_validator.cc
+++ b/chromeos/components/onc/onc_validator.cc
@@ -35,7 +35,7 @@
 
 void AddKeyToList(const char* key, base::Value* list) {
   base::Value key_value(key);
-  if (!base::Contains(list->GetList(), key_value))
+  if (!base::Contains(list->GetListDeprecated(), key_value))
     list->Append(std::move(key_value));
 }
 
@@ -48,8 +48,8 @@
                         const std::string& field_name) {
   const base::Value* recommended =
       object.FindKeyOfType(::onc::kRecommended, base::Value::Type::LIST);
-  return recommended &&
-         base::Contains(recommended->GetList(), base::Value(field_name));
+  return recommended && base::Contains(recommended->GetListDeprecated(),
+                                       base::Value(field_name));
 }
 
 bool FieldIsSetToValueOrRecommended(const base::Value& object,
@@ -280,7 +280,7 @@
   }
 
   base::Value repaired_recommended(base::Value::Type::LIST);
-  for (const auto& entry : recommended_value->GetList()) {
+  for (const auto& entry : recommended_value->GetListDeprecated()) {
     const std::string* field_name = entry.GetIfString();
     if (!field_name) {
       NOTREACHED();  // The types of field values are already verified.
@@ -440,7 +440,7 @@
     if (!(*str).empty())
       return false;
   } else if (value->is_list()) {
-    if (!value->GetList().empty())
+    if (!value->GetListDeprecated().empty())
       return false;
   } else {
     NOTREACHED();
@@ -488,7 +488,7 @@
   if (!list)
     return true;
   path_.push_back(field_name);
-  for (const auto& entry : list->GetList()) {
+  for (const auto& entry : list->GetListDeprecated()) {
     const std::string* value = entry.GetIfString();
     if (!value) {
       NOTREACHED();  // The types of field values are already verified.
@@ -978,7 +978,7 @@
     AddValidationIssue(true /* is_error */, msg.str());
     return false;
   }
-  for (const base::Value& p : peers->GetList()) {
+  for (const base::Value& p : peers->GetListDeprecated()) {
     if (!p.FindKey(::onc::wireguard::kPublicKey)) {
       msg << ::onc::wireguard::kPublicKey
           << " field is required for each peer.";
diff --git a/chromeos/components/onc/variable_expander.cc b/chromeos/components/onc/variable_expander.cc
index 0b12b52..59cce60 100644
--- a/chromeos/components/onc/variable_expander.cc
+++ b/chromeos/components/onc/variable_expander.cc
@@ -134,7 +134,7 @@
     }
 
     case base::Value::Type::LIST: {
-      for (base::Value& child : value->GetList())
+      for (base::Value& child : value->GetListDeprecated())
         no_error &= ExpandValue(&child);
       break;
     }
diff --git a/chromeos/components/onc/variable_expander_unittest.cc b/chromeos/components/onc/variable_expander_unittest.cc
index 40bef3c..1aa61c51 100644
--- a/chromeos/components/onc/variable_expander_unittest.cc
+++ b/chromeos/components/onc/variable_expander_unittest.cc
@@ -140,7 +140,8 @@
   VariableExpander expander({{"machine_name", "chromebook"}});
   EXPECT_TRUE(expander.ExpandValue(&root));
 
-  base::Value::ConstListView expanded_list = root.FindKey("list")->GetList();
+  base::Value::ConstListView expanded_list =
+      root.FindKey("list")->GetListDeprecated();
   EXPECT_EQ(expanded_list[0].GetInt(), 123);
   EXPECT_EQ(expanded_list[1].GetString(), "chromebook");
   EXPECT_EQ(expanded_list[2].GetBool(), true);
diff --git a/chromeos/components/quick_answers/quick_answers_model.h b/chromeos/components/quick_answers/quick_answers_model.h
index cc0130b..e8cdd1f 100644
--- a/chromeos/components/quick_answers/quick_answers_model.h
+++ b/chromeos/components/quick_answers/quick_answers_model.h
@@ -87,6 +87,7 @@
   QuickAnswerUiElement(const QuickAnswerUiElement&) = default;
   QuickAnswerUiElement& operator=(const QuickAnswerUiElement&) = default;
   QuickAnswerUiElement(QuickAnswerUiElement&&) = default;
+  virtual ~QuickAnswerUiElement() = default;
 
   QuickAnswerUiElementType type = QuickAnswerUiElementType::kUnknown;
 };
diff --git a/chromeos/components/quick_answers/search_result_parsers/result_parser.cc b/chromeos/components/quick_answers/search_result_parsers/result_parser.cc
index 5abebf6..1a13828 100644
--- a/chromeos/components/quick_answers/search_result_parsers/result_parser.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/result_parser.cc
@@ -24,7 +24,7 @@
     return nullptr;
   }
 
-  auto list = entries->GetList();
+  auto list = entries->GetListDeprecated();
   if (list.empty()) {
     // No valid dictionary entries found.
     return nullptr;
diff --git a/chromeos/components/quick_answers/search_result_parsers/search_response_parser.cc b/chromeos/components/quick_answers/search_result_parsers/search_response_parser.cc
index a2a017aa..3cb104d 100644
--- a/chromeos/components/quick_answers/search_result_parsers/search_response_parser.cc
+++ b/chromeos/components/quick_answers/search_result_parsers/search_response_parser.cc
@@ -62,7 +62,7 @@
     return;
   }
 
-  for (const auto& entry : entries->GetList()) {
+  for (const auto& entry : entries->GetListDeprecated()) {
     auto quick_answer = std::make_unique<QuickAnswer>();
     if (ProcessResult(&entry, quick_answer.get())) {
       std::move(complete_callback_).Run(std::move(quick_answer));
diff --git a/chromeos/components/quick_answers/translation_response_parser.cc b/chromeos/components/quick_answers/translation_response_parser.cc
index 6f193c31..48215bf 100644
--- a/chromeos/components/quick_answers/translation_response_parser.cc
+++ b/chromeos/components/quick_answers/translation_response_parser.cc
@@ -49,10 +49,11 @@
     return;
   }
 
-  DCHECK(translations->GetList().size() == 1);
+  DCHECK(translations->GetListDeprecated().size() == 1);
 
   const std::string* translated_text_ptr =
-      translations->GetList().front().FindStringPath("translatedText");
+      translations->GetListDeprecated().front().FindStringPath(
+          "translatedText");
   if (!translated_text_ptr) {
     LOG(ERROR) << "Can't find a translated text.";
     std::move(complete_callback_).Run(nullptr);
diff --git a/chromeos/components/quick_answers/utils/unit_converter.cc b/chromeos/components/quick_answers/utils/unit_converter.cc
index 07dc4b1..0291ab3 100644
--- a/chromeos/components/quick_answers/utils/unit_converter.cc
+++ b/chromeos/components/quick_answers/utils/unit_converter.cc
@@ -67,7 +67,7 @@
   // no proper unit found, return nullptr.
   const Value* dst_unit = nullptr;
   double min_rate = preferred_range;
-  for (const Value& unit : units->GetList()) {
+  for (const Value& unit : units->GetListDeprecated()) {
     const auto* name = unit.FindStringPath(kNamePath);
     const auto rate_a = unit.FindDoublePath(kConversionRateAPath);
     if (*name == *src_name || !rate_a.has_value() || rate_a.value() == 0)
diff --git a/chromeos/components/quick_answers/utils/unit_converter_unittest.cc b/chromeos/components/quick_answers/utils/unit_converter_unittest.cc
index a9e6727..b11491a 100644
--- a/chromeos/components/quick_answers/utils/unit_converter_unittest.cc
+++ b/chromeos/components/quick_answers/utils/unit_converter_unittest.cc
@@ -112,8 +112,8 @@
   auto* converter = CreateUnitConverter();
 
   auto* units = converter->GetPossibleUnitsForCategory(kMassCategory);
-  EXPECT_EQ(units->GetList().size(), 1u);
-  auto* unit = &(units->GetList())[0];
+  EXPECT_EQ(units->GetListDeprecated().size(), 1u);
+  auto* unit = &(units->GetListDeprecated())[0];
   EXPECT_EQ(unit->FindDoublePath(kConversionRateAPath), kKilogramRateA);
   EXPECT_EQ(*unit->FindStringPath(kNamePath), kKilogramName);
 }
diff --git a/chromeos/components/test/data/onc/ikev2_cert.onc b/chromeos/components/test/data/onc/ikev2_cert.onc
new file mode 100644
index 0000000..13e6d31c
--- /dev/null
+++ b/chromeos/components/test/data/onc/ikev2_cert.onc
@@ -0,0 +1,17 @@
+{ "GUID": "guid",
+  "Type": "VPN",
+  "Name": "MyIKEv2VPN",
+  "VPN": {
+    "Type": "IPsec",
+    "Host": "some.host.org",
+    "IPsec": {
+      "AuthenticationType": "Cert",
+      "ClientCertPKCS11Id": "1:123456abcdef",
+      "ClientCertType": "PKCS11Id",
+      "IKEVersion": 2,
+      "LocalIdentity": "local-id",
+      "RemoteIdentity": "remote-id",
+      "SaveCredentials": true,
+    },
+  }
+}
diff --git a/chromeos/components/test/data/onc/shill_ikev2_cert.json b/chromeos/components/test/data/onc/shill_ikev2_cert.json
new file mode 100644
index 0000000..a536f5c
--- /dev/null
+++ b/chromeos/components/test/data/onc/shill_ikev2_cert.json
@@ -0,0 +1,12 @@
+{ "GUID": "guid",
+  "Type": "vpn",
+  "Name": "MyIKEv2VPN",
+  "Provider.Host": "some.host.org",
+  "Provider.Type": "ikev2",
+  "IKEv2.AuthenticationType": "Cert",
+  "IKEv2.ClientCertID": "123456abcdef",
+  "IKEv2.ClientCertSlot": "1",
+  "IKEv2.LocalIdentity": "local-id",
+  "IKEv2.RemoteIdentity": "remote-id",
+  "SaveCredentials": true
+}
diff --git a/chromeos/components/test/data/onc/shill_output_ikev2_cert.json b/chromeos/components/test/data/onc/shill_output_ikev2_cert.json
new file mode 100644
index 0000000..2ddcc201a
--- /dev/null
+++ b/chromeos/components/test/data/onc/shill_output_ikev2_cert.json
@@ -0,0 +1,14 @@
+{ "GUID": "guid",
+  "Type": "vpn",
+  "Name": "MyIKEv2VPN",
+  "Provider": {
+    "Host": "some.host.org",
+    "IKEv2.AuthenticationType": "Cert",
+    "IKEv2.ClientCertID": "123456abcdef",
+    "IKEv2.ClientCertSlot": "1",
+    "IKEv2.LocalIdentity": "local-id",
+    "IKEv2.RemoteIdentity": "remote-id",
+    "Type": "ikev2"
+  },
+  "SaveCredentials": true
+}
diff --git a/chromeos/components/test/data/onc/translation_of_shill_ikev2_cert.onc b/chromeos/components/test/data/onc/translation_of_shill_ikev2_cert.onc
new file mode 100644
index 0000000..ad5edeb
--- /dev/null
+++ b/chromeos/components/test/data/onc/translation_of_shill_ikev2_cert.onc
@@ -0,0 +1,23 @@
+{ "GUID": "guid",
+  "Type": "VPN",
+  "Name": "MyIKEv2VPN",
+  "IPAddressConfigType":"DHCP",
+  "NameServersConfigType":"DHCP",
+  "VPN": {
+    "Type": "IPsec",
+    "Host": "some.host.org",
+    "IPsec": {
+      "AuthenticationType": "Cert",
+      "ClientCertPKCS11Id": "1:123456abcdef",
+      "ClientCertType": "PKCS11Id",
+      // This field is part of ONC (and is required). However, it does not
+      // exist explicitly in the Shill dictionary. As there is no use-case yet
+      // that requires reconstructing this field from a Shill dictionary, we
+      // don't translate it.
+      // "IKEVersion": 2,
+      "LocalIdentity": "local-id",
+      "SaveCredentials": true,
+      "RemoteIdentity": "remote-id",
+    },
+  }
+}
diff --git a/chromeos/crosapi/mojom/video_capture.mojom b/chromeos/crosapi/mojom/video_capture.mojom
index e1f1e048..5e247f2 100644
--- a/chromeos/crosapi/mojom/video_capture.mojom
+++ b/chromeos/crosapi/mojom/video_capture.mojom
@@ -56,12 +56,21 @@
 
 // Similar to |media.mojom.VideoBufferHandle| but does not contain fields which
 // are not used in Chrome OS implementation.
-// Next min field ID: 2
-[Stable]
+// Next min field ID: 3
+[Stable, Uuid="0259e126-6da3-4cbb-8774-da1a7bf7f2f8"]
 union VideoBufferHandle {
   handle<shared_buffer> shared_buffer_handle@0;
 
   GpuMemoryBufferHandle gpu_memory_buffer_handle@1;
+
+  // TODO(https://crbug.com/1261313): Until unions truly support versioning, we
+  // don't have a way to check this/it ends up ignored. Currently this is only
+  // set by code in ash to be read by lacros, which is strictly guaranteed to be
+  // flowing from an older version to a newer version, so this is fine. It can
+  // be proxied by checking if VideoCaptureDevice supports RequestRefreshFrame,
+  // which was added at the same time.
+  [MinVersion=1]
+  mojo_base.mojom.ReadOnlySharedMemoryRegion read_only_shmem_region@2;
 };
 
 [Stable, Extensible]
@@ -148,7 +157,7 @@
 };
 
 // Similar to |video_capture.mojom.Device| but depends on simplified structures.
-// Next min method ID: 7
+// Next min method ID: 8
 [Stable, Uuid="f50f1672-d512-451e-9c70-998ed45ab596"]
 interface VideoCaptureDevice {
   // It is assumed that it will be called only once.
@@ -166,6 +175,9 @@
   TakePhoto@5() => (media.mojom.Blob? blob);
 
   ProcessFeedback@6(media.mojom.VideoCaptureFeedback feedback);
+
+  [MinVersion = 1]
+  RequestRefreshFrame@7();
 };
 
 // Similar to |video_capture.mojom.DeviceFactory| but depends on simplified
diff --git a/chromeos/dbus/cros_disks/cros_disks_client.cc b/chromeos/dbus/cros_disks/cros_disks_client.cc
index 65b6d81..00afb4d 100644
--- a/chromeos/dbus/cros_disks/cros_disks_client.cc
+++ b/chromeos/dbus/cros_disks/cros_disks_client.cc
@@ -769,9 +769,9 @@
     device_type_ = DeviceMediaTypeToDeviceType(media_type_double.value());
 
   base::Value* mount_paths = value.FindListKey(cros_disks::kDeviceMountPaths);
-  if (mount_paths && !mount_paths->GetList().empty() &&
-      mount_paths->GetList()[0].is_string()) {
-    mount_path_ = mount_paths->GetList()[0].GetString();
+  if (mount_paths && !mount_paths->GetListDeprecated().empty() &&
+      mount_paths->GetListDeprecated()[0].is_string()) {
+    mount_path_ = mount_paths->GetListDeprecated()[0].GetString();
   }
 }
 
diff --git a/chromeos/dbus/power/power_policy_controller.cc b/chromeos/dbus/power/power_policy_controller.cc
index 9c3f84b..080b91a 100644
--- a/chromeos/dbus/power/power_policy_controller.cc
+++ b/chromeos/dbus/power/power_policy_controller.cc
@@ -156,7 +156,7 @@
     return false;
   }
 
-  for (const base::Value& item : entries->GetList()) {
+  for (const base::Value& item : entries->GetListDeprecated()) {
     const base::Value* week_day_value =
         item.FindKeyOfType({"day"}, base::Value::Type::STRING);
     const base::Value* start_time_hour =
@@ -211,7 +211,7 @@
     return false;
   }
 
-  for (const base::Value& item : entries->GetList()) {
+  for (const base::Value& item : entries->GetListDeprecated()) {
     const base::Value* week_day_value =
         item.FindKeyOfType({"day"}, base::Value::Type::STRING);
     const base::Value* charge_start_time_hour = item.FindPathOfType(
diff --git a/chromeos/dbus/shill/fake_shill_device_client.cc b/chromeos/dbus/shill/fake_shill_device_client.cc
index db89a706..76015326 100644
--- a/chromeos/dbus/shill/fake_shill_device_client.cc
+++ b/chromeos/dbus/shill/fake_shill_device_client.cc
@@ -277,7 +277,7 @@
     PostError("No Cellular scan results", std::move(error_callback));
     return;
   }
-  for (auto& network : scan_results->GetList()) {
+  for (auto& network : scan_results->GetListDeprecated()) {
     std::string id = network.FindKey(shill::kNetworkIdProperty)->GetString();
     std::string status = id == network_id ? "current" : "available";
     network.SetKey(shill::kStatusProperty, base::Value(status));
@@ -411,7 +411,7 @@
                                              base::ListValue());
   }
   base::Value new_result(base::Value::Type::DICTIONARY);
-  int idx = static_cast<int>(scan_results->GetList().size());
+  int idx = static_cast<int>(scan_results->GetListDeprecated().size());
   new_result.SetKey(shill::kNetworkIdProperty,
                     base::Value(base::StringPrintf("network%d", idx)));
   new_result.SetKey(shill::kLongNameProperty,
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.cc b/chromeos/dbus/shill/fake_shill_manager_client.cc
index f4a5135..de8b5e8 100644
--- a/chromeos/dbus/shill/fake_shill_manager_client.cc
+++ b/chromeos/dbus/shill/fake_shill_manager_client.cc
@@ -82,7 +82,7 @@
 
 // Returns whether added.
 bool AppendIfNotPresent(base::ListValue* list, base::Value value) {
-  if (base::Contains(list->GetList(), value))
+  if (base::Contains(list->GetListDeprecated(), value))
     return false;
   list->Append(std::move(value));
   return true;
@@ -662,7 +662,7 @@
   // ServiceCompleteList contains string path values for each service.
   base::Value* complete_path_list =
       stub_properties_.FindListKey(shill::kServiceCompleteListProperty);
-  if (!complete_path_list || complete_path_list->GetList().empty())
+  if (!complete_path_list || complete_path_list->GetListDeprecated().empty())
     return;
   base::Value prev_complete_path_list = complete_path_list->Clone();
 
@@ -678,7 +678,7 @@
 
   // Build a list of dictionaries for each service in the list.
   std::vector<base::Value> complete_dict_list;
-  for (const base::Value& value : complete_path_list->GetList()) {
+  for (const base::Value& value : complete_path_list->GetListDeprecated()) {
     std::string service_path = value.GetString();
     const base::Value* properties =
         ShillServiceClient::Get()->GetTestInterface()->GetServiceProperties(
@@ -1138,7 +1138,7 @@
   const base::Value* technologies =
       stub_properties_.FindListKey(shill::kEnabledTechnologiesProperty);
   if (technologies)
-    return base::Contains(technologies->GetList(), base::Value(type));
+    return base::Contains(technologies->GetListDeprecated(), base::Value(type));
   return false;
 }
 
@@ -1164,7 +1164,7 @@
   if (service_list) {
     ShillServiceClient::TestInterface* service_client =
         ShillServiceClient::Get()->GetTestInterface();
-    for (const base::Value& v : service_list->GetList()) {
+    for (const base::Value& v : service_list->GetListDeprecated()) {
       std::string service_path = v.GetString();
       const base::Value* properties =
           service_client->GetServiceProperties(service_path);
@@ -1181,7 +1181,7 @@
 }
 
 void FakeShillManagerClient::ClearProfiles() {
-  if (GetListProperty(shill::kProfilesProperty)->GetList().empty()) {
+  if (GetListProperty(shill::kProfilesProperty)->GetListDeprecated().empty()) {
     return;
   }
   GetListProperty(shill::kProfilesProperty)->ClearList();
diff --git a/chromeos/network/cellular_esim_profile_handler_impl.cc b/chromeos/network/cellular_esim_profile_handler_impl.cc
index 4147398..0b338102 100644
--- a/chromeos/network/cellular_esim_profile_handler_impl.cc
+++ b/chromeos/network/cellular_esim_profile_handler_impl.cc
@@ -79,7 +79,7 @@
   }
 
   std::vector<CellularESimProfile> profiles;
-  for (const base::Value& value : profiles_list->GetList()) {
+  for (const base::Value& value : profiles_list->GetListDeprecated()) {
     const base::DictionaryValue* dict;
     if (!value.GetAsDictionary(&dict)) {
       NET_LOG(ERROR) << "List item from eSIM profiles pref is not a dictionary";
@@ -201,7 +201,7 @@
   }
 
   base::flat_set<std::string> euicc_paths;
-  for (const auto& euicc : euicc_paths_from_prefs->GetList()) {
+  for (const auto& euicc : euicc_paths_from_prefs->GetListDeprecated()) {
     if (!euicc.is_string()) {
       NET_LOG(ERROR) << "Non-string EUICC path: " << euicc;
       continue;
diff --git a/chromeos/network/cellular_esim_uninstall_handler.cc b/chromeos/network/cellular_esim_uninstall_handler.cc
index 82fe994..cb6b4347 100644
--- a/chromeos/network/cellular_esim_uninstall_handler.cc
+++ b/chromeos/network/cellular_esim_uninstall_handler.cc
@@ -6,6 +6,7 @@
 
 #include "base/containers/flat_set.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/time/time.h"
 #include "chromeos/dbus/hermes/hermes_euicc_client.h"
 #include "chromeos/dbus/hermes/hermes_profile_client.h"
 #include "chromeos/network/cellular_esim_profile_handler.h"
@@ -22,19 +23,27 @@
 
 namespace chromeos {
 
+// static
+const base::TimeDelta CellularESimUninstallHandler::kNetworkListWaitTimeout =
+    base::Seconds(20);
+
 CellularESimUninstallHandler::UninstallRequest::UninstallRequest(
-    const std::string& iccid,
+    const absl::optional<std::string>& iccid,
     const absl::optional<dbus::ObjectPath>& esim_profile_path,
     const absl::optional<dbus::ObjectPath>& euicc_path,
+    bool reset_euicc,
     UninstallRequestCallback callback)
     : iccid(iccid),
       esim_profile_path(esim_profile_path),
       euicc_path(euicc_path),
+      reset_euicc(reset_euicc),
       callback(std::move(callback)) {}
 CellularESimUninstallHandler::UninstallRequest::~UninstallRequest() = default;
 
 CellularESimUninstallHandler::CellularESimUninstallHandler() = default;
-CellularESimUninstallHandler::~CellularESimUninstallHandler() = default;
+CellularESimUninstallHandler::~CellularESimUninstallHandler() {
+  OnShuttingDown();
+}
 
 void CellularESimUninstallHandler::Init(
     CellularInhibitor* cellular_inhibitor,
@@ -47,6 +56,8 @@
   network_configuration_handler_ = network_configuration_handler;
   network_connection_handler_ = network_connection_handler;
   network_state_handler_ = network_state_handler;
+
+  network_state_handler->AddObserver(this, FROM_HERE);
 }
 
 void CellularESimUninstallHandler::UninstallESim(
@@ -55,10 +66,39 @@
     const dbus::ObjectPath& euicc_path,
     UninstallRequestCallback callback) {
   uninstall_requests_.push_back(std::make_unique<UninstallRequest>(
-      iccid, esim_profile_path, euicc_path, std::move(callback)));
+      iccid, esim_profile_path, euicc_path, /*reset_euicc=*/false,
+      std::move(callback)));
   ProcessPendingUninstallRequests();
 }
 
+void CellularESimUninstallHandler::ResetEuiccMemory(
+    const dbus::ObjectPath& euicc_path,
+    UninstallRequestCallback callback) {
+  uninstall_requests_.push_back(std::make_unique<UninstallRequest>(
+      /*iccid=*/absl::nullopt, /*esim_profile_path=*/absl::nullopt, euicc_path,
+      /*reset_euicc=*/true, std::move(callback)));
+  ProcessPendingUninstallRequests();
+}
+
+void CellularESimUninstallHandler::NetworkListChanged() {
+  if (state_ != UninstallState::kWaitingForNetworkListUpdate) {
+    return;
+  }
+  // When removing multiple eSIM network services back to back after a Reset
+  // EUICC, uninstall handler will be in waiting state till next network list
+  // update before removing next configuration.
+  network_list_wait_timer_.Stop();
+  TransitionToUninstallState(UninstallState::kRemovingShillService);
+  AttemptRemoveShillService();
+}
+
+void CellularESimUninstallHandler::OnShuttingDown() {
+  if (network_state_handler_) {
+    network_state_handler_->RemoveObserver(this, FROM_HERE);
+    network_state_handler_ = nullptr;
+  }
+}
+
 void CellularESimUninstallHandler::ProcessPendingUninstallRequests() {
   // No requests to process.
   if (uninstall_requests_.empty())
@@ -69,10 +109,10 @@
   if (state_ != UninstallState::kIdle)
     return;
 
-  NET_LOG(EVENT) << "Starting eSIM uninstall. ICCID: "
-                 << GetIccidForCurrentRequest();
+  NET_LOG(EVENT) << "Starting eSIM uninstall for request "
+                 << *uninstall_requests_.front();
   TransitionToUninstallState(UninstallState::kCheckingNetworkState);
-  CheckNetworkState();
+  CheckActiveNetworkState();
 }
 
 void CellularESimUninstallHandler::TransitionToUninstallState(
@@ -90,8 +130,8 @@
       "Network.Cellular.ESim.UninstallProfile.OperationResult", result);
 
   const bool success = result == UninstallESimResult::kSuccess;
-  NET_LOG(EVENT) << "Completed uninstall request for ICCID "
-                 << GetIccidForCurrentRequest() << ". Success = " << success;
+  NET_LOG(EVENT) << "Completed uninstall request for "
+                 << *uninstall_requests_.front() << ". Success = " << success;
   std::move(uninstall_requests_.front()->callback).Run(success);
   uninstall_requests_.pop_front();
 
@@ -99,15 +139,17 @@
   ProcessPendingUninstallRequests();
 }
 
-const std::string& CellularESimUninstallHandler::GetIccidForCurrentRequest()
-    const {
-  return uninstall_requests_.front()->iccid;
-}
-
 const NetworkState*
 CellularESimUninstallHandler::GetNetworkStateForCurrentRequest() const {
+  absl::optional<std::string> current_request_iccid =
+      uninstall_requests_.front()->iccid;
+
+  if (!current_request_iccid) {
+    return nullptr;
+  }
+
   for (auto* const network : GetESimCellularNetworks()) {
-    if (network->iccid() == GetIccidForCurrentRequest()) {
+    if (network->iccid() == current_request_iccid) {
       return network;
     }
   }
@@ -115,28 +157,15 @@
   return nullptr;
 }
 
-void CellularESimUninstallHandler::CheckNetworkState() {
+void CellularESimUninstallHandler::CheckActiveNetworkState() {
   DCHECK_EQ(state_, UninstallState::kCheckingNetworkState);
 
-  const NetworkState* network = GetNetworkStateForCurrentRequest();
-  if (!network) {
-    NET_LOG(ERROR) << "Unable to find eSIM network with ICCID "
-                   << GetIccidForCurrentRequest();
-    CompleteCurrentRequest(UninstallESimResult::kNetworkNotFound);
-    return;
-  }
-
-  // If there is no profile path in the request then this is a stale service.
-  // Skip directly to configuration removal.
-  if (!uninstall_requests_.front()->esim_profile_path) {
-    TransitionToUninstallState(UninstallState::kRemovingShillService);
-    AttemptRemoveShillService();
-    return;
-  }
+  const NetworkState* network = network_state_handler_->ActiveNetworkByType(
+      NetworkTypePattern::Cellular());
 
   // If the network is connected, disconnect it before we attempt to uninstall
-  // the associated profile.
-  if (network->IsConnectedState()) {
+  // eSIM profiles.
+  if (network && network->IsConnectedState()) {
     TransitionToUninstallState(UninstallState::kDisconnectingNetwork);
     AttemptNetworkDisconnect(network);
     return;
@@ -170,8 +199,8 @@
     std::unique_ptr<base::DictionaryValue> error_data) {
   DCHECK_EQ(state_, UninstallState::kDisconnectingNetwork);
 
-  NET_LOG(ERROR) << "Failed disconnecting network with ICCID "
-                 << GetIccidForCurrentRequest();
+  NET_LOG(ERROR) << "Failed disconnecting network for request "
+                 << *uninstall_requests_.front();
   CompleteCurrentRequest(UninstallESimResult::kDisconnectFailed);
 }
 
@@ -189,8 +218,8 @@
   DCHECK_EQ(state_, UninstallState::kInhibitingShill);
 
   if (!inhibit_lock) {
-    NET_LOG(ERROR) << "Error inhbiting Shill during uninstall for ICCID "
-                   << GetIccidForCurrentRequest();
+    NET_LOG(ERROR) << "Error inhbiting Shill during uninstall for request "
+                   << *uninstall_requests_.front();
     CompleteCurrentRequest(UninstallESimResult::kInhibitFailed);
     return;
   }
@@ -218,8 +247,9 @@
   DCHECK_EQ(state_, UninstallState::kRequestingInstalledProfiles);
 
   if (!inhibit_lock) {
-    NET_LOG(ERROR) << "Error refreshing profile list during uninstall for "
-                   << "ICCID " << GetIccidForCurrentRequest();
+    NET_LOG(ERROR)
+        << "Error refreshing profile list during uninstall for request "
+        << *uninstall_requests_.front();
     CompleteCurrentRequest(UninstallESimResult::kRefreshProfilesFailed);
     return;
   }
@@ -234,8 +264,20 @@
 
 void CellularESimUninstallHandler::AttemptDisableProfile() {
   DCHECK_EQ(state_, UninstallState::kDisablingProfile);
+  absl::optional<dbus::ObjectPath> esim_profile_path;
+  if (uninstall_requests_.front()->reset_euicc) {
+    esim_profile_path = GetEnabledCellularESimProfilePath();
+    // Skip disabling profile if there are no enabled profiles.
+    if (!esim_profile_path) {
+      TransitionToUninstallState(UninstallState::kUninstallingProfile);
+      AttemptUninstallProfile();
+      return;
+    }
+  } else {
+    esim_profile_path = uninstall_requests_.front()->esim_profile_path;
+  }
   HermesProfileClient::Get()->DisableCarrierProfile(
-      *uninstall_requests_.front()->esim_profile_path,
+      *esim_profile_path,
       base::BindOnce(&CellularESimUninstallHandler::OnDisableProfile,
                      weak_ptr_factory_.GetWeakPtr()));
 }
@@ -249,8 +291,8 @@
   bool success = status == HermesResponseStatus::kSuccess ||
                  status == HermesResponseStatus::kErrorAlreadyDisabled;
   if (!success) {
-    NET_LOG(ERROR) << "Failed to disable profile for ICCID "
-                   << GetIccidForCurrentRequest();
+    NET_LOG(ERROR) << "Failed to disable profile for request "
+                   << *uninstall_requests_.front();
     CompleteCurrentRequest(UninstallESimResult::kDisableProfileFailed);
     return;
   }
@@ -262,6 +304,15 @@
 void CellularESimUninstallHandler::AttemptUninstallProfile() {
   DCHECK_EQ(state_, UninstallState::kUninstallingProfile);
 
+  if (uninstall_requests_.front()->reset_euicc) {
+    HermesEuiccClient::Get()->ResetMemory(
+        *uninstall_requests_.front()->euicc_path,
+        hermes::euicc::ResetOptions::kDeleteOperationalProfiles,
+        base::BindOnce(&CellularESimUninstallHandler::OnUninstallProfile,
+                       weak_ptr_factory_.GetWeakPtr()));
+    return;
+  }
+
   HermesEuiccClient::Get()->UninstallProfile(
       *uninstall_requests_.front()->euicc_path,
       *uninstall_requests_.front()->esim_profile_path,
@@ -273,11 +324,13 @@
     HermesResponseStatus status) {
   DCHECK_EQ(state_, UninstallState::kUninstallingProfile);
 
-  hermes_metrics::LogUninstallProfileResult(status);
+  if (!uninstall_requests_.front()->reset_euicc) {
+    hermes_metrics::LogUninstallProfileResult(status);
+  }
 
   if (status != HermesResponseStatus::kSuccess) {
-    NET_LOG(ERROR) << "Failed to uninstall profile for ICCID "
-                   << GetIccidForCurrentRequest();
+    NET_LOG(ERROR) << "Failed to uninstall profile for request "
+                   << *uninstall_requests_.front();
     CompleteCurrentRequest(UninstallESimResult::kUninstallProfileFailed);
     return;
   }
@@ -289,22 +342,33 @@
 void CellularESimUninstallHandler::AttemptRemoveShillService() {
   DCHECK_EQ(state_, UninstallState::kRemovingShillService);
 
-  const NetworkState* network = GetNetworkStateForCurrentRequest();
-  if (!network) {
-    NET_LOG(ERROR) << "Unable to find eSIM network with ICCID "
-                   << GetIccidForCurrentRequest();
-    CompleteCurrentRequest(UninstallESimResult::kRemoveServiceFailed);
-    return;
+  const NetworkState* network = nullptr;
+  if (uninstall_requests_.front()->reset_euicc) {
+    network = GetNextResetServiceToRemove();
+    if (!network) {
+      CompleteCurrentRequest(UninstallESimResult::kSuccess);
+      return;
+    }
+  } else {
+    network = GetNetworkStateForCurrentRequest();
+    if (!network) {
+      NET_LOG(ERROR) << "Unable to find eSIM network for request "
+                     << *uninstall_requests_.front();
+      CompleteCurrentRequest(UninstallESimResult::kRemoveServiceFailed);
+      return;
+    }
+
+    // Return success immediately for non-shill eSIM cellular networks since we
+    // don't know the actual shill service path. This stub non-shill service
+    // will be removed automatically when the eSIM profile list updates.
+    if (network->IsNonShillCellularNetwork()) {
+      CompleteCurrentRequest(UninstallESimResult::kSuccess);
+      return;
+    }
   }
 
-  // Return success immediately for non-shill eSIM cellular networks since we
-  // don't know the actual shill service path. This stub non-shill service will
-  // be removed automatically when the eSIM profile list updates.
-  if (network->IsNonShillCellularNetwork()) {
-    CompleteCurrentRequest(UninstallESimResult::kSuccess);
-    return;
-  }
-
+  NET_LOG(EVENT) << "Attempting to remove Shill service for network: "
+                 << network->path();
   network_configuration_handler_->RemoveConfiguration(
       network->path(), absl::nullopt,
       base::BindOnce(&CellularESimUninstallHandler::OnRemoveServiceSuccess,
@@ -315,6 +379,16 @@
 
 void CellularESimUninstallHandler::OnRemoveServiceSuccess() {
   DCHECK_EQ(state_, UninstallState::kRemovingShillService);
+  if (uninstall_requests_.front()->reset_euicc) {
+    // Wait for next network list update before removing the next shill service.
+    TransitionToUninstallState(UninstallState::kWaitingForNetworkListUpdate);
+    network_list_wait_timer_.Start(
+        FROM_HERE, kNetworkListWaitTimeout,
+        base::BindOnce(&CellularESimUninstallHandler::OnNetworkListWaitTimeout,
+                       weak_ptr_factory_.GetWeakPtr()));
+    return;
+  }
+
   CompleteCurrentRequest(UninstallESimResult::kSuccess);
 }
 
@@ -322,11 +396,18 @@
     const std::string& error_name,
     std::unique_ptr<base::DictionaryValue> error_data) {
   DCHECK_EQ(state_, UninstallState::kRemovingShillService);
-  NET_LOG(ERROR) << "Error removing service with ICCID "
-                 << GetIccidForCurrentRequest() << ". Error: " << error_name;
+  NET_LOG(ERROR) << "Error removing service for request "
+                 << *uninstall_requests_.front() << ". Error: " << error_name;
   CompleteCurrentRequest(UninstallESimResult::kRemoveServiceFailed);
 }
 
+void CellularESimUninstallHandler::OnNetworkListWaitTimeout() {
+  NET_LOG(ERROR)
+      << "Timedout waiting for network list update after removing service.";
+  TransitionToUninstallState(UninstallState::kRemovingShillService);
+  AttemptRemoveShillService();
+}
+
 NetworkStateHandler::NetworkStateList
 CellularESimUninstallHandler::GetESimCellularNetworks() const {
   NetworkStateHandler::NetworkStateList network_list;
@@ -345,14 +426,33 @@
   return network_list;
 }
 
-bool CellularESimUninstallHandler::HasQueuedRequest(
-    const std::string& iccid) const {
-  const auto iter = std::find_if(
-      uninstall_requests_.begin(), uninstall_requests_.end(),
-      [&](const std::unique_ptr<UninstallRequest>& uninstall_request) {
-        return uninstall_request->iccid == iccid;
-      });
-  return iter != uninstall_requests_.end();
+absl::optional<dbus::ObjectPath>
+CellularESimUninstallHandler::GetEnabledCellularESimProfilePath() {
+  for (const auto& esim_profile :
+       cellular_esim_profile_handler_->GetESimProfiles()) {
+    if (esim_profile.state() == CellularESimProfile::State::kActive) {
+      return esim_profile.path();
+    }
+  }
+  return absl::nullopt;
+}
+
+const NetworkState* CellularESimUninstallHandler::GetNextResetServiceToRemove()
+    const {
+  HermesEuiccClient::Properties* euicc_properties =
+      HermesEuiccClient::Get()->GetProperties(
+          *uninstall_requests_.front()->euicc_path);
+  const std::string& eid = euicc_properties->eid().value();
+  for (const NetworkState* network : GetESimCellularNetworks()) {
+    // Non Shill cellular services cannot be removed. They'll be automatically
+    // removed when eSIM profile list updates.
+    if (network->IsNonShillCellularNetwork()) {
+      continue;
+    }
+    if (network->eid() == eid)
+      return network;
+  }
+  return nullptr;
 }
 
 std::ostream& operator<<(
@@ -384,8 +484,23 @@
     case CellularESimUninstallHandler::UninstallState::kRemovingShillService:
       stream << "[Removing Shill Service]";
       break;
+    case CellularESimUninstallHandler::UninstallState::
+        kWaitingForNetworkListUpdate:
+      stream << "[Waiting for network list update]";
+      break;
   }
   return stream;
 }
 
-}  // namespace chromeos
\ No newline at end of file
+std::ostream& operator<<(
+    std::ostream& stream,
+    const CellularESimUninstallHandler::UninstallRequest& request) {
+  if (request.reset_euicc) {
+    stream << "(ResetEuicc)";
+  } else {
+    stream << "(ICCID: " << *request.iccid << ")";
+  }
+  return stream;
+}
+
+}  // namespace chromeos
diff --git a/chromeos/network/cellular_esim_uninstall_handler.h b/chromeos/network/cellular_esim_uninstall_handler.h
index e805d803..bd715109 100644
--- a/chromeos/network/cellular_esim_uninstall_handler.h
+++ b/chromeos/network/cellular_esim_uninstall_handler.h
@@ -16,6 +16,7 @@
 #include "chromeos/network/cellular_esim_profile_handler.h"
 #include "chromeos/network/cellular_inhibitor.h"
 #include "chromeos/network/network_state_handler.h"
+#include "chromeos/network/network_state_handler_observer.h"
 #include "dbus/object_path.h"
 
 namespace chromeos {
@@ -45,13 +46,14 @@
 // issues where some stale networks showing in UI because its Shill
 // configuration doesn't get removed properly during the uninstallation.
 // TODO(b/210726568)
-class COMPONENT_EXPORT(CHROMEOS_NETWORK) CellularESimUninstallHandler {
+class COMPONENT_EXPORT(CHROMEOS_NETWORK) CellularESimUninstallHandler
+    : public NetworkStateHandlerObserver {
  public:
   CellularESimUninstallHandler();
   CellularESimUninstallHandler(const CellularESimUninstallHandler&) = delete;
   CellularESimUninstallHandler& operator=(const CellularESimUninstallHandler&) =
       delete;
-  ~CellularESimUninstallHandler();
+  ~CellularESimUninstallHandler() override;
 
   void Init(CellularInhibitor* cellular_inhibitor,
             CellularESimProfileHandler* cellular_esim_profile_handler,
@@ -71,7 +73,16 @@
                      const dbus::ObjectPath& euicc_path,
                      UninstallRequestCallback callback);
 
+  // Resets memory ie. Removes all eSIM profiles on the Euicc with given
+  // |euicc_path|.
+  void ResetEuiccMemory(const dbus::ObjectPath& euicc_path,
+                        UninstallRequestCallback callback);
+
  private:
+  // NetworkStateHandlerObserver:
+  void NetworkListChanged() override;
+  void OnShuttingDown() override;
+
   friend class CellularESimUninstallHandlerTest;
   FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, Success);
   FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest,
@@ -81,6 +92,11 @@
   FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, MultipleRequests);
   FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest,
                            StubCellularNetwork);
+  FRIEND_TEST_ALL_PREFIXES(CellularESimUninstallHandlerTest, ResetEuiccMemory);
+
+  // Timeout when waiting for network list change after removing network
+  // service. Service removal continues with next service.
+  static const base::TimeDelta kNetworkListWaitTimeout;
 
   enum class UninstallState {
     kIdle,
@@ -91,6 +107,7 @@
     kDisablingProfile,
     kUninstallingProfile,
     kRemovingShillService,
+    kWaitingForNetworkListUpdate,
   };
   friend std::ostream& operator<<(std::ostream& stream,
                                   const UninstallState& step);
@@ -114,26 +131,30 @@
   // for stale eSIM service removal requests. These requests skip directly to
   // Shill configuration removal.
   struct UninstallRequest {
-    UninstallRequest(const std::string& iccid,
+    UninstallRequest(const absl::optional<std::string>& iccid,
                      const absl::optional<dbus::ObjectPath>& esim_profile_path,
                      const absl::optional<dbus::ObjectPath>& euicc_path,
+                     bool reset_euicc,
                      UninstallRequestCallback callback);
     ~UninstallRequest();
-    std::string iccid;
+    absl::optional<std::string> iccid;
     absl::optional<dbus::ObjectPath> esim_profile_path;
     absl::optional<dbus::ObjectPath> euicc_path;
+    bool reset_euicc;
     UninstallRequestCallback callback;
     std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock;
   };
+  friend std::ostream& operator<<(std::ostream& stream,
+                                  const UninstallRequest& request);
 
   void ProcessPendingUninstallRequests();
   void TransitionToUninstallState(UninstallState next_state);
   void CompleteCurrentRequest(UninstallESimResult result);
 
-  const std::string& GetIccidForCurrentRequest() const;
+  std::string GetIdForCurrentRequest() const;
   const NetworkState* GetNetworkStateForCurrentRequest() const;
 
-  void CheckNetworkState();
+  void CheckActiveNetworkState();
 
   void AttemptNetworkDisconnect(const NetworkState* network);
   void OnDisconnectSuccess();
@@ -159,13 +180,17 @@
   void OnRemoveServiceFailure(
       const std::string& error_name,
       std::unique_ptr<base::DictionaryValue> error_data);
+  void OnNetworkListWaitTimeout();
 
+  absl::optional<dbus::ObjectPath> GetEnabledCellularESimProfilePath();
   NetworkStateHandler::NetworkStateList GetESimCellularNetworks() const;
-  bool HasQueuedRequest(const std::string& iccid) const;
+  const NetworkState* GetNextResetServiceToRemove() const;
 
   UninstallState state_ = UninstallState::kIdle;
   base::circular_deque<std::unique_ptr<UninstallRequest>> uninstall_requests_;
 
+  base::OneShotTimer network_list_wait_timer_;
+
   CellularInhibitor* cellular_inhibitor_ = nullptr;
   CellularESimProfileHandler* cellular_esim_profile_handler_ = nullptr;
   NetworkConfigurationHandler* network_configuration_handler_ = nullptr;
diff --git a/chromeos/network/cellular_esim_uninstall_handler_unittest.cc b/chromeos/network/cellular_esim_uninstall_handler_unittest.cc
index 9c9fb3e..8c70183 100644
--- a/chromeos/network/cellular_esim_uninstall_handler_unittest.cc
+++ b/chromeos/network/cellular_esim_uninstall_handler_unittest.cc
@@ -147,6 +147,15 @@
         }));
   }
 
+  void ResetEuiccMemory(base::RunLoop& run_loop, bool& status) {
+    cellular_esim_uninstall_handler_->ResetEuiccMemory(
+        dbus::ObjectPath(kDefaultEuiccPath),
+        base::BindLambdaForTesting([&](bool status_result) {
+          status = status_result;
+          std::move(run_loop.QuitClosure()).Run();
+        }));
+  }
+
   void HandleNetworkDisconnect(bool should_fail) {
     // Run until the uninstallation state hits the disconnect on the
     // FakeNetworkConnectionHandler.
@@ -188,8 +197,14 @@
         expected_count);
   }
 
+  void FastForward(base::TimeDelta time) {
+    task_environment_.FastForwardBy(time);
+  }
+
  private:
-  base::test::SingleThreadTaskEnvironment task_environment_;
+  base::test::SingleThreadTaskEnvironment task_environment_{
+      base::test::SingleThreadTaskEnvironment::MainThreadType::UI,
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
 
   base::HistogramTester histogram_tester_;
   std::unique_ptr<NetworkStateHandler> network_state_handler_;
@@ -321,6 +336,34 @@
                /*expected_count=*/2);
 }
 
+TEST_F(CellularESimUninstallHandlerTest, ResetEuiccMemory) {
+  Init();
+  EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath));
+  EXPECT_TRUE(ESimServiceConfigExists(kTestNetworkServicePath2));
+
+  bool status;
+  base::RunLoop run_loop;
+  ResetEuiccMemory(run_loop, status);
+
+  HandleNetworkDisconnect(/*should_fail=*/false);
+  FastForward(CellularESimUninstallHandler::kNetworkListWaitTimeout);
+
+  run_loop.Run();
+
+  // Verify that both profiles were removed successfully.
+  EXPECT_TRUE(status);
+  HermesEuiccClient::Properties* euicc_properties =
+      HermesEuiccClient::Get()->GetProperties(
+          dbus::ObjectPath(kDefaultEuiccPath));
+  ASSERT_TRUE(euicc_properties);
+  EXPECT_TRUE(euicc_properties->installed_carrier_profiles().value().empty());
+  EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath));
+  EXPECT_FALSE(ESimServiceConfigExists(kTestNetworkServicePath2));
+
+  ExpectResult(CellularESimUninstallHandler::UninstallESimResult::kSuccess,
+               /*expected_count=*/1);
+}
+
 TEST_F(CellularESimUninstallHandlerTest, StubCellularNetwork) {
   Init();
 
diff --git a/chromeos/network/client_cert_util.cc b/chromeos/network/client_cert_util.cc
index 1026b385..a31cf4e 100644
--- a/chromeos/network/client_cert_util.cc
+++ b/chromeos/network/client_cert_util.cc
@@ -122,6 +122,7 @@
       shill_properties.FindDictKey(shill::kProviderProperty);
   if (provider_properties) {
     const std::string* pkcs11_id_str = nullptr;
+
     // Look for OpenVPN specific properties.
     pkcs11_id_str =
         provider_properties->FindStringKey(shill::kOpenVPNClientCertIdProperty);
@@ -130,6 +131,7 @@
       *cert_config_type = CONFIG_TYPE_OPENVPN;
       return;
     }
+
     // Look for L2TP-IPsec specific properties.
     pkcs11_id_str = provider_properties->FindStringKey(
         shill::kL2tpIpsecClientCertIdProperty);
@@ -144,7 +146,24 @@
         return;
       }
 
-      *cert_config_type = CONFIG_TYPE_IPSEC;
+      *cert_config_type = CONFIG_TYPE_L2TP_IPSEC;
+    }
+
+    // Look for IKEv2 specific properties.
+    pkcs11_id_str =
+        provider_properties->FindStringKey(shill::kIKEv2ClientCertIdProperty);
+    if (pkcs11_id_str) {
+      *pkcs11_id = *pkcs11_id_str;
+
+      const std::string* cert_slot = provider_properties->FindStringKey(
+          shill::kIKEv2ClientCertSlotProperty);
+      if (cert_slot && !cert_slot->empty() &&
+          !base::StringToInt(*cert_slot, tpm_slot)) {
+        LOG(ERROR) << "Cert slot is not an integer: " << *cert_slot << ".";
+        return;
+      }
+
+      *cert_config_type = CONFIG_TYPE_IKEV2;
     }
     return;
   }
@@ -183,12 +202,12 @@
     case CONFIG_TYPE_OPENVPN: {
       properties->SetKey(shill::kOpenVPNPinProperty,
                          base::Value(kDefaultTPMPin));
-      // Note: OpemVPN does not have a slot property, see crbug.com/769550.
+      // Note: OpenVPN does not have a slot property, see crbug.com/769550.
       properties->SetKey(shill::kOpenVPNClientCertIdProperty,
                          base::Value(pkcs11_id));
       break;
     }
-    case CONFIG_TYPE_IPSEC: {
+    case CONFIG_TYPE_L2TP_IPSEC: {
       properties->SetKey(shill::kL2tpIpsecPinProperty,
                          base::Value(kDefaultTPMPin));
       properties->SetKey(shill::kL2tpIpsecClientCertSlotProperty,
@@ -197,6 +216,15 @@
                          base::Value(pkcs11_id));
       break;
     }
+    case CONFIG_TYPE_IKEV2: {
+      // PIN property is not used by shill for a IKEv2 service since it is a
+      // fixed value.
+      properties->SetKey(shill::kIKEv2ClientCertSlotProperty,
+                         base::Value(base::NumberToString(tpm_slot)));
+      properties->SetKey(shill::kIKEv2ClientCertIdProperty,
+                         base::Value(pkcs11_id));
+      break;
+    }
     case CONFIG_TYPE_EAP: {
       properties->SetKey(shill::kEapPinProperty, base::Value(kDefaultTPMPin));
       std::string key_id =
@@ -225,7 +253,7 @@
                          base::Value(std::string()));
       break;
     }
-    case CONFIG_TYPE_IPSEC: {
+    case CONFIG_TYPE_L2TP_IPSEC: {
       properties->SetKey(shill::kL2tpIpsecPinProperty,
                          base::Value(std::string()));
       properties->SetKey(shill::kL2tpIpsecClientCertSlotProperty,
@@ -234,6 +262,15 @@
                          base::Value(std::string()));
       break;
     }
+    case CONFIG_TYPE_IKEV2: {
+      // PIN property is not used by shill for a IKEv2 service since it is a
+      // fixed value.
+      properties->SetKey(shill::kIKEv2ClientCertSlotProperty,
+                         base::Value(std::string()));
+      properties->SetKey(shill::kIKEv2ClientCertIdProperty,
+                         base::Value(std::string()));
+      break;
+    }
     case CONFIG_TYPE_EAP: {
       properties->SetKey(shill::kEapPinProperty, base::Value(std::string()));
       // Shill requires both CertID and KeyID for TLS connections, despite the
@@ -248,8 +285,7 @@
 
 ClientCertConfig::ClientCertConfig()
     : location(CONFIG_TYPE_NONE),
-      client_cert_type(onc::client_cert::kClientCertTypeNone) {
-}
+      client_cert_type(onc::client_cert::kClientCertTypeNone) {}
 
 ClientCertConfig::ClientCertConfig(const ClientCertConfig& other) = default;
 
@@ -278,12 +314,17 @@
   if (vpn) {
     const base::Value* openvpn = vpn->FindDictKey(::onc::vpn::kOpenVPN);
     const base::Value* ipsec = vpn->FindDictKey(::onc::vpn::kIPsec);
+    const base::Value* l2tp = vpn->FindDictKey(::onc::vpn::kL2TP);
     if (openvpn) {
       dict_with_client_cert = openvpn;
       cert_config->location = CONFIG_TYPE_OPENVPN;
     } else if (ipsec) {
       dict_with_client_cert = ipsec;
-      cert_config->location = CONFIG_TYPE_IPSEC;
+      // Currently we support two kinds of IPsec-based VPN:
+      // - L2TP/IPsec: IKE version is 1 and |l2tp| is set;
+      // - IKEv2: IKE version is 2 and |l2tp| is not set.
+      // Thus we only use |l2tp| to distinguish between these two cases.
+      cert_config->location = l2tp ? CONFIG_TYPE_L2TP_IPSEC : CONFIG_TYPE_IKEV2;
     } else {
       return;
     }
diff --git a/chromeos/network/client_cert_util.h b/chromeos/network/client_cert_util.h
index 7102bdb..f5f0edb 100644
--- a/chromeos/network/client_cert_util.h
+++ b/chromeos/network/client_cert_util.h
@@ -26,8 +26,12 @@
 enum ConfigType {
   CONFIG_TYPE_NONE,
   CONFIG_TYPE_OPENVPN,
-  CONFIG_TYPE_IPSEC,
-  CONFIG_TYPE_EAP
+  // We need two separate types for L2TP/IPsec and IKEv2: both of them are used
+  // for IPsec and have the same properties, the only difference is that they
+  // are mapped to different sets of shill service properties.
+  CONFIG_TYPE_L2TP_IPSEC,
+  CONFIG_TYPE_IKEV2,
+  CONFIG_TYPE_EAP,
 };
 
 struct COMPONENT_EXPORT(CHROMEOS_NETWORK) ClientCertConfig {
diff --git a/chromeos/network/geolocation_handler.cc b/chromeos/network/geolocation_handler.cc
index 995501e6..2d2bd63 100644
--- a/chromeos/network/geolocation_handler.cc
+++ b/chromeos/network/geolocation_handler.cc
@@ -173,7 +173,7 @@
     }
 
     // List[Dictionary<key, value_str>]
-    for (const auto& entry : entry_list->GetList()) {
+    for (const auto& entry : entry_list->GetListDeprecated()) {
       if (!entry.is_dict()) {
         LOG(WARNING) << "Geolocation list value not a Dictionary";
         continue;
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc
index 8bed79d..0399637 100644
--- a/chromeos/network/managed_network_configuration_handler_impl.cc
+++ b/chromeos/network/managed_network_configuration_handler_impl.cc
@@ -892,7 +892,7 @@
     return std::vector<std::string>();
 
   std::vector<std::string> blocked_hex_ssids;
-  for (const base::Value& entry : blocked_value->GetList())
+  for (const base::Value& entry : blocked_value->GetListDeprecated())
     blocked_hex_ssids.push_back(entry.GetString());
   return blocked_hex_ssids;
 }
diff --git a/chromeos/network/managed_network_configuration_handler_unittest.cc b/chromeos/network/managed_network_configuration_handler_unittest.cc
index c97b160..7391ece3 100644
--- a/chromeos/network/managed_network_configuration_handler_unittest.cc
+++ b/chromeos/network/managed_network_configuration_handler_unittest.cc
@@ -293,7 +293,8 @@
     const base::Value* found_network_configs = validated_policy.FindListKey(
         ::onc::toplevel_config::kNetworkConfigurations);
     if (found_network_configs) {
-      for (const auto& network_config : found_network_configs->GetList()) {
+      for (const auto& network_config :
+           found_network_configs->GetListDeprecated()) {
         network_configs.Append(network_config.Clone());
       }
     }
diff --git a/chromeos/network/network_connection_handler_impl.cc b/chromeos/network/network_connection_handler_impl.cc
index 8e8970d..ca0a67f 100644
--- a/chromeos/network/network_connection_handler_impl.cc
+++ b/chromeos/network/network_connection_handler_impl.cc
@@ -77,7 +77,7 @@
       // always return true here (otherwise we will never attempt to connect).
       // TODO(stevenjb/cernekee): Fix this?
       return true;
-    case client_cert::CONFIG_TYPE_IPSEC: {
+    case client_cert::CONFIG_TYPE_L2TP_IPSEC: {
       if (!provider_properties)
         return false;
 
@@ -94,6 +94,14 @@
           GetStringFromDictionary(properties, shill::kEapIdentityProperty);
       return !cert_id.empty() && !key_id.empty() && !identity.empty();
     }
+    case client_cert::CONFIG_TYPE_IKEV2: {
+      if (!provider_properties)
+        return false;
+
+      std::string client_cert_id = GetStringFromDictionary(
+          *provider_properties, shill::kIKEv2ClientCertIdProperty);
+      return !client_cert_id.empty();
+    }
   }
   NOTREACHED();
   return false;
@@ -668,21 +676,24 @@
 
   client_cert::ConfigType client_cert_type = client_cert::CONFIG_TYPE_NONE;
   if (*type == shill::kTypeVPN) {
+    // Check the VPN types that may use the client cert: OpenVPN, L2TP/IPsec,
+    // and IKEv2.
     if (vpn_provider_type == shill::kProviderOpenVpn) {
       client_cert_type = client_cert::CONFIG_TYPE_OPENVPN;
-    } else {
+    } else if (vpn_provider_type == shill::kProviderL2tpIpsec) {
       // L2TP/IPSec only requires a certificate if one is specified in ONC
       // or one was configured by the UI. Otherwise it is L2TP/IPSec with
       // PSK and doesn't require a certificate.
-      //
-      // TODO(benchan): Modify shill to specify the authentication type via
-      // the kL2tpIpsecAuthenticationType property, so that Chrome doesn't need
-      // to deduce the authentication type based on the
-      // kL2tpIpsecClientCertIdProperty here (and also in VPNConfigView).
       if (!vpn_client_cert_id.empty() ||
           cert_config_from_policy.client_cert_type !=
               ::onc::client_cert::kClientCertTypeNone) {
-        client_cert_type = client_cert::CONFIG_TYPE_IPSEC;
+        client_cert_type = client_cert::CONFIG_TYPE_L2TP_IPSEC;
+      }
+    } else if (vpn_provider_type == shill::kProviderIKEv2) {
+      const std::string* auth_type =
+          properties->FindStringKey(shill::kIKEv2AuthenticationTypeProperty);
+      if (auth_type && *auth_type == shill::kIKEv2AuthenticationTypeCert) {
+        client_cert_type = client_cert::CONFIG_TYPE_IKEV2;
       }
     }
   } else if (*type == shill::kTypeWifi) {
diff --git a/chromeos/network/network_metadata_store.cc b/chromeos/network/network_metadata_store.cc
index 9805971..22bf52bc 100644
--- a/chromeos/network/network_metadata_store.cc
+++ b/chromeos/network/network_metadata_store.cc
@@ -55,7 +55,7 @@
 bool ListContains(const base::Value* list, const std::string& value) {
   if (!list)
     return false;
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
   return std::find(list_view.begin(), list_view.end(), base::Value(value)) !=
          list_view.end();
 }
diff --git a/chromeos/network/network_state.cc b/chromeos/network/network_state.cc
index 0413659..2067a60 100644
--- a/chromeos/network/network_state.cc
+++ b/chromeos/network/network_state.cc
@@ -506,7 +506,7 @@
   if (!listv)
     return std::string();
   std::string result;
-  for (const auto& v : listv->GetList()) {
+  for (const auto& v : listv->GetListDeprecated()) {
     if (!result.empty())
       result += ",";
     result += v.GetString();
diff --git a/chromeos/network/onc/network_onc_utils.cc b/chromeos/network/onc/network_onc_utils.cc
index 390673f9..37cbf1c 100644
--- a/chromeos/network/onc/network_onc_utils.cc
+++ b/chromeos/network/onc/network_onc_utils.cc
@@ -627,7 +627,7 @@
 }
 
 bool HasUserPasswordSubsitutionVariable(base::Value* network_configs) {
-  for (auto& network : network_configs->GetList()) {
+  for (auto& network : network_configs->GetListDeprecated()) {
     DCHECK(network.is_dict());
     bool result = HasUserPasswordSubsitutionVariable(
         kNetworkConfigurationSignature, &network);
diff --git a/chromeos/network/onc/network_onc_utils_unittest.cc b/chromeos/network/onc/network_onc_utils_unittest.cc
index f7bef7d..ca01a441 100644
--- a/chromeos/network/onc/network_onc_utils_unittest.cc
+++ b/chromeos/network/onc/network_onc_utils_unittest.cc
@@ -32,11 +32,11 @@
   std::unique_ptr<base::Value> additional_tests =
       test_utils::ReadTestJson("proxy_config_from_onc.json");
   ASSERT_TRUE(additional_tests->is_list());
-  for (const base::Value& value : additional_tests->GetList())
+  for (const base::Value& value : additional_tests->GetListDeprecated())
     list_of_tests->Append(value.Clone());
 
   int index = 0;
-  for (const base::Value& test_case : list_of_tests->GetList()) {
+  for (const base::Value& test_case : list_of_tests->GetListDeprecated()) {
     SCOPED_TRACE("Test case #" + base::NumberToString(index++));
 
     ASSERT_TRUE(test_case.is_dict());
@@ -61,7 +61,7 @@
   ASSERT_TRUE(list_of_tests->is_list());
 
   int index = 0;
-  for (const base::Value& test_case : list_of_tests->GetList()) {
+  for (const base::Value& test_case : list_of_tests->GetListDeprecated()) {
     SCOPED_TRACE("Test case #" + base::NumberToString(index++));
 
     const base::Value* shill_proxy_config = test_case.FindKey("ProxyConfig");
@@ -104,8 +104,9 @@
   const auto network_dictionary = test_utils::ReadTestDictionary(
       "managed_toplevel_with_password_variable.onc");
 
-  const auto network_list = std::make_unique<base::ListValue>(base::ListValue(
-      network_dictionary->FindKey("NetworkConfigurations")->GetList()));
+  const auto network_list = std::make_unique<base::ListValue>(
+      base::ListValue(network_dictionary->FindKey("NetworkConfigurations")
+                          ->GetListDeprecated()));
 
   EXPECT_TRUE(HasUserPasswordSubsitutionVariable(network_list.get()));
 }
@@ -114,8 +115,9 @@
   const auto network_dictionary = test_utils::ReadTestDictionary(
       "managed_toplevel_with_no_password_variable.onc");
 
-  const auto network_list = std::make_unique<base::ListValue>(base::ListValue(
-      network_dictionary->FindKey("NetworkConfigurations")->GetList()));
+  const auto network_list = std::make_unique<base::ListValue>(
+      base::ListValue(network_dictionary->FindKey("NetworkConfigurations")
+                          ->GetListDeprecated()));
 
   EXPECT_FALSE(HasUserPasswordSubsitutionVariable(network_list.get()));
 }
diff --git a/chromeos/network/onc/onc_merger.cc b/chromeos/network/onc/onc_merger.cc
index b6ff52e..7ff4568 100644
--- a/chromeos/network/onc/onc_merger.cc
+++ b/chromeos/network/onc/onc_merger.cc
@@ -52,7 +52,7 @@
       policy.FindListKey(::onc::kRecommended);
   if (!recommended_value)
     return;
-  for (const auto& value : recommended_value->GetList()) {
+  for (const auto& value : recommended_value->GetListDeprecated()) {
     if (value.is_string())
       result->SetBoolKey(value.GetString(), true);
   }
diff --git a/chromeos/network/onc/onc_translator_onc_to_shill.cc b/chromeos/network/onc/onc_translator_onc_to_shill.cc
index ecd6b64..7ad0ccb2 100644
--- a/chromeos/network/onc/onc_translator_onc_to_shill.cc
+++ b/chromeos/network/onc/onc_translator_onc_to_shill.cc
@@ -208,7 +208,7 @@
       onc_object_->FindListKey(::onc::openvpn::kRemoteCertKU);
   std::string cert_ku;
   if (cert_kus) {
-    const auto cert_kus_list = cert_kus->GetList();
+    const auto cert_kus_list = cert_kus->GetListDeprecated();
     if (!cert_kus_list.empty() && cert_kus_list[0].is_string()) {
       cert_ku = cert_kus_list[0].GetString();
     }
@@ -248,6 +248,9 @@
 void LocalTranslator::TranslateIPsec() {
   const auto ike_version = onc_object_->FindIntKey(::onc::ipsec::kIKEVersion);
   if (ike_version.has_value() && ike_version.value() == 2) {
+    SetClientCertProperties(client_cert::CONFIG_TYPE_IKEV2, onc_object_,
+                            shill_dictionary_);
+
     // The translation table set in this object is for L2TP/IPsec, so we do the
     // copy manually.
     CopyFieldFromONCToShill(::onc::ipsec::kAuthenticationType,
@@ -261,7 +264,7 @@
                             shill::kIKEv2RemoteIdentityProperty);
   } else {
     // For L2TP/IPsec.
-    SetClientCertProperties(client_cert::CONFIG_TYPE_IPSEC, onc_object_,
+    SetClientCertProperties(client_cert::CONFIG_TYPE_L2TP_IPSEC, onc_object_,
                             shill_dictionary_);
     CopyFieldsAccordingToSignature();
   }
@@ -385,7 +388,8 @@
     base::Value serialized_dicts(base::Value::Type::LIST);
     std::string serialized_dict;
     JSONStringValueSerializer serializer(&serialized_dict);
-    for (const base::Value& v : subject_alternative_name_match->GetList()) {
+    for (const base::Value& v :
+         subject_alternative_name_match->GetListDeprecated()) {
       if (serializer.Serialize(v)) {
         serialized_dicts.Append(serialized_dict);
       }
@@ -407,12 +411,12 @@
   if (name_servers) {
     static const char kDefaultIpAddr[] = "0.0.0.0";
     net::IPAddress ip_addr;
-    for (base::Value& value_ref : name_servers->GetList()) {
+    for (base::Value& value_ref : name_servers->GetListDeprecated()) {
       // AssignFromIPLiteral returns true if a string is valid ipv4 or ipv6.
       if (!ip_addr.AssignFromIPLiteral(value_ref.GetString()))
         value_ref = base::Value(kDefaultIpAddr);
     }
-    while (name_servers->GetList().size() < 4)
+    while (name_servers->GetListDeprecated().size() < 4)
       name_servers->Append(base::Value(kDefaultIpAddr));
   }
 }
diff --git a/chromeos/network/onc/onc_translator_shill_to_onc.cc b/chromeos/network/onc/onc_translator_shill_to_onc.cc
index 5afc6a8..ceafe63 100644
--- a/chromeos/network/onc/onc_translator_shill_to_onc.cc
+++ b/chromeos/network/onc/onc_translator_shill_to_onc.cc
@@ -331,6 +331,8 @@
     TranslateWithTableAndSet(shill::kIKEv2AuthenticationTypeProperty,
                              kIKEv2AuthenticationTypeTable,
                              ::onc::ipsec::kAuthenticationType);
+    SetPKCS11Id(shill_dictionary_, shill::kIKEv2ClientCertIdProperty,
+                shill::kIKEv2ClientCertSlotProperty, &onc_object_);
     return;
   }
 
@@ -658,13 +660,13 @@
     }
     const base::Value* name_servers =
         static_ipconfig->FindListKey(shill::kNameServersProperty);
-    if (name_servers && !name_servers->GetList().empty()) {
+    if (name_servers && !name_servers->GetListDeprecated().empty()) {
       onc_object_.SetKey(
           ::onc::network_config::kNameServersConfigType,
           base::Value(::onc::network_config::kIPConfigTypeStatic));
     }
     if ((ip_address && !ip_address->empty()) ||
-        (name_servers && !name_servers->GetList().empty())) {
+        (name_servers && !name_servers->GetListDeprecated().empty())) {
       TranslateAndAddNestedObject(::onc::network_config::kStaticIPConfig,
                                   *static_ipconfig);
     }
@@ -776,7 +778,8 @@
   if (subject_alternative_name_match) {
     base::Value deserialized_dicts(base::Value::Type::LIST);
     std::string error_msg;
-    for (const base::Value& san : subject_alternative_name_match->GetList()) {
+    for (const base::Value& san :
+         subject_alternative_name_match->GetListDeprecated()) {
       JSONStringValueDeserializer deserializer(san.GetString());
       auto deserialized_dict =
           deserializer.Deserialize(/*error_code=*/nullptr, &error_msg);
diff --git a/chromeos/network/policy_applicator.cc b/chromeos/network/policy_applicator.cc
index 9e425c3..755fe80 100644
--- a/chromeos/network/policy_applicator.cc
+++ b/chromeos/network/policy_applicator.cc
@@ -163,7 +163,7 @@
     return;
   }
 
-  for (const auto& it : entries->GetList()) {
+  for (const auto& it : entries->GetListDeprecated()) {
     if (!it.is_string())
       continue;
 
diff --git a/chromeos/printing/ppd_metadata_parser.cc b/chromeos/printing/ppd_metadata_parser.cc
index cb42204..11be6d8 100644
--- a/chromeos/printing/ppd_metadata_parser.cc
+++ b/chromeos/printing/ppd_metadata_parser.cc
@@ -43,7 +43,7 @@
   bool unnested_is_empty = true;
   switch (target_type) {
     case base::Value::Type::LIST:
-      unnested_is_empty = unnested->GetList().empty();
+      unnested_is_empty = unnested->GetListDeprecated().empty();
       break;
     case base::Value::Type::DICTIONARY:
       unnested_is_empty = unnested->DictEmpty();
@@ -138,12 +138,13 @@
     return absl::nullopt;
   }
   const base::Value* const ppd_metadata_list = value.FindListKey("ppdMetadata");
-  if (!ppd_metadata_list || ppd_metadata_list->GetList().size() == 0) {
+  if (!ppd_metadata_list ||
+      ppd_metadata_list->GetListDeprecated().size() == 0) {
     return absl::nullopt;
   }
 
   ParsedIndexValues parsed_index_values;
-  for (const base::Value& v : ppd_metadata_list->GetList()) {
+  for (const base::Value& v : ppd_metadata_list->GetListDeprecated()) {
     absl::optional<ParsedIndexLeaf> parsed_index_leaf = ParsedIndexLeafFrom(v);
     if (parsed_index_leaf.has_value()) {
       parsed_index_values.values.push_back(parsed_index_leaf.value());
@@ -280,7 +281,7 @@
   }
 
   ParsedUsbVendorIdMap usb_vendor_ids;
-  for (const auto& usb_vendor_description : as_value->GetList()) {
+  for (const auto& usb_vendor_description : as_value->GetListDeprecated()) {
     if (!usb_vendor_description.is_dict()) {
       continue;
     }
@@ -309,7 +310,7 @@
   }
 
   ParsedPrinters printers;
-  for (const auto& printer_value : as_value->GetList()) {
+  for (const auto& printer_value : as_value->GetListDeprecated()) {
     if (!printer_value.is_dict()) {
       continue;
     }
diff --git a/chromeos/printing/printer_translator_unittest.cc b/chromeos/printing/printer_translator_unittest.cc
index 69863ea..0cf8f1d 100644
--- a/chromeos/printing/printer_translator_unittest.cc
+++ b/chromeos/printing/printer_translator_unittest.cc
@@ -331,9 +331,9 @@
 
   const base::Value* status_reasons =
       printer_status_dict.FindListPath("statusReasons");
-  EXPECT_EQ(1u, status_reasons->GetList().size());
+  EXPECT_EQ(1u, status_reasons->GetListDeprecated().size());
 
-  for (const base::Value& status_reason : status_reasons->GetList()) {
+  for (const base::Value& status_reason : status_reasons->GetListDeprecated()) {
     EXPECT_EQ(static_cast<int>(CupsPrinterStatusReason::Reason::kDoorOpen),
               *status_reason.FindIntPath("reason"));
     EXPECT_EQ(static_cast<int>(CupsPrinterStatusReason::Severity::kError),
@@ -360,7 +360,7 @@
   const base::Value* status_reasons =
       printer_status_dict.FindListPath("statusReasons");
 
-  auto status_reasons_list = status_reasons->GetList();
+  auto status_reasons_list = status_reasons->GetListDeprecated();
   EXPECT_EQ(2u, status_reasons_list.size());
   EXPECT_EQ(static_cast<int>(CupsPrinterStatusReason::Reason::kLowOnPaper),
             status_reasons_list[0].FindIntPath("reason"));
diff --git a/chromeos/services/bluetooth_config/BUILD.gn b/chromeos/services/bluetooth_config/BUILD.gn
index fd1abb6f..b5c1b2a 100644
--- a/chromeos/services/bluetooth_config/BUILD.gn
+++ b/chromeos/services/bluetooth_config/BUILD.gn
@@ -87,6 +87,7 @@
 
   deps = [
     ":bluetooth_config",
+    "//components/device_event_log",
     "//device/bluetooth",
   ]
 }
diff --git a/chromeos/services/bluetooth_config/adapter_state_controller_impl.cc b/chromeos/services/bluetooth_config/adapter_state_controller_impl.cc
index 8399cf7..9b4ce73 100644
--- a/chromeos/services/bluetooth_config/adapter_state_controller_impl.cc
+++ b/chromeos/services/bluetooth_config/adapter_state_controller_impl.cc
@@ -38,6 +38,9 @@
 void AdapterStateControllerImpl::SetBluetoothEnabledState(bool enabled) {
   queued_state_change_ =
       enabled ? PowerStateChange::kEnable : PowerStateChange::kDisable;
+
+  BLUETOOTH_LOG(EVENT) << "Setting queued Bluetooth state change to "
+                       << queued_state_change_;
   AttemptQueuedStateChange();
 }
 
@@ -64,8 +67,13 @@
 
   // Cannot attempt to change state since the previous attempt is still in
   // progress.
-  if (in_progress_state_change_ != PowerStateChange::kNoChange)
+  if (in_progress_state_change_ != PowerStateChange::kNoChange) {
+    BLUETOOTH_LOG(EVENT)
+        << "Not attempting to change state since the previous "
+        << "change is still in progress. Continuing previous change: "
+        << in_progress_state_change_;
     return;
+  }
 
   switch (queued_state_change_) {
     // No queued change; return early.
@@ -89,6 +97,9 @@
 
   // Already in the correct state; clear the queued change and return.
   if (bluetooth_adapter_->IsPowered() == enabled) {
+    BLUETOOTH_LOG(EVENT) << "Already in state "
+                         << (enabled ? "enabled" : "disabled")
+                         << ", clearing queued state change";
     queued_state_change_ = PowerStateChange::kNoChange;
     return;
   }
@@ -141,5 +152,22 @@
   AttemptQueuedStateChange();
 }
 
+std::ostream& operator<<(
+    std::ostream& stream,
+    const AdapterStateControllerImpl::PowerStateChange& power_state_change) {
+  switch (power_state_change) {
+    case AdapterStateControllerImpl::PowerStateChange::kNoChange:
+      stream << "[No Change]";
+      break;
+    case AdapterStateControllerImpl::PowerStateChange::kEnable:
+      stream << "[Enable]";
+      break;
+    case AdapterStateControllerImpl::PowerStateChange::kDisable:
+      stream << "[Disable]";
+      break;
+  }
+  return stream;
+}
+
 }  // namespace bluetooth_config
 }  // namespace chromeos
diff --git a/chromeos/services/bluetooth_config/adapter_state_controller_impl.h b/chromeos/services/bluetooth_config/adapter_state_controller_impl.h
index cb7d321..a726d43 100644
--- a/chromeos/services/bluetooth_config/adapter_state_controller_impl.h
+++ b/chromeos/services/bluetooth_config/adapter_state_controller_impl.h
@@ -28,6 +28,9 @@
 
   enum class PowerStateChange { kNoChange, kEnable, kDisable };
 
+  friend std::ostream& operator<<(std::ostream& stream,
+                                  const PowerStateChange& power_state_change);
+
   // AdapterStateController:
   mojom::BluetoothSystemState GetAdapterState() const override;
   void SetBluetoothEnabledState(bool enabled) override;
diff --git a/chromeos/services/bluetooth_config/bluetooth_device_status_notifier.cc b/chromeos/services/bluetooth_config/bluetooth_device_status_notifier.cc
index d2a8ea6..280e3b0 100644
--- a/chromeos/services/bluetooth_config/bluetooth_device_status_notifier.cc
+++ b/chromeos/services/bluetooth_config/bluetooth_device_status_notifier.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "chromeos/services/bluetooth_config/bluetooth_device_status_notifier.h"
+#include "chromeos/services/bluetooth_config/public/cpp/cros_bluetooth_config_util.h"
+#include "components/device_event_log/device_event_log.h"
 
 namespace chromeos {
 namespace bluetooth_config {
@@ -18,6 +20,8 @@
 
 void BluetoothDeviceStatusNotifier::NotifyDeviceNewlyPaired(
     const mojom::PairedBluetoothDevicePropertiesPtr& device) {
+  BLUETOOTH_LOG(EVENT) << "Notifying observers device "
+                       << GetPairedDeviceName(device) << " is newly paired";
   for (auto& observer : observers_) {
     observer->OnDevicePaired(mojo::Clone(device));
   }
@@ -25,6 +29,8 @@
 
 void BluetoothDeviceStatusNotifier::NotifyDeviceNewlyConnected(
     const mojom::PairedBluetoothDevicePropertiesPtr& device) {
+  BLUETOOTH_LOG(EVENT) << "Notifying observers device "
+                       << GetPairedDeviceName(device) << " is newly connected";
   for (auto& observer : observers_) {
     observer->OnDeviceConnected(mojo::Clone(device));
   }
@@ -32,6 +38,9 @@
 
 void BluetoothDeviceStatusNotifier::NotifyDeviceNewlyDisconnected(
     const mojom::PairedBluetoothDevicePropertiesPtr& device) {
+  BLUETOOTH_LOG(EVENT) << "Notifying observers device "
+                       << GetPairedDeviceName(device)
+                       << " is newly disconnected";
   for (auto& observer : observers_) {
     observer->OnDeviceDisconnected(mojo::Clone(device));
   }
diff --git a/chromeos/services/bluetooth_config/bluetooth_device_status_notifier_impl.cc b/chromeos/services/bluetooth_config/bluetooth_device_status_notifier_impl.cc
index f069e99c..aa0f71f 100644
--- a/chromeos/services/bluetooth_config/bluetooth_device_status_notifier_impl.cc
+++ b/chromeos/services/bluetooth_config/bluetooth_device_status_notifier_impl.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/services/bluetooth_config/bluetooth_device_status_notifier_impl.h"
 #include "chromeos/services/bluetooth_config/device_cache.h"
+#include "components/device_event_log/device_event_log.h"
 
 #include <vector>
 
@@ -29,6 +30,7 @@
 }
 
 void BluetoothDeviceStatusNotifierImpl::CheckForDeviceStateChange() {
+  BLUETOOTH_LOG(DEBUG) << "Checking for device state changes";
   const std::vector<mojom::PairedBluetoothDevicePropertiesPtr> paired_devices =
       device_cache_->GetPairedDevices();
 
diff --git a/chromeos/services/bluetooth_config/bluetooth_power_controller_impl.cc b/chromeos/services/bluetooth_config/bluetooth_power_controller_impl.cc
index b4b384c..ed5d9b4 100644
--- a/chromeos/services/bluetooth_config/bluetooth_power_controller_impl.cc
+++ b/chromeos/services/bluetooth_config/bluetooth_power_controller_impl.cc
@@ -107,10 +107,19 @@
 
 void BluetoothPowerControllerImpl::InitLocalStatePrefService(
     PrefService* local_state) {
+  BLUETOOTH_LOG(EVENT) << "Initializing local state pref service";
+
   // Return early if |local_state_| has already been initialized or
   // |local_state| is invalid.
-  if (local_state_ || !local_state)
+  if (local_state_) {
+    BLUETOOTH_LOG(EVENT) << "Local state has already be initialized";
     return;
+  }
+
+  if (!local_state) {
+    BLUETOOTH_LOG(EVENT) << "local_state is null, not initializing";
+    return;
+  }
 
   local_state_ = local_state;
 
@@ -141,8 +150,11 @@
 
 void BluetoothPowerControllerImpl::InitPrimaryUserPrefService(
     PrefService* primary_profile_prefs) {
+  BLUETOOTH_LOG(EVENT) << "Initializing primary user pref service";
+
   primary_profile_prefs_ = primary_profile_prefs;
   if (!primary_profile_prefs_) {
+    BLUETOOTH_LOG(EVENT) << "primary_profile_prefs_ is null, not initializing";
     return;
   }
 
@@ -150,6 +162,8 @@
             user_manager::UserManager::Get()->GetPrimaryUser());
 
   if (!has_attempted_apply_primary_user_pref_) {
+    BLUETOOTH_LOG(EVENT)
+        << "Primary user pref has not been attempted to be applied, applying";
     ApplyBluetoothPrimaryUserPref();
     has_attempted_apply_primary_user_pref_ = true;
   }
diff --git a/chromeos/services/bluetooth_config/cros_bluetooth_config.cc b/chromeos/services/bluetooth_config/cros_bluetooth_config.cc
index 9692606a..95a5bba3 100644
--- a/chromeos/services/bluetooth_config/cros_bluetooth_config.cc
+++ b/chromeos/services/bluetooth_config/cros_bluetooth_config.cc
@@ -13,6 +13,7 @@
 #include "chromeos/services/bluetooth_config/fast_pair_delegate.h"
 #include "chromeos/services/bluetooth_config/initializer.h"
 #include "chromeos/services/bluetooth_config/system_properties_provider_impl.h"
+#include "components/device_event_log/device_event_log.h"
 #include "device/bluetooth/bluetooth_adapter.h"
 
 namespace chromeos {
@@ -50,8 +51,10 @@
           bluetooth_adapter,
           device_name_manager_.get())),
       fast_pair_delegate_(fast_pair_delegate) {
-  if (fast_pair_delegate_)
+  if (fast_pair_delegate_) {
+    BLUETOOTH_LOG(EVENT) << "Setting fast pair delegate's device name manager";
     fast_pair_delegate_->SetDeviceNameManager(device_name_manager_.get());
+  }
 }
 
 CrosBluetoothConfig::~CrosBluetoothConfig() {
@@ -61,6 +64,7 @@
 
 void CrosBluetoothConfig::SetPrefs(PrefService* logged_in_profile_prefs,
                                    PrefService* local_state) {
+  BLUETOOTH_LOG(EVENT) << "Setting CrosBluetoothConfig services' pref services";
   bluetooth_power_controller_->SetPrefs(logged_in_profile_prefs, local_state);
   device_name_manager_->SetPrefs(local_state);
 }
diff --git a/chromeos/services/bluetooth_config/device_cache.cc b/chromeos/services/bluetooth_config/device_cache.cc
index af920198..6038f153 100644
--- a/chromeos/services/bluetooth_config/device_cache.cc
+++ b/chromeos/services/bluetooth_config/device_cache.cc
@@ -6,6 +6,7 @@
 
 #include "chromeos/services/bluetooth_config/adapter_state_controller.h"
 #include "chromeos/services/bluetooth_config/public/cpp/cros_bluetooth_config_util.h"
+#include "components/device_event_log/device_event_log.h"
 
 namespace chromeos {
 namespace bluetooth_config {
@@ -22,8 +23,11 @@
   // amount of time in which Bluetooth is still enabled but is in the process of
   // turning off. We should still return an empty list in this case to ensure
   // that the UI does not show a list of devices when the toggle is off.
-  if (!IsBluetoothEnabledOrEnabling())
+  if (!IsBluetoothEnabledOrEnabling()) {
+    BLUETOOTH_LOG(EVENT) << "GetPairedDevices() called when Bluetooth is not "
+                         << "enabled nor enabling, returning an empty list.";
     return {};
+  }
 
   return PerformGetPairedDevices();
 }
@@ -35,8 +39,11 @@
   // amount of time in which Bluetooth is still enabled but is in the process of
   // turning off. We should still return an empty list in this case to ensure
   // that the UI does not show a list of devices when the toggle is off.
-  if (!IsBluetoothEnabledOrEnabling())
+  if (!IsBluetoothEnabledOrEnabling()) {
+    BLUETOOTH_LOG(EVENT) << "GetUnpairedDevices() called when Bluetooth is not "
+                         << "enabled nor enabling, returning an empty list.";
     return {};
+  }
 
   return PerformGetUnpairedDevices();
 }
diff --git a/chromeos/services/bluetooth_config/device_cache_impl.cc b/chromeos/services/bluetooth_config/device_cache_impl.cc
index 8a1c984..f019665af 100644
--- a/chromeos/services/bluetooth_config/device_cache_impl.cc
+++ b/chromeos/services/bluetooth_config/device_cache_impl.cc
@@ -8,6 +8,7 @@
 
 #include "base/containers/contains.h"
 #include "chromeos/services/bluetooth_config/device_conversion_util.h"
+#include "components/device_event_log/device_event_log.h"
 #include "device/bluetooth/chromeos/bluetooth_utils.h"
 
 namespace chromeos {
@@ -63,6 +64,7 @@
 
 void DeviceCacheImpl::DeviceAdded(device::BluetoothAdapter* adapter,
                                   device::BluetoothDevice* device) {
+  BLUETOOTH_LOG(DEBUG) << "Device added: " << device->GetAddress();
   if (device->IsPaired()) {
     if (AttemptSetDeviceInPairedDeviceList(device))
       NotifyPairedDevicesListChanged();
@@ -75,6 +77,7 @@
 
 void DeviceCacheImpl::DeviceRemoved(device::BluetoothAdapter* adapter,
                                     device::BluetoothDevice* device) {
+  BLUETOOTH_LOG(DEBUG) << "Device removed: " << device->GetAddress();
   if (device->IsPaired()) {
     if (RemoveFromPairedDeviceList(device))
       NotifyPairedDevicesListChanged();
@@ -100,6 +103,9 @@
 void DeviceCacheImpl::DevicePairedChanged(device::BluetoothAdapter* adapter,
                                           device::BluetoothDevice* device,
                                           bool new_paired_status) {
+  BLUETOOTH_LOG(DEBUG) << "Device " << device->GetAddress()
+                       << " paired changed, device is now "
+                       << (new_paired_status ? "paired" : "unpaired");
   if (new_paired_status) {
     // Remove from unpaired list and add to paired device list.
     bool unpaired_device_list_updated = RemoveFromUnpairedDeviceList(device);
@@ -128,6 +134,9 @@
     device::BluetoothAdapter* adapter,
     device::BluetoothDevice* device,
     bool is_now_connected) {
+  BLUETOOTH_LOG(DEBUG) << "Device connected state changed: "
+                       << device->GetAddress()
+                       << ", is now connected: " << is_now_connected;
   DeviceChanged(adapter, device);
 }
 
@@ -135,6 +144,9 @@
     device::BluetoothAdapter* adapter,
     device::BluetoothDevice* device,
     bool new_blocked_status) {
+  BLUETOOTH_LOG(DEBUG) << "Device blocked by policy changed: "
+                       << device->GetAddress()
+                       << ", new blocked status: " << new_blocked_status;
   DeviceChanged(adapter, device);
 }
 
@@ -147,7 +159,10 @@
 
 void DeviceCacheImpl::OnDeviceNicknameChanged(
     const std::string& device_id,
-    const absl::optional<std::string>&) {
+    const absl::optional<std::string>& nickname) {
+  BLUETOOTH_LOG(DEBUG) << "Device nickname changed: " << device_id
+                       << ", new nickname: "
+                       << (nickname.has_value() ? nickname.value() : "null");
   for (device::BluetoothDevice* device : bluetooth_adapter_->GetDevices()) {
     if (device->GetIdentifier() != device_id)
       continue;
@@ -155,6 +170,8 @@
     DeviceChanged(bluetooth_adapter_.get(), device);
     return;
   }
+
+  BLUETOOTH_LOG(ERROR) << "Device nickname changed but device was not found";
 }
 
 void DeviceCacheImpl::FetchInitialDeviceLists() {
@@ -176,8 +193,11 @@
 
 bool DeviceCacheImpl::AttemptSetDeviceInPairedDeviceList(
     device::BluetoothDevice* device) {
-  if (!device->IsPaired())
+  if (!device->IsPaired()) {
+    BLUETOOTH_LOG(ERROR) << "Attempted to set device in paired device list but "
+                         << "device is not paired: " << device->GetAddress();
     return false;
+  }
 
   // Remove the old (stale) properties, if they exist.
   RemoveFromPairedDeviceList(device);
@@ -214,8 +234,12 @@
   // device->IsPaired() == true. If we don't have this check here, the device
   // will be incorrectly added back into |paired_devices|. See
   // crrev.com/c/3287422.
-  if (!device_found)
+  if (!device_found) {
+    BLUETOOTH_LOG(DEBUG)
+        << "Device was not found in paired device list, not updating: "
+        << device->GetAddress();
     return false;
+  }
 
   // Remove existing metadata about |device|.
   bool updated = RemoveFromPairedDeviceList(device);
@@ -236,12 +260,19 @@
 
 bool DeviceCacheImpl::AttemptSetDeviceInUnpairedDeviceList(
     device::BluetoothDevice* device) {
-  if (device->IsPaired())
+  if (device->IsPaired()) {
+    BLUETOOTH_LOG(DEBUG) << "Attempted to set device in unpaired device list "
+                         << "but device is paired: " << device->GetAddress();
     return false;
+  }
 
   // Check if the device should be added to the unpaired device list.
-  if (device::IsUnsupportedDevice(device))
+  if (device::IsUnsupportedDevice(device)) {
+    BLUETOOTH_LOG(DEBUG) << "Attempted to set device in unpaired device list "
+                         << "but device is unsupported: "
+                         << device->GetAddress();
     return false;
+  }
 
   // Remove the old (stale) properties, if they exist.
   RemoveFromUnpairedDeviceList(device);
diff --git a/chromeos/services/bluetooth_config/device_name_manager_impl.cc b/chromeos/services/bluetooth_config/device_name_manager_impl.cc
index f5579fa..f9df9f9b 100644
--- a/chromeos/services/bluetooth_config/device_name_manager_impl.cc
+++ b/chromeos/services/bluetooth_config/device_name_manager_impl.cc
@@ -42,8 +42,11 @@
 
 absl::optional<std::string> DeviceNameManagerImpl::GetDeviceNickname(
     const std::string& device_id) {
-  if (!local_state_)
+  if (!local_state_) {
+    BLUETOOTH_LOG(ERROR) << "Cannot get device nickname for " << device_id
+                         << " because local_state_ is null";
     return absl::nullopt;
+  }
 
   const std::string* nickname =
       local_state_->GetDictionary(kDeviceIdToNicknameMapPrefName)
@@ -86,6 +89,9 @@
       DictionaryPrefUpdate(local_state_, kDeviceIdToNicknameMapPrefName).Get();
   DCHECK(device_id_to_nickname_map)
       << "Device ID to nickname map pref is unregistered.";
+
+  BLUETOOTH_LOG(USER) << "Setting device nickname for " << device_id << " to "
+                      << nickname;
   device_id_to_nickname_map->SetStringKey(device_id, nickname);
 
   NotifyDeviceNicknameChanged(device_id, nickname);
@@ -111,6 +117,7 @@
     return;
   }
 
+  BLUETOOTH_LOG(EVENT) << "Removing device nickname for " << device_id;
   device_id_to_nickname_map->RemoveKey(device_id);
   NotifyDeviceNicknameChanged(device_id, /*nickname=*/absl::nullopt);
 }
diff --git a/chromeos/services/bluetooth_config/device_operation_handler.cc b/chromeos/services/bluetooth_config/device_operation_handler.cc
index 22d54e3f..116e937 100644
--- a/chromeos/services/bluetooth_config/device_operation_handler.cc
+++ b/chromeos/services/bluetooth_config/device_operation_handler.cc
@@ -103,7 +103,7 @@
                                               OperationCallback callback) {
   BLUETOOTH_LOG(DEBUG) << "Device with id: " << device_id
                        << " enqueueing operation: " << operation << " ("
-                       << (queue_.size() + 1) << " operations already queued)";
+                       << queue_.size() << " operations already queued)";
   device::BluetoothDevice* device = FindDevice(device_id);
   device::BluetoothTransport type =
       device ? device->GetType()
@@ -138,7 +138,7 @@
         << current_operation_->device_id;
     RecordUserInitiatedReconnectionMetrics(
         device::BluetoothTransport::BLUETOOTH_TRANSPORT_INVALID,
-        /*reconnection_attempt_start=*/absl::nullopt,
+        base::Time::Now(),
         device::BluetoothDevice::ConnectErrorCode::ERROR_FAILED);
     HandleFinishedOperation(/*success=*/false);
     return;
diff --git a/chromeos/services/bluetooth_config/device_operation_handler_impl.cc b/chromeos/services/bluetooth_config/device_operation_handler_impl.cc
index 4e3a49a..c249c5c 100644
--- a/chromeos/services/bluetooth_config/device_operation_handler_impl.cc
+++ b/chromeos/services/bluetooth_config/device_operation_handler_impl.cc
@@ -4,7 +4,6 @@
 
 #include "chromeos/services/bluetooth_config/device_operation_handler_impl.h"
 
-#include "base/time/default_clock.h"
 #include "base/time/time.h"
 #include "components/device_event_log/device_event_log.h"
 #include "device/bluetooth/bluetooth_common.h"
@@ -47,14 +46,14 @@
 
 void DeviceOperationHandlerImpl::PerformConnect(const std::string& device_id) {
   device::BluetoothDevice* device = FindDevice(device_id);
-  last_reconnection_attempt_start_ = base::DefaultClock::GetInstance()->Now();
+  last_reconnection_attempt_start_ = base::Time::Now();
   if (!device) {
     BLUETOOTH_LOG(ERROR) << "Connect failed due to device not being "
                             "found, device id: "
                          << device_id;
     RecordUserInitiatedReconnectionMetrics(
         device::BluetoothTransport::BLUETOOTH_TRANSPORT_INVALID,
-        /*reconnection_attempt_start=*/absl::nullopt,
+        last_reconnection_attempt_start_,
         device::BluetoothDevice::ConnectErrorCode::ERROR_FAILED);
     HandleFinishedOperation(/*success=*/false);
     return;
@@ -147,8 +146,7 @@
   if (reconnection_attempt_start) {
     device::RecordUserInitiatedReconnectionAttemptDuration(
         failure_reason, transport,
-        base::DefaultClock::GetInstance()->Now() -
-            reconnection_attempt_start.value());
+        base::Time::Now() - reconnection_attempt_start.value());
   }
 }
 
diff --git a/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc b/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc
index e801035..bf79fbb2 100644
--- a/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc
+++ b/chromeos/services/bluetooth_config/device_operation_handler_impl_unittest.cc
@@ -72,20 +72,23 @@
 
   void AssertDurationHistogramMetrics(base::TimeDelta bucket,
                                       int success_count,
-                                      int failure_count) {
+                                      int failure_count,
+                                      std::string transport_name) {
     histogram_tester.ExpectBucketCount(
         "Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Duration.Success",
         bucket.InMilliseconds(), success_count);
     histogram_tester.ExpectBucketCount(
-        "Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Duration.Success."
-        "Classic",
+        base::StrCat({"Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt."
+                      "Duration.Success.",
+                      transport_name}),
         bucket.InMilliseconds(), success_count);
     histogram_tester.ExpectBucketCount(
         "Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Duration.Failure",
         bucket.InMilliseconds(), failure_count);
     histogram_tester.ExpectBucketCount(
-        "Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Duration.Failure."
-        "Classic",
+        base::StrCat({"Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt."
+                      "Duration.Failure.",
+                      transport_name}),
         bucket.InMilliseconds(), failure_count);
   }
 
@@ -264,8 +267,9 @@
   EXPECT_EQ(results()[0], std::make_tuple(device_id, Operation::kConnect,
                                           /*success=*/false));
   AssertHistogramMetrics(/*success_count=*/0, /*failure_count=*/1);
-  AssertDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                 /*failure_count=*/0);
+  AssertDurationHistogramMetrics(base::Milliseconds(0), /*success_count=*/0,
+                                 /*failure_count=*/1,
+                                 /*transport_name=*/"Invalid");
 
   // Connect should fail due to device not being found.
   SetBluetoothSystemState(mojom::BluetoothSystemState::kEnabled);
@@ -273,8 +277,9 @@
   EXPECT_EQ(results()[1],
             std::make_tuple(device_id, Operation::kConnect, false));
   AssertHistogramMetrics(/*success_count=*/0, /*failure_count=*/2);
-  AssertDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                 /*failure_count=*/0);
+  AssertDurationHistogramMetrics(base::Milliseconds(0), /*success_count=*/0,
+                                 /*failure_count=*/2,
+                                 /*transport_name=*/"Invalid");
 
   // Add the device and simulate BluetoothDevice::Connect() failing.
   AddDevice(&device_id);
@@ -287,7 +292,8 @@
 
   AssertHistogramMetrics(/*success_count=*/0, /*failure_count=*/3);
   AssertDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                 /*failure_count=*/1);
+                                 /*failure_count=*/1,
+                                 /*transport_name=*/"Classic");
 
   // Simulate BluetoothDevice::Connect() succeeding.
   ConnectDevice(device_id);
@@ -298,7 +304,8 @@
                                           /*success=*/true));
   AssertHistogramMetrics(/*success_count=*/1, /*failure_count=*/3);
   AssertDurationHistogramMetrics(kTestDuration, /*success_count=*/1,
-                                 /*failure_count=*/1);
+                                 /*failure_count=*/1,
+                                 /*transport_name=*/"Classic");
 }
 
 TEST_F(DeviceOperationHandlerImplTest, DisconnectNotFoundFailThenSucceed) {
@@ -384,7 +391,8 @@
                                           /*success=*/false));
   AssertHistogramMetrics(/*success_count=*/0, /*failure_count=*/1);
   AssertDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                 /*failure_count=*/1);
+                                 /*failure_count=*/1,
+                                 /*transport_name=*/"Classic");
 
   // Now the second operation's BluetoothDevice::Disconnect() should have been
   // called.
@@ -429,7 +437,8 @@
   EXPECT_TRUE(HasPendingDisconnectCallback());
   AssertHistogramMetrics(/*success_count=*/0, /*failure_count=*/1);
   AssertDurationHistogramMetrics(GetOperationTimeout(), /*success_count=*/0,
-                                 /*failure_count=*/1);
+                                 /*failure_count=*/1,
+                                 /*transport_name=*/"Classic");
 
   // Simulate disconnect timing out. The operation should finish with a failure
   // result.
@@ -451,7 +460,8 @@
                                           /*success=*/true));
   AssertHistogramMetrics(/*success_count=*/1, /*failure_count=*/0);
   AssertDurationHistogramMetrics(kTestDuration, /*success_count=*/1,
-                                 /*failure_count=*/0);
+                                 /*failure_count=*/0,
+                                 /*transport_name=*/"Classic");
 
   // Fast forward to where the timer would timeout if it was still running. This
   // will crash if the timer isn't cancelled after the operation finished.
@@ -481,7 +491,8 @@
   EXPECT_TRUE(HasPendingDisconnectCallback());
   AssertHistogramMetrics(/*success_count=*/0, /*failure_count=*/1);
   AssertDurationHistogramMetrics(GetOperationTimeout(), /*success_count=*/0,
-                                 /*failure_count=*/1);
+                                 /*failure_count=*/1,
+                                 /*transport_name=*/"Classic");
 
   // Simulate the connect call now finishing after the timeout. This should not
   // cause the current operation (disconnect) to finish with a result.
@@ -494,7 +505,8 @@
                                           /*success=*/true));
   AssertHistogramMetrics(/*success_count=*/0, /*failure_count=*/1);
   AssertDurationHistogramMetrics(GetOperationTimeout(), /*success_count=*/0,
-                                 /*failure_count=*/1);
+                                 /*failure_count=*/1,
+                                 /*transport_name=*/"Classic");
 }
 
 }  // namespace bluetooth_config
diff --git a/chromeos/services/bluetooth_config/device_pairing_handler.cc b/chromeos/services/bluetooth_config/device_pairing_handler.cc
index f702d00..e7d1f7f 100644
--- a/chromeos/services/bluetooth_config/device_pairing_handler.cc
+++ b/chromeos/services/bluetooth_config/device_pairing_handler.cc
@@ -113,6 +113,8 @@
     const std::string& device_id,
     mojo::PendingRemote<mojom::DevicePairingDelegate> delegate,
     PairDeviceCallback callback) {
+  BLUETOOTH_LOG(USER) << "Attempting to pair with device " << device_id;
+
   // There should only be one PairDevice request at a time.
   CHECK(current_pairing_device_id_.empty());
 
@@ -127,8 +129,7 @@
   // If Bluetooth is not enabled, fail immediately.
   if (!IsBluetoothEnabled()) {
     BLUETOOTH_LOG(ERROR) << "Pairing failed due to Bluetooth not being "
-                            "enabled, device identifier: "
-                         << device_id;
+                         << "enabled, device identifier: " << device_id;
     FinishCurrentPairingRequest(device::ConnectionFailureReason::kFailed);
     return;
   }
@@ -138,8 +139,7 @@
 
   if (!device) {
     BLUETOOTH_LOG(ERROR) << "Pairing failed due to device not being "
-                            "found, identifier: "
-                         << device_id;
+                         << "found, identifier: " << device_id;
     FinishCurrentPairingRequest(device::ConnectionFailureReason::kFailed);
     return;
   }
@@ -151,12 +151,16 @@
 }
 
 void DevicePairingHandler::RequestPinCode(device::BluetoothDevice* device) {
+  BLUETOOTH_LOG(EVENT) << "Requesting pin code for "
+                       << current_pairing_device_id_;
   DCHECK(device->GetIdentifier() == current_pairing_device_id_);
   delegate_->RequestPinCode(base::BindOnce(
       &DevicePairingHandler::OnRequestPinCode, weak_ptr_factory_.GetWeakPtr()));
 }
 
 void DevicePairingHandler::RequestPasskey(device::BluetoothDevice* device) {
+  BLUETOOTH_LOG(EVENT) << "Requesting passkey for "
+                       << current_pairing_device_id_;
   DCHECK(device->GetIdentifier() == current_pairing_device_id_);
   delegate_->RequestPasskey(base::BindOnce(
       &DevicePairingHandler::OnRequestPasskey, weak_ptr_factory_.GetWeakPtr()));
@@ -164,6 +168,9 @@
 
 void DevicePairingHandler::DisplayPinCode(device::BluetoothDevice* device,
                                           const std::string& pin_code) {
+  BLUETOOTH_LOG(EVENT) << "Displaying pin code for "
+                       << current_pairing_device_id_
+                       << ", pin code: " << pin_code;
   DCHECK(device->GetIdentifier() == current_pairing_device_id_);
   key_entered_handler_.reset();
   delegate_->DisplayPinCode(pin_code,
@@ -172,6 +179,9 @@
 
 void DevicePairingHandler::DisplayPasskey(device::BluetoothDevice* device,
                                           uint32_t passkey) {
+  BLUETOOTH_LOG(EVENT) << "Displaying passkey for "
+                       << current_pairing_device_id_
+                       << ", passkey: " << passkey;
   DCHECK(device->GetIdentifier() == current_pairing_device_id_);
   key_entered_handler_.reset();
   delegate_->DisplayPasskey(PasskeyToString(passkey),
@@ -180,12 +190,17 @@
 
 void DevicePairingHandler::KeysEntered(device::BluetoothDevice* device,
                                        uint32_t entered) {
+  BLUETOOTH_LOG(EVENT) << entered << " keys entered for "
+                       << current_pairing_device_id_;
   DCHECK(device->GetIdentifier() == current_pairing_device_id_);
   key_entered_handler_->HandleKeyEntered(entered);
 }
 
 void DevicePairingHandler::ConfirmPasskey(device::BluetoothDevice* device,
                                           uint32_t passkey) {
+  BLUETOOTH_LOG(EVENT) << "Confirming passkey for "
+                       << current_pairing_device_id_
+                       << ", passkey: " << passkey;
   DCHECK(device->GetIdentifier() == current_pairing_device_id_);
   delegate_->ConfirmPasskey(
       PasskeyToString(passkey),
@@ -194,6 +209,8 @@
 }
 
 void DevicePairingHandler::AuthorizePairing(device::BluetoothDevice* device) {
+  BLUETOOTH_LOG(EVENT) << "Authorizing pairing for "
+                       << current_pairing_device_id_;
   DCHECK(device->GetIdentifier() == current_pairing_device_id_);
   delegate_->AuthorizePairing(base::BindOnce(
       &DevicePairingHandler::OnConfirmPairing, weak_ptr_factory_.GetWeakPtr()));
@@ -207,12 +224,16 @@
     return;
 
   // If Bluetooth disables while we are attempting to pair, cancel the pairing.
+  BLUETOOTH_LOG(EVENT) << "Bluetooth disabled while attempting to pair with "
+                       << current_pairing_device_id_ << ", canceling pairing";
   CancelPairing();
 }
 
 void DevicePairingHandler::OnDeviceConnect(
     absl::optional<device::BluetoothDevice::ConnectErrorCode> error_code) {
   if (!error_code.has_value()) {
+    BLUETOOTH_LOG(EVENT) << "Device " << current_pairing_device_id_
+                         << " successfully paired";
     FinishCurrentPairingRequest(absl::nullopt);
     NotifyFinished();
     return;
@@ -285,6 +306,8 @@
     return;
   }
 
+  BLUETOOTH_LOG(USER) << "Received pin code " << pin_code << " for device "
+                      << current_pairing_device_id_;
   device->SetPinCode(pin_code);
 }
 
@@ -301,15 +324,23 @@
 
   uint32_t passkey_num;
   if (base::StringToUint(passkey, &passkey_num)) {
+    BLUETOOTH_LOG(USER) << "Received passkey " << passkey_num << " for device "
+                        << current_pairing_device_id_;
     device->SetPasskey(passkey_num);
     return;
   }
 
   // If string to uint32_t conversion was unsuccessful, cancel the pairing.
+  BLUETOOTH_LOG(ERROR) << "Converting " << passkey
+                       << "to uint32_t failed, canceling pairing with "
+                       << current_pairing_device_id_;
   CancelPairing();
 }
 
 void DevicePairingHandler::OnConfirmPairing(bool confirmed) {
+  BLUETOOTH_LOG(EVENT) << "OnConfirmPairing() called with confirmed: "
+                       << confirmed;
+
   device::BluetoothDevice* device = FindDevice(current_pairing_device_id_);
   if (!device) {
     BLUETOOTH_LOG(ERROR)
@@ -342,10 +373,15 @@
 }
 
 void DevicePairingHandler::OnDelegateDisconnect() {
+  BLUETOOTH_LOG(DEBUG) << "Delegate disconnected";
+
   // If the delegate disconnects and we have a pairing attempt, cancel the
   // pairing.
-  if (!current_pairing_device_id_.empty())
+  if (!current_pairing_device_id_.empty()) {
+    BLUETOOTH_LOG(EVENT) << "Delegate disconnected during pairing with "
+                         << current_pairing_device_id_ << ", canceling pairing";
     CancelPairing();
+  }
 
   delegate_.reset();
 }
diff --git a/chromeos/services/bluetooth_config/device_pairing_handler_impl.cc b/chromeos/services/bluetooth_config/device_pairing_handler_impl.cc
index 60f9326..1522435 100644
--- a/chromeos/services/bluetooth_config/device_pairing_handler_impl.cc
+++ b/chromeos/services/bluetooth_config/device_pairing_handler_impl.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chromeos/services/bluetooth_config/device_pairing_handler_impl.h"
+#include "components/device_event_log/device_event_log.h"
 
 namespace chromeos {
 namespace bluetooth_config {
@@ -48,8 +49,12 @@
 DevicePairingHandlerImpl::~DevicePairingHandlerImpl() {
   // If we have a pairing attempt and this class is destroyed, cancel the
   // pairing.
-  if (!current_pairing_device_id().empty())
+  if (!current_pairing_device_id().empty()) {
+    BLUETOOTH_LOG(EVENT)
+        << "DevicePairingHandlerImpl is being destroyed while pairing with "
+        << current_pairing_device_id() << ", canceling pairing";
     CancelPairing();
+  }
 
   NotifyFinished();
 }
diff --git a/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc b/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
index 1aeb2ca..8bb4f64 100644
--- a/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
+++ b/chromeos/services/bluetooth_config/device_pairing_handler_impl_unittest.cc
@@ -91,20 +91,21 @@
 
   void CheckDurationHistogramMetrics(base::TimeDelta bucket,
                                      int success_count,
-                                     int failure_count) {
+                                     int failure_count,
+                                     std::string transport_name) {
     histogram_tester.ExpectBucketCount(
         "Bluetooth.ChromeOS.Pairing.Duration.Success", bucket.InMilliseconds(),
         success_count);
     histogram_tester.ExpectBucketCount(
-        "Bluetooth.ChromeOS.Pairing.Duration.Success."
-        "Classic",
+        base::StrCat(
+            {"Bluetooth.ChromeOS.Pairing.Duration.Success.", transport_name}),
         bucket.InMilliseconds(), success_count);
     histogram_tester.ExpectBucketCount(
         "Bluetooth.ChromeOS.Pairing.Duration.Failure", bucket.InMilliseconds(),
         failure_count);
     histogram_tester.ExpectBucketCount(
-        "Bluetooth.ChromeOS.Pairing.Duration.Failure."
-        "Classic",
+        base::StrCat(
+            {"Bluetooth.ChromeOS.Pairing.Duration.Failure.", transport_name}),
         bucket.InMilliseconds(), failure_count);
   }
 
@@ -304,7 +305,8 @@
   AddDevice(&device_id2, AuthType::kNone);
 
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/0,
+                                /*transport_name=*/"Classic");
 
   std::unique_ptr<FakeDevicePairingDelegate> delegate1 = PairDevice(device_id1);
   EXPECT_TRUE(delegate1->IsMojoPipeConnected());
@@ -319,7 +321,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 
   std::unique_ptr<FakeDevicePairingDelegate> delegate2 = PairDevice(device_id2);
   EXPECT_TRUE(delegate2->IsMojoPipeConnected());
@@ -334,7 +337,8 @@
                          /*type_count=*/2, /*failure_count=*/1,
                          /*success_count=*/1);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/1,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, DisableBluetoothBeforePairing) {
@@ -351,12 +355,12 @@
   EXPECT_EQ(pairing_result(), mojom::PairingResult::kNonAuthFailure);
   EXPECT_EQ(num_pairing_attempt_finished_calls(), 0u);
 
-  // Pairing result metric is only recorded for valid transport types.
   CheckPairingHistograms(device::BluetoothTransportType::kInvalid,
-                         /*type_count=*/1, /*failure_count=*/0,
+                         /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(base::Milliseconds(0), /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Invalid");
 }
 
 TEST_F(DevicePairingHandlerImplTest, DisableBluetoothDuringPairing) {
@@ -379,7 +383,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, DestroyHandlerBeforeConnectFinishes) {
@@ -399,7 +404,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(base::Milliseconds(0), /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, DestroyHandlerAfterConnectFinishes) {
@@ -426,7 +432,8 @@
                          /*type_count=*/1, /*failure_count=*/0,
                          /*success_count=*/1);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/1,
-                                /*failure_count=*/0);
+                                /*failure_count=*/0,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, DisconnectDelegateBeforeConnectFinishes) {
@@ -448,7 +455,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest,
@@ -471,10 +479,11 @@
   // Disconnecting the pipe should not call OnPairingAttemptFinished().
   EXPECT_EQ(num_pairing_attempt_finished_calls(), 0u);
   CheckPairingHistograms(device::BluetoothTransportType::kInvalid,
-                         /*type_count=*/1, /*failure_count=*/0,
+                         /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Invalid");
 }
 
 TEST_F(DevicePairingHandlerImplTest,
@@ -500,7 +509,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairDeviceNotFound) {
@@ -509,10 +519,11 @@
   EXPECT_FALSE(HasPendingConnectCallback());
   EXPECT_EQ(pairing_result(), mojom::PairingResult::kNonAuthFailure);
   CheckPairingHistograms(device::BluetoothTransportType::kInvalid,
-                         /*type_count=*/1, /*failure_count=*/0,
+                         /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(base::Milliseconds(0), /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Invalid");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairFailsDeviceConnected) {
@@ -527,7 +538,8 @@
                          /*type_count=*/0, /*failure_count=*/0,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/0,
+                                /*transport_name=*/"Classic");
 
   std::unique_ptr<FakeDevicePairingDelegate> delegate = PairDevice(device_id);
   EXPECT_TRUE(HasPendingConnectCallback());
@@ -546,7 +558,8 @@
                          /*type_count=*/1, /*failure_count=*/0,
                          /*success_count=*/1);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/1,
-                                /*failure_count=*/0);
+                                /*failure_count=*/0,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthRequestPinCode) {
@@ -566,7 +579,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthRequestPinCodeRemoveDevice) {
@@ -585,10 +599,11 @@
   EXPECT_TRUE(received_pin_code().empty());
   EXPECT_EQ(pairing_result(), mojom::PairingResult::kNonAuthFailure);
   CheckPairingHistograms(device::BluetoothTransportType::kInvalid,
-                         /*type_count=*/1, /*failure_count=*/0,
+                         /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Invalid");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthRequestPasskey) {
@@ -607,7 +622,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthRequestPasskeyRemoveDevice) {
@@ -627,10 +643,11 @@
   EXPECT_EQ(received_passkey(), kUninitializedPasskey);
   EXPECT_EQ(pairing_result(), mojom::PairingResult::kNonAuthFailure);
   CheckPairingHistograms(device::BluetoothTransportType::kInvalid,
-                         /*type_count=*/1, /*failure_count=*/0,
+                         /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Invalid");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthRequestPasskeyInvalidKey) {
@@ -657,7 +674,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthDisplayPinCode) {
@@ -681,7 +699,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthDisplayPinCodeDisconnectHandler) {
@@ -707,7 +726,8 @@
                          /*type_count=*/0, /*failure_count=*/0,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/0,
+                                /*transport_name=*/"Invalid");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthDisplayPasskey) {
@@ -731,7 +751,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthDisplayPasskeyPadZeroes) {
@@ -751,7 +772,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 
   // Pair a new device.
   std::string device_id2;
@@ -768,7 +790,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthConfirmPasskey) {
@@ -791,7 +814,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 
   // Pair a new device.
   std::string device_id2;
@@ -815,7 +839,8 @@
                          /*type_count=*/2, /*failure_count=*/2,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/2);
+                                /*failure_count=*/2,
+                                /*transport_name=*/"Classic");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthConfirmPasskeyRemoveDevice) {
@@ -837,10 +862,11 @@
   EXPECT_EQ(num_confirm_pairing_calls(), 0u);
   EXPECT_EQ(pairing_result(), mojom::PairingResult::kNonAuthFailure);
   CheckPairingHistograms(device::BluetoothTransportType::kInvalid,
-                         /*type_count=*/1, /*failure_count=*/0,
+                         /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/0);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Invalid");
 }
 
 TEST_F(DevicePairingHandlerImplTest, PairAuthAuthorizePairing) {
@@ -861,7 +887,8 @@
                          /*type_count=*/1, /*failure_count=*/1,
                          /*success_count=*/0);
   CheckDurationHistogramMetrics(kTestDuration, /*success_count=*/0,
-                                /*failure_count=*/1);
+                                /*failure_count=*/1,
+                                /*transport_name=*/"Classic");
 }
 
 }  // namespace bluetooth_config
diff --git a/chromeos/services/bluetooth_config/discovery_session_manager.cc b/chromeos/services/bluetooth_config/discovery_session_manager.cc
index 92ad635..11141baf 100644
--- a/chromeos/services/bluetooth_config/discovery_session_manager.cc
+++ b/chromeos/services/bluetooth_config/discovery_session_manager.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "chromeos/services/bluetooth_config/discovery_session_manager.h"
+#include "components/device_event_log/device_event_log.h"
 
 #include "base/bind.h"
 
@@ -28,6 +29,8 @@
     mojo::PendingRemote<mojom::BluetoothDiscoveryDelegate> delegate) {
   // If Bluetooth is not enabled, we cannot start discovery.
   if (!IsBluetoothEnabled()) {
+    BLUETOOTH_LOG(ERROR)
+        << "StartDiscovery() called while Bluetooth is not enabled";
     mojo::Remote<mojom::BluetoothDiscoveryDelegate> delegate_remote(
         std::move(delegate));
     delegate_remote->OnBluetoothDiscoveryStopped();
@@ -40,6 +43,7 @@
 
   // The number of clients has increased from 0 to 1.
   if (!had_client_before_call) {
+    BLUETOOTH_LOG(EVENT) << "StartDiscovery() called as the first client";
     OnHasAtLeastOneDiscoveryClientChanged();
     return;
   }
@@ -47,6 +51,8 @@
   // If discovery is already active, notify the delegate that discovery has
   // started and of the current discovered devices list.
   if (IsDiscoverySessionActive()) {
+    BLUETOOTH_LOG(EVENT)
+        << "StartDiscovery() called with a discovery session already active";
     delegates_.Get(id)->OnBluetoothDiscoveryStarted(
         RegisterNewDevicePairingHandler(id));
     delegates_.Get(id)->OnDiscoveredDevicesListChanged(
@@ -62,6 +68,8 @@
 }
 
 void DiscoverySessionManager::NotifyDiscoveryStoppedAndClearActiveClients() {
+  BLUETOOTH_LOG(EVENT) << "Notifying discovery stopped";
+
   if (!HasAtLeastOneDiscoveryClient())
     return;
 
@@ -135,8 +143,11 @@
 
   // If the disconnected client was the last one, the number of clients has
   // decreased from 1 to 0.
-  if (!HasAtLeastOneDiscoveryClient())
+  if (!HasAtLeastOneDiscoveryClient()) {
+    BLUETOOTH_LOG(EVENT)
+        << "The number of discovery clients has decreased from 1 to 0";
     OnHasAtLeastOneDiscoveryClientChanged();
+  }
 }
 
 void DiscoverySessionManager::FlushForTesting() {
diff --git a/chromeos/services/bluetooth_config/discovery_session_manager_impl.cc b/chromeos/services/bluetooth_config/discovery_session_manager_impl.cc
index 3248b3c..14ef44c1 100644
--- a/chromeos/services/bluetooth_config/discovery_session_manager_impl.cc
+++ b/chromeos/services/bluetooth_config/discovery_session_manager_impl.cc
@@ -55,6 +55,8 @@
     return;
 
   // |discovery_session_| is no longer operational, so destroy it.
+  BLUETOOTH_LOG(EVENT) << "Adapter discovering became false during an active "
+                          "discovery session, destroying session";
   DestroyDiscoverySession();
 }
 
@@ -72,11 +74,13 @@
 }
 
 void DiscoverySessionManagerImpl::AttemptDiscovery() {
-  if (is_discovery_attempt_in_progress_)
+  if (is_discovery_attempt_in_progress_) {
+    BLUETOOTH_LOG(EVENT) << "Not attempting to start discovery because a "
+                            "discovery attempt is already in progress";
     return;
+  }
 
-  BLUETOOTH_LOG(DEBUG) << "Starting discovery session";
-
+  BLUETOOTH_LOG(EVENT) << "Starting discovery session";
   is_discovery_attempt_in_progress_ = true;
   bluetooth_adapter_->StartDiscoverySession(
       kDiscoveryClientName,
@@ -88,6 +92,7 @@
 
 void DiscoverySessionManagerImpl::OnDiscoverySuccess(
     std::unique_ptr<device::BluetoothDiscoverySession> discovery_session) {
+  BLUETOOTH_LOG(EVENT) << "Starting discovery session succeeded";
   is_discovery_attempt_in_progress_ = false;
   discovery_session_ = std::move(discovery_session);
   NotifyDiscoveryStarted();
@@ -103,6 +108,7 @@
 }
 
 void DiscoverySessionManagerImpl::OnDiscoveryError() {
+  BLUETOOTH_LOG(ERROR) << "Failed to start discovery session, retrying";
   is_discovery_attempt_in_progress_ = false;
 
   // Retry discovery. Note that we choose not to set a limit on the number of
@@ -111,7 +117,7 @@
 }
 
 void DiscoverySessionManagerImpl::DestroyDiscoverySession() {
-  BLUETOOTH_LOG(DEBUG) << "Destroying discovery session";
+  BLUETOOTH_LOG(EVENT) << "Destroying discovery session";
 
   discovery_session_.reset();
   NotifyDiscoveryStoppedAndClearActiveClients();
diff --git a/chromeos/services/bluetooth_config/in_process_instance.cc b/chromeos/services/bluetooth_config/in_process_instance.cc
index 369bb1f9..ff04108 100644
--- a/chromeos/services/bluetooth_config/in_process_instance.cc
+++ b/chromeos/services/bluetooth_config/in_process_instance.cc
@@ -10,6 +10,7 @@
 #include "chromeos/services/bluetooth_config/cros_bluetooth_config.h"
 #include "chromeos/services/bluetooth_config/fast_pair_delegate.h"
 #include "chromeos/services/bluetooth_config/initializer_impl.h"
+#include "components/device_event_log/device_event_log.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -38,6 +39,7 @@
     return;
 
   if (!g_instance) {
+    BLUETOOTH_LOG(EVENT) << "Initializing CrosBluetoothConfig";
     InitializerImpl initializer;
     g_instance = new CrosBluetoothConfig(
         initializer, std::move(bluetooth_adapter), g_fast_pair_delegate);
@@ -53,6 +55,7 @@
 }  // namespace
 
 void Initialize(FastPairDelegate* delegate) {
+  BLUETOOTH_LOG(EVENT) << "Beginning CrosBluetoothConfig initialization";
   CHECK(ash::features::IsBluetoothRevampEnabled());
   CHECK(!g_instance);
   DCHECK_EQ(ash::features::IsFastPairEnabled(), static_cast<bool>(delegate));
@@ -64,6 +67,7 @@
 }
 
 void Shutdown() {
+  BLUETOOTH_LOG(EVENT) << "Shutting down CrosBluetoothConfig";
   CHECK(ash::features::IsBluetoothRevampEnabled());
   if (g_instance) {
     delete g_instance;
@@ -89,6 +93,7 @@
 
 void BindToInProcessInstance(
     mojo::PendingReceiver<mojom::CrosBluetoothConfig> pending_receiver) {
+  BLUETOOTH_LOG(DEBUG) << "Binding to CrosBluetoothConfig";
   CHECK(ash::features::IsBluetoothRevampEnabled());
   DCHECK_EQ(ash::features::IsFastPairEnabled(),
             static_cast<bool>(g_fast_pair_delegate));
diff --git a/chromeos/services/device_sync/cryptauth_device_manager_impl.cc b/chromeos/services/device_sync/cryptauth_device_manager_impl.cc
index 842e0ca..78abec80 100644
--- a/chromeos/services/device_sync/cryptauth_device_manager_impl.cc
+++ b/chromeos/services/device_sync/cryptauth_device_manager_impl.cc
@@ -752,7 +752,7 @@
   const base::Value* unlock_key_list =
       pref_service_->GetList(prefs::kCryptAuthDeviceSyncUnlockKeys);
   synced_devices_.clear();
-  for (const auto& it : unlock_key_list->GetList()) {
+  for (const auto& it : unlock_key_list->GetListDeprecated()) {
     if (it.is_dict()) {
       cryptauth::ExternalDeviceInfo unlock_key;
       if (DictionaryToUnlockKey(it, &unlock_key)) {
diff --git a/chromeos/services/device_sync/cryptauth_device_manager_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_device_manager_impl_unittest.cc
index 8f0956b..7337d412 100644
--- a/chromeos/services/device_sync/cryptauth_device_manager_impl_unittest.cc
+++ b/chromeos/services/device_sync/cryptauth_device_manager_impl_unittest.cc
@@ -186,11 +186,13 @@
 
   const base::Value* synced_devices_pref =
       pref_service.GetList(prefs::kCryptAuthDeviceSyncUnlockKeys);
-  ASSERT_EQ(expected_devices.size(), synced_devices_pref->GetList().size());
-  for (size_t i = 0; i < synced_devices_pref->GetList().size(); ++i) {
+  ASSERT_EQ(expected_devices.size(),
+            synced_devices_pref->GetListDeprecated().size());
+  for (size_t i = 0; i < synced_devices_pref->GetListDeprecated().size(); ++i) {
     SCOPED_TRACE(base::StringPrintf("Compare pref dictionary at index=%d",
                                     static_cast<int>(i)));
-    const base::Value& device_dictionary = synced_devices_pref->GetList()[i];
+    const base::Value& device_dictionary =
+        synced_devices_pref->GetListDeprecated()[i];
     EXPECT_TRUE(device_dictionary.is_dict());
 
     const auto& expected_device = expected_devices[i];
@@ -298,9 +300,11 @@
         device_dictionary.FindListKey("beacon_seeds");
     if (beacon_seeds_from_prefs) {
       ASSERT_EQ(static_cast<size_t>(expected_device.beacon_seeds_size()),
-                beacon_seeds_from_prefs->GetList().size());
-      for (size_t i = 0; i < beacon_seeds_from_prefs->GetList().size(); i++) {
-        const base::Value& seed = beacon_seeds_from_prefs->GetList()[i];
+                beacon_seeds_from_prefs->GetListDeprecated().size());
+      for (size_t i = 0;
+           i < beacon_seeds_from_prefs->GetListDeprecated().size(); i++) {
+        const base::Value& seed =
+            beacon_seeds_from_prefs->GetListDeprecated()[i];
         ASSERT_TRUE(seed.is_dict());
 
         const std::string* data_b64 = seed.FindStringKey("beacon_seed_data");
@@ -958,7 +962,7 @@
   device_manager_->Start();
   EXPECT_EQ(1u, device_manager_->GetSyncedDevices().size());
   EXPECT_EQ(1u, pref_service_.GetList(prefs::kCryptAuthDeviceSyncUnlockKeys)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
 
   FireSchedulerForSync(cryptauth::INVOCATION_REASON_PERIODIC);
diff --git a/chromeos/services/device_sync/cryptauth_key_bundle.cc b/chromeos/services/device_sync/cryptauth_key_bundle.cc
index f49e1d89..07f776f 100644
--- a/chromeos/services/device_sync/cryptauth_key_bundle.cc
+++ b/chromeos/services/device_sync/cryptauth_key_bundle.cc
@@ -96,7 +96,7 @@
     return absl::nullopt;
 
   bool active_key_exists = false;
-  for (const base::Value& key_dict : keys->GetList()) {
+  for (const base::Value& key_dict : keys->GetListDeprecated()) {
     absl::optional<CryptAuthKey> key = CryptAuthKey::FromDictionary(key_dict);
     if (!key)
       return absl::nullopt;
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc
index 4e8eee3..c4059fe 100644
--- a/chromeos/services/network_config/cros_network_config.cc
+++ b/chromeos/services/network_config/cros_network_config.cc
@@ -617,7 +617,7 @@
     return result;
   }
   if (v) {
-    for (const base::Value& e : v->GetList())
+    for (const base::Value& e : v->GetListDeprecated())
       result.push_back(e.GetInt());
   }
   return result;
@@ -642,7 +642,7 @@
     return absl::nullopt;
   }
   std::vector<std::string> result;
-  for (const base::Value& e : v->GetList())
+  for (const base::Value& e : v->GetListDeprecated())
     result.push_back(e.GetString());
   return result;
 }
@@ -826,7 +826,7 @@
   if (v->is_list()) {
     auto result = mojom::ManagedStringList::New();
     std::vector<std::string> active;
-    for (const base::Value& e : v->GetList())
+    for (const base::Value& e : v->GetListDeprecated())
       active.push_back(e.GetString());
     result->active_value = std::move(active);
     return result;
@@ -935,7 +935,7 @@
 
   if (value->is_list()) {
     std::vector<mojom::SubjectAltNamePtr> active;
-    for (const base::Value& value : value->GetList())
+    for (const base::Value& value : value->GetListDeprecated())
       active.push_back(GetSubjectAltName(&value));
     result->active_value = std::move(active);
     return result;
@@ -1101,7 +1101,7 @@
   if (value->is_list()) {
     auto result = mojom::ManagedApnList::New();
     std::vector<mojom::ApnPropertiesPtr> active;
-    for (const base::Value& value : value->GetList())
+    for (const base::Value& value : value->GetListDeprecated())
       active.push_back(GetApnProperties(&value));
     result->active_value = std::move(active);
     return result;
@@ -1137,7 +1137,7 @@
     NET_LOG(ERROR) << "Expected list, found: " << *v;
     return result;
   }
-  for (const base::Value& e : v->GetList()) {
+  for (const base::Value& e : v->GetListDeprecated()) {
     auto found_network = mojom::FoundNetworkProperties::New();
     found_network->status =
         GetRequiredString(&e, ::onc::cellular_found_network::kStatus);
@@ -1422,7 +1422,7 @@
     return result;
   if (value->is_list()) {
     std::vector<mojom::WireGuardPeerPropertiesPtr> active;
-    for (const base::Value& value : value->GetList())
+    for (const base::Value& value : value->GetListDeprecated())
       active.push_back(GetWireGuardPeerProperties(&value));
     result->active_value = std::move(active);
     return result;
@@ -1512,7 +1512,8 @@
       properties->FindKey(::onc::network_config::kIPConfigs);
   if (ip_configs_list) {
     std::vector<mojom::IPConfigPropertiesPtr> ip_configs;
-    for (const base::Value& ip_config_value : ip_configs_list->GetList())
+    for (const base::Value& ip_config_value :
+         ip_configs_list->GetListDeprecated())
       ip_configs.push_back(GetIPConfig(&ip_config_value));
     result->ip_configs = std::move(ip_configs);
   }
@@ -2863,7 +2864,7 @@
     return mojo_custom_apns;
   }
   DCHECK(custom_apn_list->is_list());
-  for (const auto& apn : custom_apn_list->GetList()) {
+  for (const auto& apn : custom_apn_list->GetListDeprecated()) {
     DCHECK(apn.is_dict());
     mojom::ApnPropertiesPtr mojo_apn = mojom::ApnProperties::New();
     mojo_apn->access_point_name =
@@ -3177,12 +3178,12 @@
     RequestTrafficCountersCallback callback,
     absl::optional<base::Value> traffic_counters) {
   if (!traffic_counters || !traffic_counters->is_list() ||
-      !traffic_counters->GetList().size()) {
+      !traffic_counters->GetListDeprecated().size()) {
     std::move(callback).Run({});
     return;
   }
   std::vector<mojom::TrafficCounterPtr> counters;
-  for (const base::Value& tc : traffic_counters->GetList()) {
+  for (const base::Value& tc : traffic_counters->GetListDeprecated()) {
     DCHECK(tc.is_dict());
     const base::Value* source =
         tc.FindKeyOfType("source", base::Value::Type::STRING);
diff --git a/chromeos/services/network_config/cros_network_config_unittest.cc b/chromeos/services/network_config/cros_network_config_unittest.cc
index e8d86b8..783f459 100644
--- a/chromeos/services/network_config/cros_network_config_unittest.cc
+++ b/chromeos/services/network_config/cros_network_config_unittest.cc
@@ -82,10 +82,10 @@
     const base::Value* expected_traffic_counters,
     enum ComparisonType comparison_type) {
   EXPECT_EQ(actual_traffic_counters.size(),
-            expected_traffic_counters->GetList().size());
+            expected_traffic_counters->GetListDeprecated().size());
   for (size_t i = 0; i < actual_traffic_counters.size(); i++) {
     auto& actual_tc = actual_traffic_counters[i];
-    auto& expected_tc = expected_traffic_counters->GetList()[i];
+    auto& expected_tc = expected_traffic_counters->GetListDeprecated()[i];
     EXPECT_EQ(actual_tc->source,
               CrosNetworkConfig::GetTrafficCounterEnumForTesting(
                   expected_tc.FindKey("source")->GetString()));
diff --git a/chromeos/system/statistics_provider.cc b/chromeos/system/statistics_provider.cc
index 962f8567..3c8c5b4 100644
--- a/chromeos/system/statistics_provider.cc
+++ b/chromeos/system/statistics_provider.cc
@@ -110,7 +110,7 @@
 
   std::string buffer;
   bool first = true;
-  for (const auto& v : list_value->GetList()) {
+  for (const auto& v : list_value->GetListDeprecated()) {
     const std::string* value = v.GetIfString();
     if (!value)
       return false;
@@ -134,10 +134,10 @@
                                const std::string key,
                                std::string* result) {
   const base::Value* list_value = dictionary.FindListKey(key);
-  if (list_value == nullptr || list_value->GetList().empty())
+  if (list_value == nullptr || list_value->GetListDeprecated().empty())
     return false;
 
-  const std::string* value = list_value->GetList()[0].GetIfString();
+  const std::string* value = list_value->GetListDeprecated()[0].GetIfString();
   if (value == nullptr)
     return false;
   if (result != nullptr)
diff --git a/components/accuracy_tips/accuracy_service.cc b/components/accuracy_tips/accuracy_service.cc
index d033e7e..0719bd7 100644
--- a/components/accuracy_tips/accuracy_service.cc
+++ b/components/accuracy_tips/accuracy_service.cc
@@ -115,7 +115,7 @@
       pref_service_->Get(GetPreviousInteractionsPrefName(disable_ui_));
   const base::Value opt_out_value(
       static_cast<int>(AccuracyTipInteraction::kOptOut));
-  if (base::Contains(last_interactions->GetList(), opt_out_value)) {
+  if (base::Contains(last_interactions->GetListDeprecated(), opt_out_value)) {
     return std::move(callback).Run(AccuracyTipStatus::kOptOut);
   }
 
@@ -162,7 +162,7 @@
 
   bool show_opt_out =
       pref_service_->GetList(GetPreviousInteractionsPrefName(disable_ui_))
-          ->GetList()
+          ->GetListDeprecated()
           .size() >= static_cast<size_t>(features::kNumIgnorePrompts.Get());
 
   url_for_last_shown_tip_ = web_contents->GetLastCommittedURL();
@@ -182,7 +182,8 @@
   if (CanShowSurvey()) {
     auto* interactions_list =
         pref_service_->GetList(GetPreviousInteractionsPrefName(disable_ui_));
-    const int last_interaction = interactions_list->GetList().back().GetInt();
+    const int last_interaction =
+        interactions_list->GetListDeprecated().back().GetInt();
     const bool ukm_enabled = pref_service_->GetBoolean(
         unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled);
     std::string url_parameter_for_hats =
@@ -242,7 +243,7 @@
   base::UmaHistogramEnumeration("Privacy.AccuracyTip.AccuracyTipInteraction",
                                 interaction);
   base::UmaHistogramCounts100("Privacy.AccuracyTip.NumDialogsShown",
-                              interaction_list->GetList().size());
+                              interaction_list->GetListDeprecated().size());
   ukm::builders::AccuracyTipDialog ukm_builder(ukm_source_id);
   ukm_builder.SetInteraction(static_cast<int>(interaction));
 
@@ -255,7 +256,7 @@
 
     const std::string suffix = GetHistogramSuffix(interaction);
     base::UmaHistogramCounts100("Privacy.AccuracyTip.NumDialogsShown." + suffix,
-                                interaction_list->GetList().size());
+                                interaction_list->GetListDeprecated().size());
     base::UmaHistogramMediumTimes(
         "Privacy.AccuracyTip.AccuracyTipTimeOpen." + suffix, time_open);
   }
@@ -287,7 +288,7 @@
 
   int interactions_count =
       pref_service_->GetList(GetPreviousInteractionsPrefName(disable_ui_))
-          ->GetList()
+          ->GetListDeprecated()
           .size();
   return interactions_count >= features::kMinPromptCountRequiredForSurvey.Get();
 }
diff --git a/components/app_restore/app_restore_data.cc b/components/app_restore/app_restore_data.cc
index b33b5eb..52904ef 100644
--- a/components/app_restore/app_restore_data.cc
+++ b/components/app_restore/app_restore_data.cc
@@ -133,12 +133,12 @@
 
   const base::Value* urls_path_value = dict.FindListKey(kUrlsKey);
   if (!urls_path_value || !urls_path_value->is_list() ||
-      urls_path_value->GetList().empty()) {
+      urls_path_value->GetListDeprecated().empty()) {
     return absl::nullopt;
   }
 
   std::vector<GURL> url_paths;
-  for (const auto& item : urls_path_value->GetList()) {
+  for (const auto& item : urls_path_value->GetListDeprecated()) {
     if (item.GetString().empty())
       continue;
     GURL url(item.GetString());
@@ -160,11 +160,11 @@
 
   const base::Value* file_paths_value = dict.FindListKey(kFilePathsKey);
   if (!file_paths_value || !file_paths_value->is_list() ||
-      file_paths_value->GetList().empty())
+      file_paths_value->GetListDeprecated().empty())
     return absl::nullopt;
 
   std::vector<base::FilePath> file_paths;
-  for (const auto& item : file_paths_value->GetList()) {
+  for (const auto& item : file_paths_value->GetListDeprecated()) {
     if (item.GetString().empty())
       continue;
     file_paths.push_back(base::FilePath(item.GetString()));
@@ -182,12 +182,12 @@
 
   const base::Value* size_value = dict.FindListKey(key_name);
   if (!size_value || !size_value->is_list() ||
-      size_value->GetList().size() != 2) {
+      size_value->GetListDeprecated().size() != 2) {
     return absl::nullopt;
   }
 
   std::vector<int> size;
-  for (const auto& item : size_value->GetList())
+  for (const auto& item : size_value->GetListDeprecated())
     size.push_back(item.GetInt());
 
   return gfx::Size(size[0], size[1]);
@@ -202,11 +202,12 @@
     return absl::nullopt;
 
   const base::Value* rect_value = dict.FindListKey(key_name);
-  if (!rect_value || !rect_value->is_list() || rect_value->GetList().empty())
+  if (!rect_value || !rect_value->is_list() ||
+      rect_value->GetListDeprecated().empty())
     return absl::nullopt;
 
   std::vector<int> rect;
-  for (const auto& item : rect_value->GetList())
+  for (const auto& item : rect_value->GetListDeprecated())
     rect.push_back(item.GetInt());
 
   if (rect.size() != 4)
diff --git a/components/autofill/android/BUILD.gn b/components/autofill/android/BUILD.gn
index 0af6d75d..7cd223d 100644
--- a/components/autofill/android/BUILD.gn
+++ b/components/autofill/android/BUILD.gn
@@ -30,6 +30,7 @@
 
 java_cpp_enum("autofill_core_browser_java_enums") {
   sources = [
+    "../core/browser/data_model/credit_card.h",
     "../core/browser/ui/accessory_sheet_enums.h",
     "../core/browser/ui/popup_item_ids.h",
   ]
diff --git a/components/autofill/content/browser/form_forest.cc b/components/autofill/content/browser/form_forest.cc
index 7a2186f..edcd033 100644
--- a/components/autofill/content/browser/form_forest.cc
+++ b/components/autofill/content/browser/form_forest.cc
@@ -36,8 +36,7 @@
 #define AFCRASHDUMP() base::debug::DumpWithoutCrashing()
 #endif
 
-namespace autofill {
-namespace internal {
+namespace autofill::internal {
 
 namespace {
 
@@ -612,8 +611,8 @@
       };
       // Fields in frames whose permissions policy allows shared-autofill may
       // be filled if the |triggered_origin| is the main origin.
-      auto has_shared_autofill_permission = [&mutable_this](
-                                                LocalFrameToken frame_token) {
+      auto HasSharedAutofillPermission = [&mutable_this](
+                                             LocalFrameToken frame_token) {
         FrameData* frame = mutable_this.GetFrameData(frame_token);
         return frame && frame->driver && frame->driver->render_frame_host() &&
                frame->driver->render_frame_host()->IsFeatureEnabled(
@@ -626,9 +625,10 @@
           it != field_type_map.end() ? it->second : UNKNOWN_TYPE;
       return field.origin == triggered_origin ||
              (field.origin == main_origin &&
+              HasSharedAutofillPermission(renderer_form->host_frame) &&
               !IsSensitiveFieldType(field_type)) ||
              (triggered_origin == main_origin &&
-              has_shared_autofill_permission(renderer_form->host_frame));
+              HasSharedAutofillPermission(renderer_form->host_frame));
     };
 
     renderer_form->fields.push_back(browser_field);
@@ -639,5 +639,4 @@
   return renderer_forms;
 }
 
-}  // namespace internal
-}  // namespace autofill
+}  // namespace autofill::internal
diff --git a/components/autofill/content/browser/form_forest.h b/components/autofill/content/browser/form_forest.h
index 397872e9..a0b26cb6f 100644
--- a/components/autofill/content/browser/form_forest.h
+++ b/components/autofill/content/browser/form_forest.h
@@ -17,8 +17,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/abseil-cpp/absl/types/variant.h"
 
-namespace autofill {
-namespace internal {
+namespace autofill::internal {
 
 // FormForest converts renderer forms into a browser form and vice versa.
 //
@@ -371,7 +370,6 @@
       frame_datas_;
 };
 
-}  // namespace internal
-}  // namespace autofill
+}  // namespace autofill::internal
 
 #endif  // COMPONENTS_AUTOFILL_CONTENT_BROWSER_FORM_FOREST_H_
diff --git a/components/autofill/content/browser/form_forest_unittest.cc b/components/autofill/content/browser/form_forest_unittest.cc
index c001326..98700db5 100644
--- a/components/autofill/content/browser/form_forest_unittest.cc
+++ b/components/autofill/content/browser/form_forest_unittest.cc
@@ -299,9 +299,18 @@
 // RemoteFrameTokens.)
 class FormForestTest : public content::RenderViewHostTestHarness {
  public:
-  // The frame's permissions policy affects which fields may be filled (see
+  // "Shared-autofill" may be enabled or disabled per frame for certain origins.
+  // The enum constants correspond to the following permission policies:
+  // - kDefault is the default policy, which enables shared-autofill on the
+  //   main frame origin.
+  // - kSharedAutofill explicitly enables shared-autofill on a (child-) frame
+  //   for its current origin.
+  // - kNoSharedAutofill explicitly disables shared-autofill on a frame for all
+  //   origins.
+  // Child frames inherit the policy from their parents.
+  // "Shared-autofill" restricts cross-origin filling (see
   // FormForest::GetBrowserFormOfRendererForm() for details).
-  enum class Policy { kNone, kSharedAutofill };
+  enum class Policy { kDefault, kSharedAutofill, kNoSharedAutofill };
 
   void SetUp() override {
     RenderViewHostTestHarness::SetUp();
@@ -314,9 +323,22 @@
   }
 
  protected:
-  MockContentAutofillDriver* NavigateMainFrame(const GURL& url) {
-    content::NavigationSimulator::CreateBrowserInitiated(url, web_contents())
-        ->Commit();
+  MockContentAutofillDriver* NavigateMainFrame(
+      const GURL& url,
+      Policy policy = Policy::kDefault) {
+    auto simulator = content::NavigationSimulator::CreateBrowserInitiated(
+        url, web_contents());
+    switch (policy) {
+      case Policy::kDefault:
+        break;
+      case Policy::kSharedAutofill:
+        simulator->SetPermissionsPolicyHeader(AllowSharedAutofill(Origin(url)));
+        break;
+      case Policy::kNoSharedAutofill:
+        simulator->SetPermissionsPolicyHeader(DisallowSharedAutofill());
+        break;
+    }
+    simulator->Commit();
     return GetOrCreateDriver(main_rfh());
   }
 
@@ -327,20 +349,41 @@
       const GURL& url,
       Policy policy,
       base::StringPiece name) {
-    auto permissions =
-        policy != Policy::kSharedAutofill
-            ? blink::ParsedPermissionsPolicy()
-            : blink::ParsedPermissionsPolicy(
-                  {blink::ParsedPermissionsPolicyDeclaration(
-                      blink::mojom::PermissionsPolicyFeature::kSharedAutofill,
-                      {Origin(url)}, false, false)});
+    blink::ParsedPermissionsPolicy declared_policy;
+    switch (policy) {
+      case Policy::kDefault:
+        declared_policy = {};
+        break;
+      case Policy::kSharedAutofill:
+        declared_policy = AllowSharedAutofill(Origin(url));
+        break;
+      case Policy::kNoSharedAutofill:
+        declared_policy = DisallowSharedAutofill();
+        break;
+    }
     content::RenderFrameHost* rfh =
         content::RenderFrameHostTester::For(parent->render_frame_host())
-            ->AppendChildWithPolicy(std::string(name), permissions);
+            ->AppendChildWithPolicy(static_cast<std::string>(name),
+                                    declared_policy);
     return NavigateFrame(rfh, url);
   }
 
  private:
+  // Explicitly allows shared-autofill on |origin|.
+  static blink::ParsedPermissionsPolicy AllowSharedAutofill(
+      url::Origin origin) {
+    return {blink::ParsedPermissionsPolicyDeclaration(
+        blink::mojom::PermissionsPolicyFeature::kSharedAutofill, {origin},
+        false, false)};
+  }
+
+  // Explicitly disallows shared-autofill on all origins.
+  static blink::ParsedPermissionsPolicy DisallowSharedAutofill() {
+    return {blink::ParsedPermissionsPolicyDeclaration(
+        blink::mojom::PermissionsPolicyFeature::kSharedAutofill, {}, false,
+        false)};
+  }
+
   MockContentAutofillDriver* NavigateFrame(content::RenderFrameHost* rfh,
                                            const GURL& url) {
     rfh = content::NavigationSimulator::NavigateAndCommitFromDocument(url, rfh);
@@ -376,7 +419,7 @@
     // MockFormForest().
     std::string url = "";
     std::vector<FormInfo> forms = {};
-    FormForestTest::Policy policy = FormForestTest::Policy::kNone;
+    FormForestTest::Policy policy = FormForestTest::Policy::kDefault;
     // The index of the last field from the parent form that precedes this
     // frame. This is analogous to FormData::child_frames[i].predecessor.
     int field_predecessor = std::numeric_limits<int>::max();
@@ -414,12 +457,12 @@
                  : (!parent_driver ? kMainUrl : kIframeUrl));
     MockContentAutofillDriver* driver =
         !parent_driver
-            ? NavigateMainFrame(url)
+            ? NavigateMainFrame(url, frame_info.policy)
             : CreateAndNavigateChildFrame(parent_driver, url, frame_info.policy,
                                           frame_info.name);
     if (!frame_info.name.empty()) {
       CHECK(!base::Contains(drivers_, frame_info.name));
-      drivers_.emplace(std::string(frame_info.name), driver);
+      drivers_.emplace(frame_info.name, driver);
     }
 
     std::vector<FormData> forms;
@@ -1480,8 +1523,9 @@
               UnorderedArrayEquals(expectation));
 }
 
-// Tests that (only) non-sensitive fields are filled cross-origin into the main
-// frame's origin.
+// Tests that (only) non-sensitive fields are filled across origin into the main
+// frame's origin (since the main frame has the shared-autofill policy by
+// default).
 TEST_F(FormForestTestUnflatten, MainOriginPolicy) {
   MockFormForest(
       {.url = kMainUrl,
@@ -1504,6 +1548,26 @@
               UnorderedArrayEquals(expectation));
 }
 
+// Tests that no fields are filled across origin into frames where
+// shared-autofill is disabled (not even into non-sensitive fields).
+TEST_F(FormForestTestUnflatten, MainOriginPolicyWithoutSharedAutofill) {
+  MockFormForest(
+      {.url = kMainUrl,
+       .forms = {{.name = "main",
+                  .frames = {{.url = kMainUrl, .forms = {{.name = "child1"}}},
+                             {.url = kIframeUrl,
+                              .forms = {{.name = "child2"}}}}}},
+       .policy = Policy::kNoSharedAutofill});
+  MockFlattening({{"main"}, {"child1"}, {"child2"}});
+  std::vector<FormData> expectation = {
+      WithoutValues(GetMockedForm("main")),
+      WithoutValues(GetMockedForm("child1")),
+      WithValues(GetMockedForm("child2"), Profile(2))};
+  EXPECT_THAT(GetRendererFormsOfBrowserForm("main", Origin(kIframeUrl),
+                                            FieldTypeMap("main")),
+              UnorderedArrayEquals(expectation));
+}
+
 // Fixture for the shared-autofill policy tests.
 class FormForestTestUnflattenSharedAutofillPolicy
     : public FormForestTestUnflatten {
diff --git a/components/autofill/core/browser/data_model/credit_card.h b/components/autofill/core/browser/data_model/credit_card.h
index b8accbd6..dcfebdc 100644
--- a/components/autofill/core/browser/data_model/credit_card.h
+++ b/components/autofill/core/browser/data_model/credit_card.h
@@ -66,7 +66,9 @@
   };
 
   // Whether the card has been enrolled in the virtual card feature. This must
-  // stay in sync with the proto enum in autofill_specifics.proto.
+  // stay in sync with the proto enum in autofill_specifics.proto. A java
+  // IntDef@ is generated from this.
+  // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.autofill
   enum VirtualCardEnrollmentState {
     // State unspecified. This is the default value of this enum. Should not be
     // ever used with cards.
diff --git a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
index ecb0d70..da83914 100644
--- a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
+++ b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
@@ -163,6 +163,26 @@
         break;
     }
     Log(e, form);
+
+    // In a multi-frame form, a cross-origin field is only filled if
+    // shared-autofill is enabled in the field's frame. If Autofill was
+    // triggered on the main origin, shared-autofill is even sufficient for the
+    // fill. We therefore log how often enabling shared-autofill would suffice
+    // to fix Autofill.
+    //
+    // Shared-autofill is a policy-controlled feature. As such, a parent frame
+    // can enable it in a child frame with in the iframe's "allow" attribute:
+    // <iframe allow="shared-autofill">.
+    const url::Origin& triggered_origin = field.origin;
+    if (triggered_origin == form.main_frame_origin() &&
+        base::ranges::any_of(form, [&](const auto& f) {
+          FieldGlobalId id = f->global_id();
+          return f->origin != form.main_frame_origin() &&
+                 field_types_to_be_filled_before_security_policy.contains(id) &&
+                 !field_types_filled_after_security_policy.contains(id);
+        })) {
+      Log(FORM_EVENT_CREDIT_CARD_MISSING_SHARED_AUTOFILL, form);
+    }
   }
 
   switch (record_type) {
diff --git a/components/autofill/core/browser/metrics/form_events/form_events.h b/components/autofill/core/browser/metrics/form_events/form_events.h
index 3a953e7..6a36695 100644
--- a/components/autofill/core/browser/metrics/form_events/form_events.h
+++ b/components/autofill/core/browser/metrics/form_events/form_events.h
@@ -121,6 +121,11 @@
   FORM_EVENT_CREDIT_CARD_SEAMLESSNESS_FULL_FILL_BUT_EXPDATE_MISSING,
   FORM_EVENT_CREDIT_CARD_SEAMLESSNESS_PARTIAL_FILL,
 
+  // A cross-origin fill was prevented only because shared-autofill was disabled
+  // in the field's frame. Shared-autofill is a policy-controlled feature by
+  // which a frame can allow a child-frame to be autofilled across origin.
+  FORM_EVENT_CREDIT_CARD_MISSING_SHARED_AUTOFILL,
+
   NUM_FORM_EVENTS,
 };
 
diff --git a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.cc b/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.cc
index eb36adc..e045e01 100644
--- a/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.cc
+++ b/components/autofill/core/browser/pattern_provider/pattern_configuration_parser.cc
@@ -40,7 +40,7 @@
     return absl::nullopt;
 
   DenseSet<Enum> set;
-  for (const base::Value& v : list_value->GetList()) {
+  for (const base::Value& v : list_value->GetListDeprecated()) {
     if (!v.is_int())
       return absl::nullopt;
     int i = v.GetInt();
@@ -154,7 +154,7 @@
         return absl::nullopt;
       }
 
-      for (const auto& matchingPatternObj : inner_list->GetList()) {
+      for (const auto& matchingPatternObj : inner_list->GetListDeprecated()) {
         bool success = ParseMatchingPattern(patterns, field_type, language,
                                             matchingPatternObj);
         if (!success) {
diff --git a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
index 8d11e1e..0c67d24 100644
--- a/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
+++ b/components/autofill/core/browser/payments/credit_card_fido_authenticator.cc
@@ -579,7 +579,7 @@
   const auto* key_info_list =
       request_options.FindKeyOfType("key_info", base::Value::Type::LIST);
   DCHECK(key_info_list);
-  for (const base::Value& key_info : key_info_list->GetList()) {
+  for (const base::Value& key_info : key_info_list->GetListDeprecated()) {
     options->allow_credentials.push_back(ParseCredentialDescriptor(key_info));
   }
 
@@ -628,7 +628,8 @@
   const auto* identifier_list = creation_options.FindKeyOfType(
       "algorithm_identifier", base::Value::Type::LIST);
   if (identifier_list) {
-    for (const base::Value& algorithm_identifier : identifier_list->GetList()) {
+    for (const base::Value& algorithm_identifier :
+         identifier_list->GetListDeprecated()) {
       device::PublicKeyCredentialParams::CredentialInfo parameter;
       parameter.type = device::CredentialType::kPublicKey;
       parameter.algorithm = algorithm_identifier.GetInt();
@@ -664,7 +665,8 @@
   const auto* excluded_keys_list =
       creation_options.FindKeyOfType("key_info", base::Value::Type::LIST);
   if (excluded_keys_list) {
-    for (const base::Value& key_info : excluded_keys_list->GetList()) {
+    for (const base::Value& key_info :
+         excluded_keys_list->GetListDeprecated()) {
       options->exclude_credentials.push_back(
           ParseCredentialDescriptor(key_info));
     }
@@ -684,8 +686,8 @@
   base::flat_set<FidoTransportProtocol> authenticator_transports;
   const auto* transports = key_info.FindKeyOfType(
       "authenticator_transport_support", base::Value::Type::LIST);
-  if (transports && !transports->GetList().empty()) {
-    for (const base::Value& transport_type : transports->GetList()) {
+  if (transports && !transports->GetListDeprecated().empty()) {
+    for (const base::Value& transport_type : transports->GetListDeprecated()) {
       absl::optional<FidoTransportProtocol> protocol =
           device::ConvertToFidoTransportProtocol(
               base::ToLowerASCII(transport_type.GetString()));
@@ -749,10 +751,10 @@
   const auto* key_info_list =
       request_options.FindKeyOfType("key_info", base::Value::Type::LIST);
 
-  if (key_info_list->GetList().empty())
+  if (key_info_list->GetListDeprecated().empty())
     return false;
 
-  for (const base::Value& key_info : key_info_list->GetList()) {
+  for (const base::Value& key_info : key_info_list->GetListDeprecated()) {
     if (!key_info.is_dict() || !key_info.FindStringKey("credential_id"))
       return false;
   }
diff --git a/components/autofill/core/browser/payments/legal_message_line.cc b/components/autofill/core/browser/payments/legal_message_line.cc
index 9eda618..84d946d1 100644
--- a/components/autofill/core/browser/payments/legal_message_line.cc
+++ b/components/autofill/core/browser/payments/legal_message_line.cc
@@ -85,8 +85,8 @@
       legal_message.FindKeyOfType("line", base::Value::Type::LIST);
   if (lines_list) {
     LegalMessageLines lines;
-    lines.reserve(lines_list->GetList().size());
-    for (const base::Value& single_line : lines_list->GetList()) {
+    lines.reserve(lines_list->GetListDeprecated().size());
+    for (const base::Value& single_line : lines_list->GetListDeprecated()) {
       lines.emplace_back(LegalMessageLine());
       if (!single_line.is_dict() ||
           !lines.back().ParseLine(single_line, escape_apostrophes))
@@ -113,7 +113,7 @@
       line.FindKeyOfType("template_parameter", base::Value::Type::LIST);
   if (template_parameters) {
     base::Value::ConstListView template_parameters_view =
-        template_parameters->GetList();
+        template_parameters->GetListDeprecated();
     display_texts.reserve(template_parameters_view.size());
     links_.reserve(template_parameters_view.size());
 
diff --git a/components/autofill/core/browser/payments/payments_client.cc b/components/autofill/core/browser/payments/payments_client.cc
index d77b83e..4c8a671 100644
--- a/components/autofill/core/browser/payments/payments_client.cc
+++ b/components/autofill/core/browser/payments/payments_client.cc
@@ -277,7 +277,8 @@
     const auto* fido_eligible_card_ids = response.FindKeyOfType(
         "fido_eligible_card_id", base::Value::Type::LIST);
     if (fido_eligible_card_ids) {
-      for (const base::Value& result : fido_eligible_card_ids->GetList()) {
+      for (const base::Value& result :
+           fido_eligible_card_ids->GetListDeprecated()) {
         unmask_details_.fido_eligible_card_ids.insert(result.GetString());
       }
     }
@@ -826,7 +827,7 @@
 
     save_result_ =
         std::make_unique<std::unordered_map<std::string, std::string>>();
-    for (const base::Value& result : found_list->GetList()) {
+    for (const base::Value& result : found_list->GetListDeprecated()) {
       if (result.is_dict()) {
         const std::string* unique_id = result.FindStringKey("unique_id");
         const std::string* status = result.FindStringKey("status");
diff --git a/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc b/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc
index d92aef0..16357ea9 100644
--- a/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc
+++ b/components/autofill/core/browser/payments/payments_requests/unmask_card_request.cc
@@ -214,7 +214,7 @@
   if (challenge_option_list) {
     std::vector<CardUnmaskChallengeOption> card_unmask_challenge_options;
     for (const base::Value& challenge_option :
-         challenge_option_list->GetList()) {
+         challenge_option_list->GetListDeprecated()) {
       CardUnmaskChallengeOption parsed_challenge_option =
           ParseCardUnmaskChallengeOption(challenge_option);
       // Only return successfully parsed challenge option.
diff --git a/components/autofill/core/browser/payments/payments_service_url.cc b/components/autofill/core/browser/payments/payments_service_url.cc
index 53e27d3..ef6b9ee 100644
--- a/components/autofill/core/browser/payments/payments_service_url.cc
+++ b/components/autofill/core/browser/payments/payments_service_url.cc
@@ -22,8 +22,10 @@
 
 // Service URLs used for calls to Google Payments endpoints.
 const char kProdPaymentsServiceUrl[] = "https://payments.google.com/";
+// LINT.IfChange
 const char kSandboxPaymentsSecureServiceUrl[] =
     "https://payments.sandbox.google.com/";
+// LINT.ThenChange(//chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialog.java)
 
 // URLs used when opening the Payment methods management page from
 // chrome://settings/payments.
diff --git a/components/autofill/core/common/logging/log_buffer.cc b/components/autofill/core/common/logging/log_buffer.cc
index 666fad6f..18037e67 100644
--- a/components/autofill/core/common/logging/log_buffer.cc
+++ b/components/autofill/core/common/logging/log_buffer.cc
@@ -65,8 +65,8 @@
   auto* children = parent.FindListKey("children");
   if (!children)
     return false;
-  DCHECK(!children->GetList().empty());
-  auto& last_child = children->GetList().back();
+  DCHECK(!children->GetListDeprecated().empty());
+  auto& last_child = children->GetListDeprecated().back();
   if (!IsTextNode(last_child))
     return false;
   std::string* old_text = last_child.FindStringKey("value");
@@ -99,12 +99,12 @@
     *this << CTag{};
 
   auto* children = buffer_[0].FindListKey("children");
-  if (!children || children->GetList().empty())
+  if (!children || children->GetListDeprecated().empty())
     return base::Value();
 
   // If the fragment has a single child, remove it from |children| and return
   // that directly.
-  if (children->GetList().size() == 1) {
+  if (children->GetListDeprecated().size() == 1) {
     return std::move(std::move(*children).TakeListDeprecated().back());
   }
 
@@ -197,7 +197,7 @@
     auto* children = node_to_add.FindListKey("children");
     if (!children)
       return buf;
-    for (auto& child : children->GetList())
+    for (auto& child : children->GetListDeprecated())
       AppendChildToLastNode(&buf.buffer_, std::exchange(child, base::Value()));
     return buf;
   }
diff --git a/components/autofill/ios/browser/autofill_util.mm b/components/autofill/ios/browser/autofill_util.mm
index 81f1fda..3cbb260 100644
--- a/components/autofill/ios/browser/autofill_util.mm
+++ b/components/autofill/ios/browser/autofill_util.mm
@@ -101,7 +101,7 @@
 
   // Iterate through all the extracted forms and copy the data from JSON into
   // BrowserAutofillManager structures.
-  for (const auto& form_dict : forms_value->GetList()) {
+  for (const auto& form_dict : forms_value->GetListDeprecated()) {
     autofill::FormData form;
     if (ExtractFormData(form_dict, filtered, form_name, main_frame_url,
                         frame_origin, &form))
@@ -165,7 +165,7 @@
   const base::ListValue* fields_list = nullptr;
   if (!form_dictionary->GetList("fields", &fields_list))
     return false;
-  for (const auto& field_dict : fields_list->GetList()) {
+  for (const auto& field_dict : fields_list->GetListDeprecated()) {
     const base::DictionaryValue* field;
     autofill::FormFieldData field_data;
     if (field_dict.GetAsDictionary(&field) &&
@@ -233,8 +233,8 @@
   const base::ListValue* option_contents;
   if (field.GetList("option_values", &option_values) &&
       field.GetList("option_contents", &option_contents)) {
-    auto value_list = option_values->GetList();
-    auto content_list = option_contents->GetList();
+    auto value_list = option_values->GetListDeprecated();
+    auto content_list = option_contents->GetListDeprecated();
     if (value_list.size() != content_list.size())
       return false;
     auto value_it = value_list.begin();
@@ -308,7 +308,7 @@
   if (!ids_value->is_list())
     return false;
 
-  for (const auto& unique_id : ids_value->GetList()) {
+  for (const auto& unique_id : ids_value->GetListDeprecated()) {
     std::string id_string;
     if (!unique_id.GetAsString(&id_string))
       return false;
diff --git a/components/autofill_assistant/browser/starter_heuristic.cc b/components/autofill_assistant/browser/starter_heuristic.cc
index 3d0c615d..9c1482e 100644
--- a/components/autofill_assistant/browser/starter_heuristic.cc
+++ b/components/autofill_assistant/browser/starter_heuristic.cc
@@ -76,7 +76,7 @@
   url_matcher::URLMatcherConditionSet::Vector condition_sets;
   base::flat_map<url_matcher::URLMatcherConditionSet::ID, std::string> mapping;
   url_matcher::URLMatcherConditionSet::ID next_condition_set_id = 0;
-  for (const auto& heuristic : heuristics->GetList()) {
+  for (const auto& heuristic : heuristics->GetListDeprecated()) {
     auto* intent =
         heuristic.FindKeyOfType(kHeuristicIntentKey, base::Value::Type::STRING);
     auto* url_conditions = heuristic.FindKeyOfType(
@@ -104,7 +104,7 @@
   auto* denylisted_domains_value = dict->FindListKey(kDenylistedDomainsKey);
   base::flat_set<std::string> denylisted_domains;
   if (denylisted_domains_value != nullptr) {
-    for (const auto& domain : denylisted_domains_value->GetList()) {
+    for (const auto& domain : denylisted_domains_value->GetListDeprecated()) {
       if (!domain.is_string()) {
         VLOG(1) << "Invalid type for denylisted domain";
         return;
diff --git a/components/autofill_assistant/browser/web/element_rect_getter.cc b/components/autofill_assistant/browser/web/element_rect_getter.cc
index dd6337c..b5e05f3 100644
--- a/components/autofill_assistant/browser/web/element_rect_getter.cc
+++ b/components/autofill_assistant/browser/web/element_rect_getter.cc
@@ -84,7 +84,7 @@
       CheckJavaScriptResult(reply_status, result.get(), __FILE__, __LINE__);
   if (!status.ok() || !result->GetResult()->HasValue() ||
       !result->GetResult()->GetValue()->is_list() ||
-      result->GetResult()->GetValue()->GetList().size() != 4u) {
+      result->GetResult()->GetValue()->GetListDeprecated().size() != 4u) {
     VLOG(2) << __func__ << " Failed to get element rect: " << status;
     std::move(callback).Run(
         JavaScriptErrorStatus(reply_status, __FILE__, __LINE__, nullptr),
@@ -92,7 +92,7 @@
     return;
   }
 
-  const auto& list = result->GetResult()->GetValue()->GetList();
+  const auto& list = result->GetResult()->GetValue()->GetListDeprecated();
   // Value::GetDouble() is safe to call without checking the value type; it'll
   // return 0.0 if the value has the wrong type.
 
diff --git a/components/autofill_assistant/browser/web/selector_observer.cc b/components/autofill_assistant/browser/web/selector_observer.cc
index 16208b5..d165dc2 100644
--- a/components/autofill_assistant/browser/web/selector_observer.cc
+++ b/components/autofill_assistant/browser/web/selector_observer.cc
@@ -552,7 +552,7 @@
 
   const base::Value* updates_val = value->FindKey("updates");
   DCHECK(updates_val->is_list());
-  auto update_list = updates_val->GetList();
+  auto update_list = updates_val->GetListDeprecated();
   if (update_list.size() == 0) {
     AwaitChanges(dom_root);
     return;
diff --git a/components/autofill_assistant/browser/web/web_controller.cc b/components/autofill_assistant/browser/web/web_controller.cc
index 7d18039..79ce36c 100644
--- a/components/autofill_assistant/browser/web/web_controller.cc
+++ b/components/autofill_assistant/browser/web/web_controller.cc
@@ -518,7 +518,7 @@
     return;
   }
 
-  auto values = remote_object->GetValue()->GetList();
+  auto values = remote_object->GetValue()->GetListDeprecated();
   std::vector<std::string> v;
   for (const base::Value& value : values) {
     if (!value.is_string()) {
@@ -1432,14 +1432,14 @@
       CheckJavaScriptResult(reply_status, result.get(), __FILE__, __LINE__);
   if (!status.ok() || !result->GetResult()->HasValue() ||
       !result->GetResult()->GetValue()->is_list() ||
-      result->GetResult()->GetValue()->GetList().size() != 4u) {
+      result->GetResult()->GetValue()->GetListDeprecated().size() != 4u) {
     VLOG(1) << __func__ << " Failed to get visual viewport: " << status;
     std::move(callback).Run(
         JavaScriptErrorStatus(reply_status, __FILE__, __LINE__, nullptr),
         RectF());
     return;
   }
-  const auto& list = result->GetResult()->GetValue()->GetList();
+  const auto& list = result->GetResult()->GetValue()->GetListDeprecated();
   // Value::GetDouble() is safe to call without checking the value type; it'll
   // return 0.0 if the value has the wrong type.
 
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index 27d2ae9..961a9bf 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -612,6 +612,9 @@
   <message name="IDS_AUTOFILL_ERROR_DIALOG_NEGATIVE_BUTTON_LABEL" desc="Label for the negative button for the error dialog.">
     Close
   </message>
+  <message name="IDS_AUTOFILL_VIRTUAL_CARD_NUMBER_SWITCH_LABEL" desc="The text shown as the label for virtual card enrollment switch in the server card edit page." formatter_data="android_java">
+    Virtual card
+  </message>
   <if expr="is_android">
     <message name="IDS_AUTOFILL_VIRTUAL_CARD_NUMBER_SNACKBAR_MESSAGE_TEXT" desc="Text to be displayed in the snackbar shown after a virtual card number id autofilled.">
       Virtual card number not filled in?
diff --git a/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_NUMBER_SWITCH_LABEL.png.sha1 b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_NUMBER_SWITCH_LABEL.png.sha1
new file mode 100644
index 0000000..edcddfe
--- /dev/null
+++ b/components/autofill_payments_strings_grdp/IDS_AUTOFILL_VIRTUAL_CARD_NUMBER_SWITCH_LABEL.png.sha1
@@ -0,0 +1 @@
+a76a2454a5f84e5b80f7824deb29df9e7995ac07
\ No newline at end of file
diff --git a/components/bookmarks/browser/bookmark_codec_unittest.cc b/components/bookmarks/browser/bookmark_codec_unittest.cc
index 2922816..8cce5fa 100644
--- a/components/bookmarks/browser/bookmark_codec_unittest.cc
+++ b/components/bookmarks/browser/bookmark_codec_unittest.cc
@@ -132,7 +132,8 @@
         bb_value->FindListKey(BookmarkCodec::kChildrenKey);
     ASSERT_TRUE(bb_children_value);
 
-    base::Value::ListView bb_children_l_value = bb_children_value->GetList();
+    base::Value::ListView bb_children_l_value =
+        bb_children_value->GetListDeprecated();
     ASSERT_LT(index, bb_children_l_value.size());
 
     base::Value& child_value = bb_children_l_value[index];
diff --git a/components/bookmarks/browser/bookmark_expanded_state_tracker.cc b/components/bookmarks/browser/bookmark_expanded_state_tracker.cc
index 677552f..39148bb 100644
--- a/components/bookmarks/browser/bookmark_expanded_state_tracker.cc
+++ b/components/bookmarks/browser/bookmark_expanded_state_tracker.cc
@@ -48,7 +48,7 @@
     return nodes;
 
   bool changed = false;
-  for (const auto& entry : value->GetList()) {
+  for (const auto& entry : value->GetListDeprecated()) {
     int64_t node_id;
     const BookmarkNode* node;
     const std::string* value_str = entry.GetIfString();
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker.cc b/components/bookmarks/managed/managed_bookmarks_tracker.cc
index fb714d9..6f831d9f 100644
--- a/components/bookmarks/managed/managed_bookmarks_tracker.cc
+++ b/components/bookmarks/managed/managed_bookmarks_tracker.cc
@@ -52,7 +52,7 @@
                                              const base::Value* list,
                                              int64_t next_node_id) {
   DCHECK(list->is_list());
-  for (size_t i = 0; i < list->GetList().size(); ++i) {
+  for (size_t i = 0; i < list->GetListDeprecated().size(); ++i) {
     // Extract the data for the next bookmark from the |list|.
     std::u16string title;
     GURL url;
@@ -116,7 +116,7 @@
                                               const base::Value* list) {
   DCHECK(list->is_list());
   size_t folder_index = 0;
-  for (size_t i = 0; i < list->GetList().size(); ++i) {
+  for (size_t i = 0; i < list->GetListDeprecated().size(); ++i) {
     // Extract the data for the next bookmark from the |list|.
     std::u16string title;
     GURL url;
@@ -165,7 +165,7 @@
   DCHECK(list->is_list());
   *url = GURL();
   *children = nullptr;
-  const base::Value& dict = list->GetList()[index];
+  const base::Value& dict = list->GetListDeprecated()[index];
   if (!dict.is_dict()) {
     // Should never happen after policy validation.
     NOTREACHED();
diff --git a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
index 203e68c1..5084d22 100644
--- a/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
+++ b/components/bookmarks/managed/managed_bookmarks_tracker_unittest.cc
@@ -138,12 +138,14 @@
 
     if (node->is_folder()) {
       const base::Value* children = dict.FindListKey("children");
-      if (!children || node->children().size() != children->GetList().size())
+      if (!children ||
+          node->children().size() != children->GetListDeprecated().size())
         return false;
       size_t i = 0;
       return std::all_of(node->children().cbegin(), node->children().cend(),
                          [children, &i](const auto& child_node) {
-                           const base::Value& child = children->GetList()[i++];
+                           const base::Value& child =
+                               children->GetListDeprecated()[i++];
                            return child.is_dict() &&
                                   NodeMatchesValue(child_node.get(), child);
                          });
diff --git a/components/browsing_data/core/counters/history_counter.cc b/components/browsing_data/core/counters/history_counter.cc
index e482967..9fd579d 100644
--- a/components/browsing_data/core/counters/history_counter.cc
+++ b/components/browsing_data/core/counters/history_counter.cc
@@ -154,7 +154,7 @@
   if (!result)
     has_synced_visits_ = true;
   else if (const base::Value* events = result->FindListKey("event"))
-    has_synced_visits_ = !events->GetList().empty();
+    has_synced_visits_ = !events->GetListDeprecated().empty();
   else
     has_synced_visits_ = false;
   web_counting_finished_ = true;
diff --git a/components/cast_streaming/browser/cast_message_port_impl_unittest.cc b/components/cast_streaming/browser/cast_message_port_impl_unittest.cc
index b71d4159..2d5d7d2 100644
--- a/components/cast_streaming/browser/cast_message_port_impl_unittest.cc
+++ b/components/cast_streaming/browser/cast_message_port_impl_unittest.cc
@@ -247,7 +247,7 @@
 
   const base::Value* status_value = return_value->FindListKey(kKeyStatus);
   ASSERT_TRUE(status_value);
-  EXPECT_EQ(status_value->GetList().size(), 1u);
+  EXPECT_EQ(status_value->GetListDeprecated().size(), 1u);
 }
 
 // Checks sending invalid media messages results in no response.
diff --git a/components/cdm/common/cdm_manifest.cc b/components/cdm/common/cdm_manifest.cc
index 2378886c..614942d 100644
--- a/components/cdm/common/cdm_manifest.cc
+++ b/components/cdm/common/cdm_manifest.cc
@@ -148,7 +148,7 @@
   }
 
   base::flat_set<media::EncryptionScheme> result;
-  for (const auto& item : value->GetList()) {
+  for (const auto& item : value->GetListDeprecated()) {
     if (!item.is_string()) {
       DLOG(ERROR) << "Unrecognized item type in CDM manifest entry "
                   << kCdmSupportedEncryptionSchemesName;
diff --git a/components/certificate_transparency/chrome_ct_policy_enforcer.cc b/components/certificate_transparency/chrome_ct_policy_enforcer.cc
index 9bef5743..9648ae2 100644
--- a/components/certificate_transparency/chrome_ct_policy_enforcer.cc
+++ b/components/certificate_transparency/chrome_ct_policy_enforcer.cc
@@ -220,7 +220,7 @@
     issuance_date = std::min(sct->timestamp, issuance_date);
   }
 
-  // Certificates issued after this date (February 1, 2022, OO:OO:OO GMT)
+  // Certificates issued after this date (April 15, 2022, OO:OO:OO GMT)
   // will be subject to the new CT policy, which:
   // -Removes the One Google log requirement.
   // -Introduces a log operator diversity (at least 2 SCTs that come from
@@ -230,7 +230,7 @@
   // Increases the SCT requirements for certificates with a lifetime between
   // 180 days and 15 months, from 2 to 3.
   const base::Time kPolicyUpdateDate =
-      base::Time::UnixEpoch() + base::Seconds(1643673600);
+      base::Time::UnixEpoch() + base::Seconds(1649980800);
   bool use_2022_policy =
       base::FeatureList::IsEnabled(
           features::kCertificateTransparency2022PolicyAllCerts) ||
diff --git a/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc b/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc
index 4f47099..febb970 100644
--- a/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc
+++ b/components/certificate_transparency/chrome_ct_policy_enforcer_unittest.cc
@@ -692,7 +692,7 @@
     entry.current_operator_ = "Operator " + base::NumberToString(i);
     operator_history[scts[i]->log_id] = entry;
     // Set timestamp to 1 day before new policy comes in effect.
-    EXPECT_TRUE(base::Time::FromUTCExploded({2022, 1, 0, 31, 0, 0, 0, 0},
+    EXPECT_TRUE(base::Time::FromUTCExploded({2022, 4, 0, 14, 0, 0, 0, 0},
                                             &scts[i]->timestamp));
   }
   chrome_policy_enforcer->SetOperatorHistoryForTesting(operator_history);
@@ -717,7 +717,7 @@
     entry.current_operator_ = "Operator " + base::NumberToString(i);
     operator_history[scts[i]->log_id] = entry;
     // Set timestamp to the day new policy comes in effect.
-    EXPECT_TRUE(base::Time::FromUTCExploded({2022, 2, 0, 1, 0, 0, 0, 0},
+    EXPECT_TRUE(base::Time::FromUTCExploded({2022, 4, 0, 15, 0, 0, 0, 0},
                                             &scts[i]->timestamp));
   }
   chrome_policy_enforcer->SetOperatorHistoryForTesting(operator_history);
diff --git a/components/client_hints/common/client_hints.cc b/components/client_hints/common/client_hints.cc
index 5327eb6..75239d95 100644
--- a/components/client_hints/common/client_hints.cc
+++ b/components/client_hints/common/client_hints.cc
@@ -39,7 +39,7 @@
     if (list_value == nullptr)
       continue;
     DCHECK(list_value->is_list());
-    for (const auto& client_hint : list_value->GetList()) {
+    for (const auto& client_hint : list_value->GetListDeprecated()) {
       DCHECK(client_hint.is_int());
       network::mojom::WebClientHintsType client_hint_mojo =
           static_cast<network::mojom::WebClientHintsType>(client_hint.GetInt());
diff --git a/components/cloud_devices/common/description_items_inl.h b/components/cloud_devices/common/description_items_inl.h
index f8d7b6ce..ba0ce56 100644
--- a/components/cloud_devices/common/description_items_inl.h
+++ b/components/cloud_devices/common/description_items_inl.h
@@ -51,7 +51,7 @@
       description.GetItem(Traits::GetCapabilityPath(), base::Value::Type::LIST);
   if (!options_value)
     return false;
-  for (const base::Value& option_value : options_value->GetList()) {
+  for (const base::Value& option_value : options_value->GetListDeprecated()) {
     Option option;
     if (!option_value.is_dict() || !Traits::Load(option_value, &option))
       return false;
@@ -135,7 +135,7 @@
       dict.FindKeyOfType(json::kKeyOption, base::Value::Type::LIST);
   if (!options_value)
     return false;
-  for (const base::Value& option_value : options_value->GetList()) {
+  for (const base::Value& option_value : options_value->GetListDeprecated()) {
     Option option;
     if (!option_value.is_dict() || !Traits::Load(option_value, &option))
       return false;
diff --git a/components/cloud_devices/common/printer_description.cc b/components/cloud_devices/common/printer_description.cc
index 2cd63f1f..9ec1d88ce 100644
--- a/components/cloud_devices/common/printer_description.cc
+++ b/components/cloud_devices/common/printer_description.cc
@@ -1058,7 +1058,8 @@
     if (document_types_supported) {
       if (!document_types_supported->is_list())
         return false;
-      for (const auto& type_value : document_types_supported->GetList()) {
+      for (const auto& type_value :
+           document_types_supported->GetListDeprecated()) {
         if (!type_value.is_string())
           return false;
 
@@ -1333,7 +1334,7 @@
         dict.FindKeyOfType(kPageRangeInterval, base::Value::Type::LIST);
     if (!list_value)
       return false;
-    for (const base::Value& interval : list_value->GetList()) {
+    for (const base::Value& interval : list_value->GetListDeprecated()) {
       int page_range_start = interval.FindIntKey(kPageRangeStart).value_or(1);
       int page_range_end =
           interval.FindIntKey(kPageRangeEnd).value_or(kMaxPageNumber);
diff --git a/components/content_capture/android/test_support/content_capture_test_support_android.cc b/components/content_capture/android/test_support/content_capture_test_support_android.cc
index 3fbd229..ab7601e5 100644
--- a/components/content_capture/android/test_support/content_capture_test_support_android.cc
+++ b/components/content_capture/android/test_support/content_capture_test_support_android.cc
@@ -51,11 +51,11 @@
   CHECK(root);
   CHECK(root->is_list());
   std::vector<blink::mojom::FaviconURLPtr> favicon_urls;
-  for (const base::Value& icon : root->GetList()) {
+  for (const base::Value& icon : root->GetListDeprecated()) {
     std::vector<gfx::Size> sizes;
     // The sizes is optional.
     if (auto* icon_sizes = icon.FindKey("sizes")) {
-      for (const base::Value& size : icon_sizes->GetList()) {
+      for (const base::Value& size : icon_sizes->GetListDeprecated()) {
         CHECK(size.FindKey("width"));
         CHECK(size.FindKey("height"));
         sizes.emplace_back(size.FindKey("width")->GetInt(),
diff --git a/components/content_creation/notes/core/note_prefs.cc b/components/content_creation/notes/core/note_prefs.cc
index a9e851c..bec4138f 100644
--- a/components/content_creation/notes/core/note_prefs.cc
+++ b/components/content_creation/notes/core/note_prefs.cc
@@ -47,7 +47,7 @@
   }
 
   std::vector<NoteTemplateIds> template_ids;
-  for (const base::Value& current_value : stored_value->GetList()) {
+  for (const base::Value& current_value : stored_value->GetListDeprecated()) {
     absl::optional<int> maybe_int = current_value.GetIfInt();
     if (!maybe_int) {
       continue;
diff --git a/components/content_settings/core/browser/content_settings_policy_provider.cc b/components/content_settings/core/browser/content_settings_policy_provider.cc
index 089c33f..74e9506 100644
--- a/components/content_settings/core/browser/content_settings_policy_provider.cc
+++ b/components/content_settings/core/browser/content_settings_policy_provider.cc
@@ -263,7 +263,8 @@
       return;
     }
 
-    base::Value::ConstListView pattern_str_list = pref->GetValue()->GetList();
+    base::Value::ConstListView pattern_str_list =
+        pref->GetValue()->GetListDeprecated();
     for (size_t i = 0; i < pattern_str_list.size(); ++i) {
       if (!pattern_str_list[i].is_string()) {
         NOTREACHED() << "Could not read content settings pattern #" << i
@@ -346,7 +347,7 @@
   //   }
   // }
   std::unordered_map<std::string, base::DictionaryValue> filters_map;
-  for (const auto& pattern_filter_str : pref->GetValue()->GetList()) {
+  for (const auto& pattern_filter_str : pref->GetValue()->GetListDeprecated()) {
     if (!pattern_filter_str.is_string()) {
       NOTREACHED();
       continue;
diff --git a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
index 0b4b743..eab3d578 100644
--- a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
+++ b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
@@ -15,6 +15,7 @@
 import org.chromium.base.PiiElider;
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.annotations.MainDex;
+import org.chromium.components.minidump_uploader.CrashFileManager;
 import org.chromium.components.version_info.VersionInfo;
 
 import java.io.File;
@@ -54,8 +55,6 @@
     public static final String RESOURCES_VERSION = "resources_version";
 
     private static final String DUMP_LOCATION_SWITCH = "breakpad-dump-location";
-    private static final String CRASH_DUMP_DIR = "Crash Reports";
-    private static final String FILE_PREFIX = "chromium-browser-minidump-";
     private static final String FILE_SUFFIX = ".dmp";
     private static final String RN = "\r\n";
     private static final String FORM_DATA_MESSAGE = "Content-Disposition: form-data; name=\"";
@@ -66,6 +65,13 @@
     private final String mLocalId = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
     private final String mBoundary = "------------" + UUID.randomUUID() + RN;
 
+    // The top level directory where all crash related files are stored.
+    protected final File mCrashFilesDirectory;
+
+    public PureJavaExceptionReporter(File crashFilesDirectory) {
+        mCrashFilesDirectory = crashFilesDirectory;
+    }
+
     @Override
     public void createAndUploadReport(Throwable javaException) {
         // It is OK to do IO in main thread when we know there is a crash happens.
@@ -93,9 +99,8 @@
     @SuppressLint("WrongConstant")
     private void createReport(Throwable javaException) {
         try {
-            String minidumpFileName = FILE_PREFIX + mLocalId + FILE_SUFFIX;
-            File minidumpDir =
-                    new File(ContextUtils.getApplicationContext().getCacheDir(), CRASH_DUMP_DIR);
+            String minidumpFileName = getMinidumpPrefix() + mLocalId + FILE_SUFFIX;
+            File minidumpDir = new File(mCrashFilesDirectory, CrashFileManager.CRASH_DUMP_DIR);
             // Tests disable minidump uploading by not creating the minidump directory.
             mUpload = minidumpDir.exists();
             String overrideMinidumpDirPath =
@@ -196,4 +201,9 @@
      * @param minidump the minidump file to be uploaded.
      */
     protected abstract void uploadMinidump(File minidump);
+
+    /**
+     * @return prefix to be added before the minidump file name.
+     */
+    protected abstract String getMinidumpPrefix();
 }
diff --git a/components/crash/android/javatests/src/org/chromium/components/crash/PureJavaExceptionReporterTest.java b/components/crash/android/javatests/src/org/chromium/components/crash/PureJavaExceptionReporterTest.java
index 6e0cfbf..5bff277 100644
--- a/components/crash/android/javatests/src/org/chromium/components/crash/PureJavaExceptionReporterTest.java
+++ b/components/crash/android/javatests/src/org/chromium/components/crash/PureJavaExceptionReporterTest.java
@@ -28,10 +28,14 @@
     @Rule
     public CrashTestRule mTestRule = new CrashTestRule();
 
-    private static class TestPureJavaExceptionReporter extends PureJavaExceptionReporter {
+    private class TestPureJavaExceptionReporter extends PureJavaExceptionReporter {
         private boolean mReportUploaded;
         private File mMinidump;
 
+        public TestPureJavaExceptionReporter() {
+            super(mTestRule.getCacheDir());
+        }
+
         @Override
         protected String getProductName() {
             return "Test";
@@ -43,6 +47,11 @@
             mReportUploaded = (minidump != null);
         }
 
+        @Override
+        protected String getMinidumpPrefix() {
+            return "test-minidump-";
+        }
+
         public boolean reportUploaded() {
             return mReportUploaded;
         }
diff --git a/components/cronet/host_cache_persistence_manager_unittest.cc b/components/cronet/host_cache_persistence_manager_unittest.cc
index 4d1f2f6..ad929ffa 100644
--- a/components/cronet/host_cache_persistence_manager_unittest.cc
+++ b/components/cronet/host_cache_persistence_manager_unittest.cc
@@ -53,7 +53,7 @@
     const base::Value* value = pref_service_->GetUserPref(kPrefName);
     base::Value list(base::Value::Type::LIST);
     if (value)
-      list = base::Value(value->GetList());
+      list = base::Value(value->GetListDeprecated());
     net::HostCache temp_cache(10);
     temp_cache.RestoreFromListValue(base::Value::AsListValue(list));
     ASSERT_EQ(expected_size, temp_cache.size());
diff --git a/components/cronet/url_request_context_config.cc b/components/cronet/url_request_context_config.cc
index 8e5bb2f9..bdfc6da 100644
--- a/components/cronet/url_request_context_config.cc
+++ b/components/cronet/url_request_context_config.cc
@@ -684,14 +684,14 @@
           nel_args.FindListKey(kNetworkErrorLoggingPreloadedReportToHeaders);
       if (preloaded_report_to_headers_config) {
         preloaded_report_to_headers = ParseNetworkErrorLoggingHeaders(
-            preloaded_report_to_headers_config->GetList());
+            preloaded_report_to_headers_config->GetListDeprecated());
       }
 
       const auto* preloaded_nel_headers_config =
           nel_args.FindListKey(kNetworkErrorLoggingPreloadedNELHeaders);
       if (preloaded_nel_headers_config) {
         preloaded_nel_headers = ParseNetworkErrorLoggingHeaders(
-            preloaded_nel_headers_config->GetList());
+            preloaded_nel_headers_config->GetListDeprecated());
       }
     } else if (iter.first == kDisableIPv6OnWifi) {
       if (!iter.second.is_bool()) {
diff --git a/components/custom_handlers/protocol_handler_registry.cc b/components/custom_handlers/protocol_handler_registry.cc
index bdd5ea97..ba5b97bb 100644
--- a/components/custom_handlers/protocol_handler_registry.cc
+++ b/components/custom_handlers/protocol_handler_registry.cc
@@ -623,7 +623,7 @@
 
   const base::Value* handlers = prefs->GetList(pref_name);
   if (handlers) {
-    for (const auto& dict : handlers->GetList()) {
+    for (const auto& dict : handlers->GetListDeprecated()) {
       if (!dict.is_dict())
         continue;
       const base::DictionaryValue* dict_value =
diff --git a/components/custom_handlers/protocol_handler_registry_unittest.cc b/components/custom_handlers/protocol_handler_registry_unittest.cc
index 26688ce..dc49e12 100644
--- a/components/custom_handlers/protocol_handler_registry_unittest.cc
+++ b/components/custom_handlers/protocol_handler_registry_unittest.cc
@@ -164,7 +164,7 @@
   int InPrefHandlerCount() {
     const base::Value* in_pref_handlers = GetPrefs()->GetList(
         custom_handlers::prefs::kRegisteredProtocolHandlers);
-    return static_cast<int>(in_pref_handlers->GetList().size());
+    return static_cast<int>(in_pref_handlers->GetListDeprecated().size());
   }
 
   int InMemoryHandlerCount() {
@@ -178,7 +178,8 @@
   int InPrefIgnoredHandlerCount() {
     const base::Value* in_pref_ignored_handlers =
         GetPrefs()->GetList(custom_handlers::prefs::kIgnoredProtocolHandlers);
-    return static_cast<int>(in_pref_ignored_handlers->GetList().size());
+    return static_cast<int>(
+        in_pref_ignored_handlers->GetListDeprecated().size());
   }
 
   int InMemoryIgnoredHandlerCount() {
diff --git a/components/desks_storage/BUILD.gn b/components/desks_storage/BUILD.gn
index 27c9a7d..136892f9 100644
--- a/components/desks_storage/BUILD.gn
+++ b/components/desks_storage/BUILD.gn
@@ -23,12 +23,12 @@
   deps = [
     "//ash/public/cpp",
     "//base",
+    "//components/app_constants",
     "//components/app_restore",
     "//components/sync",
     "//components/sync/model",
     "//components/sync/protocol",
     "//components/version_info:channel",
-    "//extensions/common:common_constants",
     "//third_party/re2",
     "//ui/gfx/geometry",
   ]
@@ -51,8 +51,8 @@
     "//ash/public/cpp",
     "//base",
     "//base/test:test_support",
+    "//components/app_constants",
     "//components/sync:test_support",
-    "//extensions/common:common_constants",
     "//testing/gtest",
   ]
 }
diff --git a/components/desks_storage/DEPS b/components/desks_storage/DEPS
index a35abc3..c8045957 100644
--- a/components/desks_storage/DEPS
+++ b/components/desks_storage/DEPS
@@ -2,12 +2,12 @@
   "+ash/public",
   "+chromeos/ui/base/window_state_type.h",
   "+components/account_id/account_id.h",
+  "+components/app_constants/constants.h",
   "+components/app_restore",
   "+components/keyed_service/core",
   "+components/services/app_service/public/cpp",
   "+components/sync",
   "+components/version_info",
-  "+extensions/common/constants.h",
   "+third_party/re2",
   "+ui/base/ui_base_types.h",
   "+ui/gfx/geometry"
diff --git a/components/desks_storage/core/desk_model.cc b/components/desks_storage/core/desk_model.cc
index d9a457e5..3855c99 100644
--- a/components/desks_storage/core/desk_model.cc
+++ b/components/desks_storage/core/desk_model.cc
@@ -71,7 +71,7 @@
     return;
   }
 
-  for (auto& desk_template : parsed_list.value->GetList()) {
+  for (auto& desk_template : parsed_list.value->GetListDeprecated()) {
     std::unique_ptr<ash::DeskTemplate> dt =
         desk_template_conversion::ParseDeskTemplateFromPolicy(desk_template);
     if (dt) {
diff --git a/components/desks_storage/core/desk_sync_bridge.cc b/components/desks_storage/core/desk_sync_bridge.cc
index 1379e23..6bd0ef3c 100644
--- a/components/desks_storage/core/desk_sync_bridge.cc
+++ b/components/desks_storage/core/desk_sync_bridge.cc
@@ -19,6 +19,7 @@
 #include "base/time/time.h"
 #include "chromeos/ui/base/window_state_type.h"
 #include "components/account_id/account_id.h"
+#include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
 #include "components/app_restore/window_info.h"
 #include "components/desks_storage/core/desk_model_observer.h"
@@ -33,7 +34,6 @@
 #include "components/sync/model/mutable_data_batch.h"
 #include "components/sync/protocol/model_type_state.pb.h"
 #include "components/sync/protocol/workspace_desk_specifics.pb.h"
-#include "extensions/common/constants.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/base/ui_base_types.h"
 
@@ -128,7 +128,7 @@
       return std::string();
     case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::kBrowserAppWindow:
       // Browser app has a known app ID.
-      return std::string(extension_misc::kChromeAppId);
+      return std::string(app_constants::kChromeAppId);
     case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::kChromeApp:
       return app.app().chrome_app().app_id();
     case sync_pb::WorkspaceDeskSpecifics_AppOneOf::AppCase::kProgressWebApp:
@@ -355,7 +355,7 @@
   // See definition components/services/app_service/public/mojom/types.mojom
   switch (app_type) {
     case apps::mojom::AppType::kWeb: {
-      if (extension_misc::kChromeAppId == app_id) {
+      if (app_constants::kChromeAppId == app_id) {
         // Chrome Browser Window.
         BrowserAppWindow* browser_app_window =
             out_app->mutable_app()->mutable_browser_app_window();
@@ -470,7 +470,7 @@
       // The apps cache returns kChromeApp for browser windows, therefore we
       // short circuit the cache retrieval if we get the browser ID.
       const apps::mojom::AppType app_type =
-          app_id == extension_misc::kChromeAppId
+          app_id == app_constants::kChromeAppId
               ? apps::mojom::AppType::kWeb
               : apps_cache->GetAppType(app_id);
 
diff --git a/components/desks_storage/core/desk_sync_bridge_unittest.cc b/components/desks_storage/core/desk_sync_bridge_unittest.cc
index 567aa73f..43749f2 100644
--- a/components/desks_storage/core/desk_sync_bridge_unittest.cc
+++ b/components/desks_storage/core/desk_sync_bridge_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/test/simple_test_clock.h"
 #include "base/test/task_environment.h"
 #include "components/account_id/account_id.h"
+#include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
 #include "components/desks_storage/core/desk_model_observer.h"
 #include "components/desks_storage/core/desk_template_conversion.h"
@@ -32,7 +33,6 @@
 #include "components/sync/test/model/mock_model_type_change_processor.h"
 #include "components/sync/test/model/model_type_store_test_util.h"
 #include "components/sync/test/model/test_matchers.h"
-#include "extensions/common/constants.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -215,7 +215,7 @@
 
   auto restore_data = std::make_unique<app_restore::RestoreData>();
   auto browser_info = std::make_unique<app_restore::AppLaunchInfo>(
-      extension_misc::kChromeAppId, kBrowserWindowId);
+      app_constants::kChromeAppId, kBrowserWindowId);
   browser_info->urls = {GURL(base::StringPrintf(kTestUrlFormat, 1)),
                         GURL(base::StringPrintf(kTestUrlFormat, 2))};
 
@@ -338,7 +338,7 @@
     deltas.push_back(
         MakeApp(kTestPwaAppId, "Test PWA App", apps::mojom::AppType::kWeb));
     // chromeAppId returns kExtension in the real Apps cache.
-    deltas.push_back(MakeApp(extension_misc::kChromeAppId, "Chrome Browser",
+    deltas.push_back(MakeApp(app_constants::kChromeAppId, "Chrome Browser",
                              apps::mojom::AppType::kChromeApp));
     deltas.push_back(MakeApp(kTestChromeAppId, "Test Chrome App",
                              apps::mojom::AppType::kChromeApp));
diff --git a/components/desks_storage/core/desk_template_conversion.cc b/components/desks_storage/core/desk_template_conversion.cc
index 8ee7bc3..d308c6f6 100644
--- a/components/desks_storage/core/desk_template_conversion.cc
+++ b/components/desks_storage/core/desk_template_conversion.cc
@@ -10,11 +10,11 @@
 #include "base/json/values_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
+#include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
 #include "components/app_restore/restore_data.h"
 #include "components/app_restore/window_info.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
-#include "extensions/common/constants.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -95,7 +95,7 @@
 
   if (app_type == kAppTypeBrowser) {
     // Browser app has a known app ID.
-    return std::string(extension_misc::kChromeAppId);
+    return std::string(app_constants::kChromeAppId);
   } else if (app_type == kAppTypeChrome || app_type == kAppTypeProgressiveWeb) {
     // Read the provided app ID
     std::string app_id;
@@ -151,7 +151,7 @@
     app_launch_info->urls.emplace();
     const base::Value* tabs = app.FindKeyOfType(kTabs, base::Value::Type::LIST);
     if (tabs) {
-      for (auto& tab : tabs->GetList()) {
+      for (auto& tab : tabs->GetListDeprecated()) {
         std::string url;
         if (GetString(tab, kTabUrl, &url)) {
           app_launch_info->urls.value().emplace_back(url);
@@ -266,7 +266,7 @@
 
   const base::Value* apps = desk->FindListKey(kApps);
   if (apps) {
-    for (const auto& app : apps->GetList()) {
+    for (const auto& app : apps->GetListDeprecated()) {
       std::unique_ptr<app_restore::AppLaunchInfo> app_launch_info =
           ConvertJsonToAppLaunchInfo(app);
       if (!app_launch_info)
@@ -361,14 +361,14 @@
 
 std::string GetAppTypeForJson(apps::AppRegistryCache* apps_cache,
                               const std::string& app_id) {
-  const apps::mojom::AppType app_type = app_id == extension_misc::kChromeAppId
+  const apps::mojom::AppType app_type = app_id == app_constants::kChromeAppId
                                             ? apps::mojom::AppType::kWeb
                                             : apps_cache->GetAppType(app_id);
 
   switch (app_type) {
     case apps::mojom::AppType::kWeb:
-      return app_id == extension_misc::kChromeAppId ? kAppTypeBrowser
-                                                    : kAppTypeProgressiveWeb;
+      return app_id == app_constants::kChromeAppId ? kAppTypeBrowser
+                                                   : kAppTypeProgressiveWeb;
     case apps::mojom::AppType::kChromeApp:
       return kAppTypeChrome;
     default:
@@ -521,4 +521,4 @@
 
 }  // namespace desk_template_conversion
 
-}  // namespace desks_storage
\ No newline at end of file
+}  // namespace desks_storage
diff --git a/components/desks_storage/core/desk_template_conversion_unittests.cc b/components/desks_storage/core/desk_template_conversion_unittests.cc
index 1495424..f9acd8e 100644
--- a/components/desks_storage/core/desk_template_conversion_unittests.cc
+++ b/components/desks_storage/core/desk_template_conversion_unittests.cc
@@ -14,12 +14,12 @@
 #include "base/test/task_environment.h"
 #include "build/build_config.h"
 #include "components/account_id/account_id.h"
+#include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
 #include "components/app_restore/app_restore_data.h"
 #include "components/app_restore/window_info.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/app_registry_cache_wrapper.h"
-#include "extensions/common/constants.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace desks_storage {
@@ -92,7 +92,7 @@
     deltas.push_back(MakeApp(kProgressiveAppid.c_str(), "Test PWA App",
                              apps::mojom::AppType::kWeb));
     // chromeAppId returns kExtension in the real Apps cache.
-    deltas.push_back(MakeApp(extension_misc::kChromeAppId, "Chrome Browser",
+    deltas.push_back(MakeApp(app_constants::kChromeAppId, "Chrome Browser",
                              apps::mojom::AppType::kChromeApp));
     deltas.push_back(MakeApp(kChromeAppId.c_str(), "Test Chrome App",
                              apps::mojom::AppType::kChromeApp));
@@ -136,16 +136,16 @@
 
   EXPECT_TRUE(rd != nullptr);
   EXPECT_EQ(rd->app_id_to_launch_list().size(), 1UL);
-  EXPECT_NE(rd->app_id_to_launch_list().find(extension_misc::kChromeAppId),
+  EXPECT_NE(rd->app_id_to_launch_list().find(app_constants::kChromeAppId),
             rd->app_id_to_launch_list().end());
 
   const app_restore::AppRestoreData* ard =
-      rd->GetAppRestoreData(extension_misc::kChromeAppId, 0);
+      rd->GetAppRestoreData(app_constants::kChromeAppId, 0);
   EXPECT_TRUE(ard != nullptr);
   EXPECT_TRUE(ard->display_id.has_value());
   EXPECT_EQ(ard->display_id.value(), 100L);
   std::unique_ptr<app_restore::AppLaunchInfo> ali =
-      ard->GetAppLaunchInfo(extension_misc::kChromeAppId, 0);
+      ard->GetAppLaunchInfo(app_constants::kChromeAppId, 0);
   std::unique_ptr<app_restore::WindowInfo> wi = ard->GetWindowInfo();
   EXPECT_TRUE(ali != nullptr);
   EXPECT_TRUE(wi != nullptr);
@@ -318,4 +318,4 @@
   EXPECT_EQ(parsed_json.value, desk_template_value);
 }
 
-}  // namespace desks_storage
\ No newline at end of file
+}  // namespace desks_storage
diff --git a/components/digital_asset_links/digital_asset_links_handler.cc b/components/digital_asset_links/digital_asset_links_handler.cc
index c15f4c9e..458f1c1 100644
--- a/components/digital_asset_links/digital_asset_links_handler.cc
+++ b/components/digital_asset_links/digital_asset_links_handler.cc
@@ -66,7 +66,7 @@
   if (!relations)
     return false;
 
-  for (const auto& relation : relations->GetList()) {
+  for (const auto& relation : relations->GetListDeprecated()) {
     if (relation.is_string() && relation.GetString() == target_relation)
       return true;
   }
@@ -93,7 +93,7 @@
   if (!fingerprints)
     return false;
 
-  for (const auto& fingerprint : fingerprints->GetList()) {
+  for (const auto& fingerprint : fingerprints->GetListDeprecated()) {
     if (fingerprint.is_string() &&
         fingerprint.GetString() == target_fingerprint) {
       return true;
diff --git a/components/dom_distiller/core/page_features_unittest.cc b/components/dom_distiller/core/page_features_unittest.cc
index 4b88b04..a4378fe7 100644
--- a/components/dom_distiller/core/page_features_unittest.cc
+++ b/components/dom_distiller/core/page_features_unittest.cc
@@ -42,13 +42,14 @@
 
   // For every feature name at index 2*N, their value is at 2*N+1. In particular
   // the size must be an even number.
-  size_t size = derived_features_json->GetList().size();
+  size_t size = derived_features_json->GetListDeprecated().size();
   if (size % 2 != 0)
     return absl::nullopt;
 
   std::vector<double> derived_features;
   for (size_t i = 1; i < size; i += 2) {
-    const base::Value& feature_value = derived_features_json->GetList()[i];
+    const base::Value& feature_value =
+        derived_features_json->GetListDeprecated()[i];
     // If the value is a bool, convert it to 1.0 or 0.0.
     double numerical_feature_value;
     if (feature_value.is_double() || feature_value.is_int())
diff --git a/components/dom_distiller/ios/distiller_page_ios.mm b/components/dom_distiller/ios/distiller_page_ios.mm
index e2ecf270b..cb6701b9 100644
--- a/components/dom_distiller/ios/distiller_page_ios.mm
+++ b/components/dom_distiller/ios/distiller_page_ios.mm
@@ -86,7 +86,7 @@
 
   } else if (value->is_list()) {
     std::vector<base::Value> list;
-    for (const base::Value& list_item : value->GetList()) {
+    for (const base::Value& list_item : value->GetListDeprecated()) {
       base::Value converted_item =
           ConvertedResultFromScriptResult(&list_item, max_depth - 1);
       if (converted_item.type() == base::Value::Type::NONE) {
diff --git a/components/domain_reliability/context_unittest.cc b/components/domain_reliability/context_unittest.cc
index b63597c..49f4028 100644
--- a/components/domain_reliability/context_unittest.cc
+++ b/components/domain_reliability/context_unittest.cc
@@ -109,9 +109,9 @@
   if (!report || !report->is_dict())
     return false;
   const Value* entries = report->FindListKey("entries");
-  if (!entries || index >= entries->GetList().size())
+  if (!entries || index >= entries->GetListDeprecated().size())
     return false;
-  const Value& entry = entries->GetList()[index];
+  const Value& entry = entries->GetListDeprecated()[index];
   if (!entry.is_dict())
     return false;
   *entry_out = &entry;
diff --git a/components/embedder_support/origin_trials/component_updater_utils.cc b/components/embedder_support/origin_trials/component_updater_utils.cc
index 8fd2c98..954b733 100644
--- a/components/embedder_support/origin_trials/component_updater_utils.cc
+++ b/components/embedder_support/origin_trials/component_updater_utils.cc
@@ -39,7 +39,7 @@
   base::Value* override_disabled_feature_list =
       manifest.FindListPath(kManifestDisabledFeaturesPath);
   if (override_disabled_feature_list &&
-      !override_disabled_feature_list->GetList().empty()) {
+      !override_disabled_feature_list->GetListDeprecated().empty()) {
     ListPrefUpdate update(local_state, prefs::kOriginTrialDisabledFeatures);
     *update = std::move(*override_disabled_feature_list);
   } else {
@@ -48,7 +48,8 @@
 
   base::Value* disabled_tokens_list =
       manifest.FindListPath(kManifestDisabledTokenSignaturesPath);
-  if (disabled_tokens_list && !disabled_tokens_list->GetList().empty()) {
+  if (disabled_tokens_list &&
+      !disabled_tokens_list->GetListDeprecated().empty()) {
     ListPrefUpdate update(local_state, prefs::kOriginTrialDisabledTokens);
     *update = std::move(*disabled_tokens_list);
   } else {
diff --git a/components/embedder_support/origin_trials/component_updater_utils_unittest.cc b/components/embedder_support/origin_trials/component_updater_utils_unittest.cc
index f4ff0057..34b14c3 100644
--- a/components/embedder_support/origin_trials/component_updater_utils_unittest.cc
+++ b/components/embedder_support/origin_trials/component_updater_utils_unittest.cc
@@ -100,11 +100,12 @@
         embedder_support::prefs::kOriginTrialDisabledFeatures);
     ASSERT_TRUE(disabled_feature_list);
 
-    ASSERT_EQ(features.size(), disabled_feature_list->GetList().size());
+    ASSERT_EQ(features.size(),
+              disabled_feature_list->GetListDeprecated().size());
 
     for (size_t i = 0; i < features.size(); ++i) {
       const std::string* disabled_feature =
-          disabled_feature_list->GetList()[i].GetIfString();
+          disabled_feature_list->GetListDeprecated()[i].GetIfString();
       if (!disabled_feature) {
         ADD_FAILURE() << "Entry not found or not a string at index " << i;
         continue;
@@ -134,11 +135,11 @@
         embedder_support::prefs::kOriginTrialDisabledTokens);
     ASSERT_TRUE(disabled_token_list);
 
-    ASSERT_EQ(tokens.size(), disabled_token_list->GetList().size());
+    ASSERT_EQ(tokens.size(), disabled_token_list->GetListDeprecated().size());
 
     for (size_t i = 0; i < tokens.size(); ++i) {
       const std::string* disabled_token =
-          disabled_token_list->GetList()[i].GetIfString();
+          disabled_token_list->GetListDeprecated()[i].GetIfString();
 
       if (!disabled_token) {
         ADD_FAILURE() << "Entry not found or not a string at index " << i;
diff --git a/components/embedder_support/pref_names.cc b/components/embedder_support/pref_names.cc
index 133f1a8..e0b70f2e 100644
--- a/components/embedder_support/pref_names.cc
+++ b/components/embedder_support/pref_names.cc
@@ -9,4 +9,10 @@
 // A boolean pref set to true if we're using Link Doctor error pages.
 const char kAlternateErrorPagesEnabled[] = "alternate_error_pages.enabled";
 
+// Enum indicating if the user agent string should freeze the major version
+// at 99 and report the browser's major version in the minor position.
+// TODO(crbug.com/1290820): Remove this policy.
+const char kForceMajorVersionToMinorPosition[] =
+    "force_major_version_to_minor_position_in_user_agent";
+
 }  // namespace embedder_support
diff --git a/components/embedder_support/pref_names.h b/components/embedder_support/pref_names.h
index c7c24464..1cfd57dc 100644
--- a/components/embedder_support/pref_names.h
+++ b/components/embedder_support/pref_names.h
@@ -11,6 +11,7 @@
 namespace embedder_support {
 
 extern const char kAlternateErrorPagesEnabled[];
+extern const char kForceMajorVersionToMinorPosition[];
 
 }  // namespace embedder_support
 
diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc
index 545e690..c4adefec 100644
--- a/components/embedder_support/user_agent_utils.cc
+++ b/components/embedder_support/user_agent_utils.cc
@@ -15,6 +15,7 @@
 #include "base/version.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
+#include "components/embedder_support/pref_names.h"
 #include "components/embedder_support/switches.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/prefs/pref_service.h"
@@ -124,6 +125,18 @@
 
 #endif  // BUILDFLAG(IS_WIN)
 
+// Returns true if the user agent string should force the major version into
+// the minor position.
+// TODO(crbug.com/1290820): Remove this method along with policy.
+bool ShouldForceMajorVersionToMinorPosition(
+    ForceMajorVersionToMinorPosition force_major_to_minor = kDefault) {
+  return (
+      (force_major_to_minor != kForceDisabled &&
+       base::FeatureList::IsEnabled(
+           blink::features::kForceMajorVersionInMinorPositionInUserAgent)) ||
+      force_major_to_minor == kForceEnabled);
+}
+
 const std::string& GetM100VersionNumber() {
   static const base::NoDestructor<std::string> m100_version_number([] {
     base::Version version(version_info::GetVersionNumber());
@@ -164,6 +177,19 @@
   return *version_number;
 }
 
+std::string GetVersionNumber(const UserAgentOptions& options) {
+  // Priority 1: Force major version to 99.
+  if (ShouldForceMajorVersionToMinorPosition(options.force_major_to_minor))
+    return GetMajorInMinorVersionNumber();
+
+  // Priority 2: Force major version to 100.
+  if (options.force_major_version_100)
+    return GetM100VersionNumber();
+
+  const std::string& version_str = version_info::GetVersionNumber();
+  return version_str;
+}
+
 const std::string& GetM100InMinorVersionNumber() {
   static const base::NoDestructor<std::string> m100_version_number([] {
     base::Version version(version_info::GetVersionNumber());
@@ -221,7 +247,6 @@
 
 const blink::UserAgentBrandList GetUserAgentBrandMajorVersionList(
     bool enable_updated_grease_by_policy) {
-  // TODO(crbug.com/1290902): Respect #force-major-version-to-minor here.
   return GetUserAgentBrandList(version_info::GetMajorVersionNumber(),
                                enable_updated_grease_by_policy,
                                version_info::GetVersionNumber(),
@@ -235,9 +260,18 @@
                                blink::UserAgentBrandVersionType::kMajorVersion);
 }
 
+// TODO(crbug.com/1290820): Remove this method along with policy.
+blink::UserAgentBrandList GetMajorInMinorUserAgentBrandMajorVersionList(
+    bool enable_updated_grease_by_policy) {
+  return GetUserAgentBrandList(kVersion99, enable_updated_grease_by_policy,
+                               GetMajorInMinorVersionNumber(),
+                               blink::UserAgentBrandVersionType::kMajorVersion);
+}
+
+// TODO(crbug.com/1291612): Consolidate *FullVersionList() methods by using
+// GetVersionNumber()
 blink::UserAgentBrandList GetUserAgentBrandFullVersionList(
     bool enable_updated_grease_by_policy) {
-  // TODO(crbug.com/1290902): Respect #force-major-version-to-minor here.
   return GetUserAgentBrandList(version_info::GetMajorVersionNumber(),
                                enable_updated_grease_by_policy,
                                version_info::GetVersionNumber(),
@@ -251,10 +285,27 @@
                                blink::UserAgentBrandVersionType::kFullVersion);
 }
 
+// TODO(crbug.com/1290820): Remove this method along with policy.
+blink::UserAgentBrandList GetMajorInMinorUserAgentBrandFullVersionList(
+    bool enable_updated_grease_by_policy) {
+  return GetUserAgentBrandList(kVersion99, enable_updated_grease_by_policy,
+                               GetMajorInMinorVersionNumber(),
+                               blink::UserAgentBrandVersionType::kFullVersion);
+}
+
 // Return UserAgentBrandList with the major version populated in the brand
 // `version` value.
+// TODO(crbug.com/1291612): Consolidate *MajorVersionList() methods by using
+// GetVersionNumber()
 blink::UserAgentBrandList GetBrandMajorVersionList(
-    bool enable_updated_grease_by_policy) {
+    bool enable_updated_grease_by_policy,
+    ForceMajorVersionToMinorPosition force_major_to_minor) {
+  // Priority 1: Force major version to 99.
+  if (ShouldForceMajorVersionToMinorPosition(force_major_to_minor))
+    return GetMajorInMinorUserAgentBrandMajorVersionList(
+        enable_updated_grease_by_policy);
+
+  // Priority 2: Force major version to 100.
   if (base::FeatureList::IsEnabled(
           blink::features::kForceMajorVersion100InUserAgent))
     return GetForcedM100UserAgentBrandMajorVersionList(
@@ -266,7 +317,14 @@
 // Return UserAgentBrandList with the full version populated in the brand
 // `version` value.
 blink::UserAgentBrandList GetBrandFullVersionList(
-    bool enable_updated_grease_by_policy) {
+    bool enable_updated_grease_by_policy,
+    ForceMajorVersionToMinorPosition force_major_to_minor) {
+  // Priority 1: Force major version to 99.
+  if (ShouldForceMajorVersionToMinorPosition(force_major_to_minor))
+    return GetMajorInMinorUserAgentBrandFullVersionList(
+        enable_updated_grease_by_policy);
+
+  // Priority 2: Force major version to 100.
   if (base::FeatureList::IsEnabled(
           blink::features::kForceMajorVersion100InUserAgent))
     return GetForcedM100UserAgentBrandFullVersionList(
@@ -275,18 +333,6 @@
   return GetUserAgentBrandFullVersionList(enable_updated_grease_by_policy);
 }
 
-// Returns true if the user agent string should force the major version into
-// the minor position.
-// TODO(crbug.com/1290820): Remove this method along with policy.
-bool ShouldForceMajorVersionToMinorPosition(
-    ForceMajorVersionToMinorPosition force_major_to_minor = kDefault) {
-  return (
-      (force_major_to_minor != kForceDisabled &&
-       base::FeatureList::IsEnabled(
-           blink::features::kForceMajorVersionInMinorPositionInUserAgent)) ||
-      force_major_to_minor == kForceEnabled);
-}
-
 // Returns a string representing the major version number of the user agent
 // string for Chrome, potentially overridden by policy.
 std::string GetMajorVersionForUserAgentString(
@@ -504,20 +550,19 @@
 blink::UserAgentMetadata GetUserAgentMetadata(PrefService* pref_service) {
   blink::UserAgentMetadata metadata;
   bool enable_updated_grease_by_policy = true;
-  if (pref_service &&
-      pref_service->HasPrefPath(
-          policy::policy_prefs::kUserAgentClientHintsGREASEUpdateEnabled)) {
-    enable_updated_grease_by_policy = pref_service->GetBoolean(
-        policy::policy_prefs::kUserAgentClientHintsGREASEUpdateEnabled);
+  UserAgentOptions ua_options;
+  if (pref_service) {
+    if (pref_service->HasPrefPath(
+            policy::policy_prefs::kUserAgentClientHintsGREASEUpdateEnabled))
+      enable_updated_grease_by_policy = pref_service->GetBoolean(
+          policy::policy_prefs::kUserAgentClientHintsGREASEUpdateEnabled);
+    ua_options.force_major_to_minor = GetMajorToMinorFromPrefs(pref_service);
   }
-  metadata.brand_version_list =
-      GetBrandMajorVersionList(enable_updated_grease_by_policy);
-  metadata.brand_full_version_list =
-      GetBrandFullVersionList(enable_updated_grease_by_policy);
-  metadata.full_version = base::FeatureList::IsEnabled(
-                              blink::features::kForceMajorVersion100InUserAgent)
-                              ? GetM100VersionNumber()
-                              : version_info::GetVersionNumber();
+  metadata.brand_version_list = GetBrandMajorVersionList(
+      enable_updated_grease_by_policy, ua_options.force_major_to_minor);
+  metadata.brand_full_version_list = GetBrandFullVersionList(
+      enable_updated_grease_by_policy, ua_options.force_major_to_minor);
+  metadata.full_version = GetVersionNumber(ua_options);
   metadata.platform = GetPlatformForUAMetadata();
   metadata.architecture = content::GetLowEntropyCpuArchitecture();
   metadata.model = content::BuildModelInfo();
@@ -544,7 +589,7 @@
   metadata.wow64 = content::IsWoW64();
 
   return metadata;
-}  // namespace embedder_support
+}
 
 #if BUILDFLAG(IS_ANDROID)
 void SetDesktopUserAgentOverride(content::WebContents* web_contents,
@@ -577,4 +622,20 @@
 }
 #endif  // BUILDFLAG(IS_WIN)
 
+// TODO(crbug.com/1290820): Remove this function with policy.
+embedder_support::ForceMajorVersionToMinorPosition GetMajorToMinorFromPrefs(
+    PrefService* pref_service) {
+  if (!pref_service->HasPrefPath(kForceMajorVersionToMinorPosition))
+    return kDefault;
+  switch (pref_service->GetInteger(kForceMajorVersionToMinorPosition)) {
+    case 1:
+      return kForceDisabled;
+    case 2:
+      return kForceEnabled;
+    case 0:
+    default:
+      return kDefault;
+  }
+}
+
 }  // namespace embedder_support
diff --git a/components/embedder_support/user_agent_utils.h b/components/embedder_support/user_agent_utils.h
index e9bfa23..a3d756c 100644
--- a/components/embedder_support/user_agent_utils.h
+++ b/components/embedder_support/user_agent_utils.h
@@ -31,30 +31,33 @@
   kForceEnabled = 2,
 };
 
-// TODO(crbug.com/1291612): Define UserAgentOptions struct here.
+struct UserAgentOptions {
+  bool force_major_version_100 = false;
+  ForceMajorVersionToMinorPosition force_major_to_minor = kDefault;
+};
 
 // Returns the product string, e.g. "Chrome/98.0.4521.0".  If `allow_override`
 // is set to true, it's possible to have a mismatch between the product's
 // version number and the version number in the User-Agent string if there are
 // flag-enabled overrides.
-// TODO(crbug.com/1291612): modify to accept UserAgentOptions instance.
+// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
 std::string GetProduct(
     bool allow_override = false,
     ForceMajorVersionToMinorPosition force_major_to_minor = kDefault);
 
 // Returns the user agent string for Chrome.
-// TODO(crbug.com/1291612): modify to accept UserAgentOptions instance.
+// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
 std::string GetFullUserAgent(
     ForceMajorVersionToMinorPosition force_major_to_minor = kDefault);
 
 // Returns the reduced user agent string for Chrome.
-// TODO(crbug.com/1291612): modify to accept UserAgentOptions instance.
+// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
 std::string GetReducedUserAgent(
     ForceMajorVersionToMinorPosition force_major_to_minor = kDefault);
 
 // Returns the full or "reduced" user agent string, depending on the
 // UserAgentReduction enterprise policy and blink::features::kReduceUserAgent
-// TODO(crbug.com/1291612): modify to accept UserAgentOptions instance.
+// TODO(crbug.com/1291612): modify to accept an optional PrefService*.
 std::string GetUserAgent(
     ForceMajorVersionToMinorPosition force_major_to_minor = kDefault);
 
@@ -103,6 +106,12 @@
 int GetHighestKnownUniversalApiContractVersionForTesting();
 #endif  // BUILDFLAG(IS_WIN)
 
+// Returns the ForcemajorVersionToMinorPosition enum value corresponding to
+// the provided integer policy value for ForceMajorVersionToMinorPosition.
+// TODO(crbug.com/1290820): Remove this function with policy.
+embedder_support::ForceMajorVersionToMinorPosition GetMajorToMinorFromPrefs(
+    PrefService* pref_service);
+
 }  // namespace embedder_support
 
 #endif  // COMPONENTS_EMBEDDER_SUPPORT_USER_AGENT_UTILS_H_
diff --git a/components/embedder_support/user_agent_utils_unittest.cc b/components/embedder_support/user_agent_utils_unittest.cc
index 5fc51db..7aa666d 100644
--- a/components/embedder_support/user_agent_utils_unittest.cc
+++ b/components/embedder_support/user_agent_utils_unittest.cc
@@ -16,6 +16,9 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/version.h"
 #include "build/build_config.h"
+#include "components/embedder_support/pref_names.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
 #include "components/version_info/version_info.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
@@ -291,6 +294,15 @@
 }
 #endif  // BUILDFLAG(IS_WIN)
 
+bool ContainsBrandVersion(const blink::UserAgentBrandList& brand_list,
+                          const blink::UserAgentBrandVersion brand_version) {
+  for (const auto& brand_list_entry : brand_list) {
+    if (brand_list_entry == brand_version)
+      return true;
+  }
+  return false;
+}
+
 }  // namespace
 
 class UserAgentUtilsTest : public testing::Test,
@@ -315,6 +327,23 @@
     return m100_version;
   }
 
+  std::string MajorToMinorVersionNumber() {
+    const base::Version version = version_info::GetVersion();
+    std::string version_str;
+    const auto& components = version.components();
+    for (size_t i = 0; i < version.components().size(); ++i) {
+      if (i > 0)
+        version_str.append(".");
+      if (i == 0)
+        version_str.append("99");
+      else if (i == 1)
+        version_str.append(base::NumberToString(components[0]));
+      else
+        version_str.append(base::NumberToString(components[i]));
+    }
+    return version_str;
+  }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
@@ -485,10 +514,10 @@
 
   const std::string major_version =
       ForceMajorVersionTo100() ? "100" : version_info::GetMajorVersionNumber();
-
   const std::string full_version = ForceMajorVersionTo100()
                                        ? M100VersionNumber()
                                        : version_info::GetVersionNumber();
+  const std::string major_to_minor_full_version = MajorToMinorVersionNumber();
 
   // According to spec, Sec-CH-UA should contain what project the browser is
   // based on (i.e. Chromium in this case) as well as the actual product.
@@ -497,45 +526,82 @@
 
   const blink::UserAgentBrandVersion chromium_brand_version = {"Chromium",
                                                                major_version};
+  const blink::UserAgentBrandVersion major_to_minor_chromium_brand_version = {
+      "Chromium", "99"};
   const blink::UserAgentBrandVersion product_brand_version = {
       version_info::GetProductName(), major_version};
-  bool contains_chromium_brand_version = false;
-  bool contains_product_brand_version = false;
+  const blink::UserAgentBrandVersion major_to_minor_product_brand_version = {
+      version_info::GetProductName(), "99"};
 
-  for (const auto& brand_version : metadata.brand_version_list) {
-    if (brand_version == chromium_brand_version) {
-      contains_chromium_brand_version = true;
-    }
-    if (brand_version == product_brand_version) {
-      contains_product_brand_version = true;
-    }
-  }
-
-  EXPECT_TRUE(contains_chromium_brand_version);
-  EXPECT_TRUE(contains_product_brand_version);
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_version_list,
+                                   chromium_brand_version));
+  EXPECT_TRUE(
+      ContainsBrandVersion(metadata.brand_version_list, product_brand_version));
 
   // verify full version list
   const blink::UserAgentBrandVersion chromium_brand_full_version = {
       "Chromium", full_version};
+  const blink::UserAgentBrandVersion
+      major_to_minor_chromium_brand_full_version = {
+          "Chromium", major_to_minor_full_version};
   const blink::UserAgentBrandVersion product_brand_full_version = {
       version_info::GetProductName(), full_version};
-  bool contains_chromium_brand_full_version = false;
-  bool contains_product_brand_full_version = false;
+  const blink::UserAgentBrandVersion major_to_minor_product_brand_full_version =
+      {version_info::GetProductName(), major_to_minor_full_version};
 
-  for (const auto& brand_version : metadata.brand_full_version_list) {
-    if (brand_version == chromium_brand_full_version) {
-      contains_chromium_brand_full_version = true;
-    }
-    if (brand_version == product_brand_full_version) {
-      contains_product_brand_full_version = true;
-    }
-  }
-
-  EXPECT_TRUE(contains_chromium_brand_full_version);
-  EXPECT_TRUE(contains_product_brand_full_version);
-
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                   chromium_brand_full_version));
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                   product_brand_full_version));
   EXPECT_EQ(metadata.full_version, full_version);
 
+  // Ensure ForceMajorVersionToMinorPosition is respected,
+  TestingPrefServiceSimple pref_service;
+
+  // ForceMajorVersionToMinorPosition: kForceDisabled
+  pref_service.registry()->RegisterIntegerPref(
+      kForceMajorVersionToMinorPosition, kForceDisabled);
+  metadata = GetUserAgentMetadata(&pref_service);
+  EXPECT_EQ(metadata.full_version, full_version);
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_version_list,
+                                   chromium_brand_version));
+  EXPECT_TRUE(
+      ContainsBrandVersion(metadata.brand_version_list, product_brand_version));
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                   chromium_brand_full_version));
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                   product_brand_full_version));
+  EXPECT_FALSE(ContainsBrandVersion(metadata.brand_version_list,
+                                    major_to_minor_chromium_brand_version));
+  EXPECT_FALSE(ContainsBrandVersion(metadata.brand_version_list,
+                                    major_to_minor_product_brand_version));
+  EXPECT_FALSE(
+      ContainsBrandVersion(metadata.brand_full_version_list,
+                           major_to_minor_chromium_brand_full_version));
+  EXPECT_FALSE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                    major_to_minor_product_brand_full_version));
+
+  // ForceMajorVersionToMinorPosition: kForceEnabled
+  pref_service.SetInteger(kForceMajorVersionToMinorPosition, kForceEnabled);
+  metadata = GetUserAgentMetadata(&pref_service);
+  EXPECT_EQ(metadata.full_version, major_to_minor_full_version);
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_version_list,
+                                   major_to_minor_chromium_brand_version));
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_version_list,
+                                   major_to_minor_product_brand_version));
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                   major_to_minor_chromium_brand_full_version));
+  EXPECT_TRUE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                   major_to_minor_product_brand_full_version));
+  EXPECT_FALSE(ContainsBrandVersion(metadata.brand_version_list,
+                                    chromium_brand_version));
+  EXPECT_FALSE(
+      ContainsBrandVersion(metadata.brand_version_list, product_brand_version));
+  EXPECT_FALSE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                    chromium_brand_full_version));
+  EXPECT_FALSE(ContainsBrandVersion(metadata.brand_full_version_list,
+                                    product_brand_full_version));
+
 #if BUILDFLAG(IS_WIN)
   if (base::win::GetVersion() < base::win::Version::WIN10) {
     EXPECT_EQ(metadata.platform_version, "0.0.0");
diff --git a/components/enterprise/content/copy_prevention_settings_policy_handler.cc b/components/enterprise/content/copy_prevention_settings_policy_handler.cc
index ad7066b4..f9776ac 100644
--- a/components/enterprise/content/copy_prevention_settings_policy_handler.cc
+++ b/components/enterprise/content/copy_prevention_settings_policy_handler.cc
@@ -55,7 +55,7 @@
     return false;
   }
 
-  for (auto& pattern : disable->GetList()) {
+  for (auto& pattern : disable->GetListDeprecated()) {
     if (pattern.GetString() == "*") {
       errors->AddError(
           policy_name(),
diff --git a/components/error_page/common/localized_error.cc b/components/error_page/common/localized_error.cc
index b0f30f4..de34d6e 100644
--- a/components/error_page/common/localized_error.cc
+++ b/components/error_page/common/localized_error.cc
@@ -525,19 +525,12 @@
   return standard_menu_items_text;
 }
 
-// Returns true if the error is due to a disconnected network.
-bool IsOfflineError(const std::string& error_domain, int error_code) {
-  return ((error_code == net::ERR_INTERNET_DISCONNECTED &&
-           error_domain == Error::kNetErrorDomain) ||
-          (error_code == error_page::DNS_PROBE_FINISHED_NO_INTERNET &&
-           error_domain == Error::kDnsProbeErrorDomain));
-}
-
 // Gets the icon class for a given |error_domain| and |error_code|.
 const char* GetIconClassForError(const std::string& error_domain,
                                  int error_code) {
-  return IsOfflineError(error_domain, error_code) ? "icon-offline"
-                                                  : "icon-generic";
+  return LocalizedError::IsOfflineError(error_domain, error_code)
+             ? "icon-offline"
+             : "icon-generic";
 }
 
 base::DictionaryValue SingleEntryDictionary(base::StringPiece path,
@@ -894,7 +887,7 @@
     const std::string& locale,
     bool is_blocked_by_extension) {
   LocalizedError::PageState result;
-  if (IsOfflineError(error_domain, error_code)) {
+  if (LocalizedError::IsOfflineError(error_domain, error_code)) {
     result.is_offline_error = true;
 
     // These strings are to be read by a screen reader during the dino game.
@@ -1092,7 +1085,7 @@
 #if BUILDFLAG(IS_ANDROID)
   if (!is_post && !result.reload_button_shown && !is_incognito &&
       failed_url.is_valid() && failed_url.SchemeIsHTTPOrHTTPS() &&
-      IsOfflineError(error_domain, error_code)) {
+      LocalizedError::IsOfflineError(error_domain, error_code)) {
     if (!auto_fetch_feature_enabled) {
       result.download_button_shown = true;
       result.strings.SetPath({"downloadButton", "msg"},
@@ -1117,7 +1110,8 @@
       "closeDescriptionPopup",
       l10n_util::GetStringUTF16(IDS_ERRORPAGES_SUGGESTION_CLOSE_POPUP_BUTTON));
 
-  if (IsOfflineError(error_domain, error_code) && !is_incognito) {
+  if (LocalizedError::IsOfflineError(error_domain, error_code) &&
+      !is_incognito) {
     result.offline_content_feature_enabled = offline_content_feature_enabled;
     if (offline_content_feature_enabled) {
       result.strings.SetStringPath("suggestedOfflineContentPresentation", "on");
@@ -1145,6 +1139,33 @@
   return result;
 }
 
+LocalizedError::PageState LocalizedError::GetPageStateForOverriddenErrorPage(
+    base::Value string_dict,
+    int error_code,
+    const std::string& error_domain,
+    const GURL& failed_url,
+    const std::string& locale) {
+  LocalizedError::PageState result;
+
+  result.strings.MergeDictionary(&string_dict);
+  webui::SetLoadTimeDataDefaults(locale, &result.strings);
+
+  if (failed_url.SchemeIsHTTPOrHTTPS()) {
+    result.strings.SetStringPath(
+        "title", url_formatter::IDNToUnicode(failed_url.host()));
+  } else {
+    std::u16string failed_url_string(url_formatter::FormatUrl(
+        failed_url, url_formatter::kFormatUrlOmitNothing,
+        net::UnescapeRule::NORMAL, nullptr, nullptr, nullptr));
+    // URLs are always LTR.
+    if (base::i18n::IsRTL())
+      base::i18n::WrapStringWithLTRFormatting(&failed_url_string);
+    result.strings.SetStringPath("title", failed_url_string);
+  }
+
+  return result;
+}
+
 std::u16string LocalizedError::GetErrorDetails(const std::string& error_domain,
                                                int error_code,
                                                bool is_secure_dns_network_error,
@@ -1168,4 +1189,13 @@
                         /*is_post=*/false) != nullptr;
 }
 
+// Returns true if the error is due to a disconnected network.
+bool LocalizedError::IsOfflineError(const std::string& error_domain,
+                                    int error_code) {
+  return ((error_code == net::ERR_INTERNET_DISCONNECTED &&
+           error_domain == Error::kNetErrorDomain) ||
+          (error_code == error_page::DNS_PROBE_FINISHED_NO_INTERNET &&
+           error_domain == Error::kDnsProbeErrorDomain));
+}
+
 }  // namespace error_page
diff --git a/components/error_page/common/localized_error.h b/components/error_page/common/localized_error.h
index 0a296b01..f33f700 100644
--- a/components/error_page/common/localized_error.h
+++ b/components/error_page/common/localized_error.h
@@ -59,6 +59,15 @@
       const std::string& locale,
       bool is_blocked_by_extension);
 
+  // Returns a |PageState| that describes the elements that should be shown on
+  // when default offline page is shown.
+  static PageState GetPageStateForOverriddenErrorPage(
+      base::Value string_dict,
+      int error_code,
+      const std::string& error_domain,
+      const GURL& failed_url,
+      const std::string& locale);
+
   // Returns a description of the encountered error.
   static std::u16string GetErrorDetails(const std::string& error_domain,
                                         int error_code,
@@ -67,6 +76,8 @@
 
   // Returns true if an error page exists for the specified parameters.
   static bool HasStrings(const std::string& error_domain, int error_code);
+
+  static bool IsOfflineError(const std::string& error_domain, int error_code);
 };
 
 }  // namespace error_page
diff --git a/components/exo/sub_surface_unittest.cc b/components/exo/sub_surface_unittest.cc
index b790b6ea..e8b7e83 100644
--- a/components/exo/sub_surface_unittest.cc
+++ b/components/exo/sub_surface_unittest.cc
@@ -115,6 +115,45 @@
   EXPECT_EQ(surface1->window(), parent->window()->children()[1]);
 }
 
+TEST_F(SubSurfaceTest, ParentDamageOnReorder) {
+  auto surface_tree_host = std::make_unique<SurfaceTreeHost>("SubSurfaceTest");
+  LayerTreeFrameSinkHolder* frame_sink_holder =
+      surface_tree_host->layer_tree_frame_sink_holder();
+
+  auto parent = std::make_unique<Surface>();
+  parent->SetViewport({800.f, 600.f});
+  auto surface1 = std::make_unique<Surface>();
+  auto surface2 = std::make_unique<Surface>();
+  auto non_sibling_surface = std::make_unique<Surface>();
+  auto sub_surface1 =
+      std::make_unique<SubSurface>(surface1.get(), parent.get());
+  auto sub_surface2 =
+      std::make_unique<SubSurface>(surface2.get(), parent.get());
+
+  sub_surface2->PlaceBelow(surface1.get());
+  parent->Commit();
+
+  viz::CompositorFrame frame1;
+  frame1.render_pass_list.push_back(viz::CompositorRenderPass::Create());
+  parent->AppendSurfaceHierarchyContentsToFrame(
+      gfx::PointF{}, 1, frame_sink_holder->resource_manager(), &frame1);
+
+  // Parent surface damage is extended when sub_surface stacking order changes.
+  EXPECT_FALSE(frame1.render_pass_list.back()->damage_rect.IsEmpty());
+
+  sub_surface1->PlaceAbove(surface2.get());  // no-op
+  sub_surface2->PlaceBelow(surface1.get());  // no-op
+  parent->Commit();
+
+  viz::CompositorFrame frame2;
+  frame2.render_pass_list.push_back(viz::CompositorRenderPass::Create());
+  parent->AppendSurfaceHierarchyContentsToFrame(
+      gfx::PointF{}, 1, frame_sink_holder->resource_manager(), &frame2);
+
+  // Parent surface damage is unaffected.
+  EXPECT_TRUE(frame2.render_pass_list.back()->damage_rect.IsEmpty());
+}
+
 TEST_F(SubSurfaceTest, SetCommitBehavior) {
   auto parent = std::make_unique<Surface>();
   auto shell_surface = std::make_unique<ShellSurface>(parent.get());
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index 2372ae5..cfa5ffdd 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -502,8 +502,8 @@
     return;
   }
 
-  auto sibling_it = FindListEntry(pending_sub_surfaces_, sibling);
-  if (sibling_it == pending_sub_surfaces_.end()) {
+  auto position_it = FindListEntry(pending_sub_surfaces_, sibling);
+  if (position_it == pending_sub_surfaces_.end()) {
     DLOG(WARNING) << "Client tried to place sub-surface below a surface that "
                      "is not a sibling";
     return;
@@ -511,9 +511,12 @@
 
   DCHECK(ListContainsEntry(pending_sub_surfaces_, sub_surface));
   auto it = FindListEntry(pending_sub_surfaces_, sub_surface);
-  if (it == sibling_it)
+
+  // If |sub_surface| is already immediately below |sibling|, do not do
+  // anything.
+  if (it == --position_it)
     return;
-  pending_sub_surfaces_.splice(sibling_it, pending_sub_surfaces_, it);
+  pending_sub_surfaces_.splice(++position_it, pending_sub_surfaces_, it);
   sub_surfaces_changed_ = true;
 }
 
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index 350bf411..a04726a 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -33,6 +33,8 @@
     "IPH_GMCCastStartStop", base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kIPHLiveCaptionFeature{"IPH_LiveCaption",
                                            base::FEATURE_ENABLED_BY_DEFAULT};
+const base::Feature kIPHTabAudioMutingFeature{"IPH_TabAudioMuting",
+                                              base::FEATURE_DISABLED_BY_DEFAULT};
 const base::Feature kIPHPasswordsAccountStorageFeature{
     "IPH_PasswordsAccountStorage", base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kIPHReadingListDiscoveryFeature{
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index 512f61f..2b4e37c 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -36,6 +36,7 @@
 extern const base::Feature kIPHFocusHelpBubbleScreenReaderPromoFeature;
 extern const base::Feature kIPHGMCCastStartStopFeature;
 extern const base::Feature kIPHLiveCaptionFeature;
+extern const base::Feature kIPHTabAudioMutingFeature;
 extern const base::Feature kIPHPasswordsAccountStorageFeature;
 extern const base::Feature kIPHReadingListDiscoveryFeature;
 extern const base::Feature kIPHReadingListEntryPointFeature;
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index be78991..6d15ad10 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -124,6 +124,7 @@
     &kIPHFocusHelpBubbleScreenReaderPromoFeature,
     &kIPHGMCCastStartStopFeature,
     &kIPHLiveCaptionFeature,
+    &kIPHTabAudioMutingFeature,
     &kIPHPasswordsAccountStorageFeature,
     &kIPHReadingListDiscoveryFeature,
     &kIPHReadingListEntryPointFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index a12b3909..222d2b5e 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -240,6 +240,7 @@
                        "IPH_ReadingListInSidePanel");
 DEFINE_VARIATION_PARAM(kIPHReopenTabFeature, "IPH_ReopenTab");
 DEFINE_VARIATION_PARAM(kIPHSideSearchFeature, "IPH_SideSearch");
+DEFINE_VARIATION_PARAM(kIPHTabAudioMutingFeature, "IPH_TabAudioMuting");
 DEFINE_VARIATION_PARAM(kIPHTabSearchFeature, "IPH_TabSearch");
 DEFINE_VARIATION_PARAM(kIPHWebUITabStripFeature, "IPH_WebUITabStrip");
 DEFINE_VARIATION_PARAM(kIPHDesktopPwaInstallFeature, "IPH_DesktopPwaInstall");
@@ -367,6 +368,7 @@
         VARIATION_ENTRY(kIPHReadingListInSidePanelFeature),
         VARIATION_ENTRY(kIPHReopenTabFeature),
         VARIATION_ENTRY(kIPHSideSearchFeature),
+        VARIATION_ENTRY(kIPHTabAudioMutingFeature),
         VARIATION_ENTRY(kIPHTabSearchFeature),
         VARIATION_ENTRY(kIPHWebUITabStripFeature),
         VARIATION_ENTRY(kIPHDesktopPwaInstallFeature),
diff --git a/components/feed/core/proto/v2/store.proto b/components/feed/core/proto/v2/store.proto
index da7ee4a..91d9c642 100644
--- a/components/feed/core/proto/v2/store.proto
+++ b/components/feed/core/proto/v2/store.proto
@@ -118,6 +118,12 @@
   repeated StreamMetadata stream_metadata = 5;
   // The GAIA ID associated with the store.
   string gaia = 6;
+  // Whether WAA is enabled for this user, as reported by the last FeedQuery
+  // response.
+  bool web_and_app_activity_enabled = 7;
+  // Whether personalization is enabled for Discover, as reported by the last
+  // FeedQuery response.
+  bool discover_personalization_enabled = 8;
 }
 
 // A set of StreamStructures that should be applied to a stream.
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
index 5863da1..a2600ce 100644
--- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
+++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -2569,8 +2569,48 @@
 
   // Re-create the feed, and verify ClearAll isn't called again.
   on_clear_all.Clear();
+  base::HistogramTester histograms;
   CreateStream();
   EXPECT_FALSE(on_clear_all.called());
+  histograms.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kFeedNotEnabledByPolicy,
+                                1);
+}
+
+TEST_F(FeedApiTest, ReportUserSettingsFromMetadataWaaOnDpOff) {
+  // Fetch a feed, so that there's stored data.
+  {
+    RefreshResponseData response;
+    response.model_update_request = MakeTypicalInitialModelState();
+    response.web_and_app_activity_enabled = true;
+    response_translator_.InjectResponse(std::move(response));
+  }
+  TestForYouSurface surface(stream_.get());
+  WaitForIdleTaskQueue();
+
+  // Simulate a Chrome restart.
+  base::HistogramTester histograms;
+  CreateStream();
+  histograms.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInWaaOnDpOff, 1);
+}
+
+TEST_F(FeedApiTest, ReportUserSettingsFromMetadataWaaOffDpOn) {
+  // Fetch a feed, so that there's stored data.
+  {
+    RefreshResponseData response;
+    response.model_update_request = MakeTypicalInitialModelState();
+    response.discover_personalization_enabled = true;
+    response_translator_.InjectResponse(std::move(response));
+  }
+  TestForYouSurface surface(stream_.get());
+  WaitForIdleTaskQueue();
+
+  // Simulate a Chrome restart.
+  base::HistogramTester histograms;
+  CreateStream();
+  histograms.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInWaaOffDpOn, 1);
 }
 
 TEST_F(FeedStreamTestForAllStreamTypes, ManualRefreshInterestFeedSuccess) {
diff --git a/components/feed/core/v2/enums.h b/components/feed/core/v2/enums.h
index c30d3de..6b7cdefc 100644
--- a/components/feed/core/v2/enums.h
+++ b/components/feed/core/v2/enums.h
@@ -155,6 +155,33 @@
   kMaxValue = kViaDismissal,
 };
 
+// This must be kept in sync with FeedUserSettingsOnStart in enums.xml.
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// Reports last known state of user settings which affect Feed content.
+// This includes WAA (whether activity is recorded), and DP (whether
+// Discover personalization is enabled).
+enum class UserSettingsOnStart {
+  // The Feed is disabled by enterprise policy.
+  kFeedNotEnabledByPolicy = 0,
+  // The Feed is enabled by enterprise policy, but the user has hidden and
+  // disabled the Feed, so other user settings beyond sign-in status are not
+  // available.
+  kFeedNotVisibleSignedOut = 1,
+  kFeedNotVisibleSignedIn = 2,
+  // The Feed is enabled, the user is not signed in.
+  kSignedOut = 3,
+  // The Feed is enabled, the user is signed in, and setting states are known.
+  kSignedInWaaOnDpOn = 4,
+  kSignedInWaaOnDpOff = 5,
+  kSignedInWaaOffDpOn = 6,
+  kSignedInWaaOffDpOff = 7,
+  // The Feed is enabled, but there is no recent Feed data, so user settings
+  // state is unknown.
+  kSignedInNoRecentData = 8,
+  kMaxValue = kSignedInNoRecentData,
+};
+
 }  // namespace feed
 
 #endif  // COMPONENTS_FEED_CORE_V2_ENUMS_H_
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc
index 63aa937..6edfafbd 100644
--- a/components/feed/core/v2/feed_stream.cc
+++ b/components/feed/core/v2/feed_stream.cc
@@ -236,6 +236,10 @@
     }
   }
   metadata_populated_ = true;
+  metrics_reporter_->OnMetadataInitialized(IsFeedEnabledByEnterprisePolicy(),
+                                           IsArticlesListVisible(),
+                                           IsSignedIn(), metadata_);
+
   web_feed_subscription_coordinator_->Populate(result.web_feed_startup_data);
 
   for (const feedstore::StreamData& stream_data :
diff --git a/components/feed/core/v2/metrics_reporter.cc b/components/feed/core/v2/metrics_reporter.cc
index fc20f6f7..8a970fd 100644
--- a/components/feed/core/v2/metrics_reporter.cc
+++ b/components/feed/core/v2/metrics_reporter.cc
@@ -16,6 +16,8 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "components/feed/core/v2/enums.h"
+#include "components/feed/core/v2/feedstore_util.h"
 #include "components/feed/core/v2/prefs.h"
 #include "components/feed/core/v2/public/common_enums.h"
 #include "components/feed/core/v2/public/feed_api.h"
@@ -170,6 +172,45 @@
                        uma_base_name, ".", normalized_key});
 }
 
+UserSettingsOnStart GetUserSettingsOnStart(
+    bool isEnabledByEnterprisePolicy,
+    bool isFeedVisible,
+    bool isSignedIn,
+    const feedstore::Metadata& metadata) {
+  if (!isEnabledByEnterprisePolicy)
+    return UserSettingsOnStart::kFeedNotEnabledByPolicy;
+  if (!isFeedVisible) {
+    if (isSignedIn)
+      return UserSettingsOnStart::kFeedNotVisibleSignedIn;
+    return UserSettingsOnStart::kFeedNotVisibleSignedOut;
+  }
+  if (!isSignedIn)
+    return UserSettingsOnStart::kSignedOut;
+
+  const base::Time now = base::Time::Now();
+  bool has_recent_data = false;
+  for (const feedstore::Metadata::StreamMetadata& stream_meta :
+       metadata.stream_metadata()) {
+    base::TimeDelta delta = now - feedstore::FromTimestampMillis(
+                                      stream_meta.last_fetch_time_millis());
+    if (delta >= base::TimeDelta() && delta <= kUserSettingsMaxAge)
+      has_recent_data = true;
+  }
+
+  if (!has_recent_data)
+    return UserSettingsOnStart::kSignedInNoRecentData;
+
+  if (metadata.web_and_app_activity_enabled()) {
+    if (metadata.discover_personalization_enabled())
+      return UserSettingsOnStart::kSignedInWaaOnDpOn;
+    return UserSettingsOnStart::kSignedInWaaOnDpOff;
+  } else {
+    if (metadata.discover_personalization_enabled())
+      return UserSettingsOnStart::kSignedInWaaOffDpOn;
+    return UserSettingsOnStart::kSignedInWaaOffDpOff;
+  }
+}
+
 }  // namespace
 
 MetricsReporter::SurfaceWaiting::SurfaceWaiting() = default;
@@ -201,6 +242,17 @@
   delegate_ = delegate;
 }
 
+void MetricsReporter::OnMetadataInitialized(
+    bool isEnabledByEnterprisePolicy,
+    bool isFeedVisible,
+    bool isSignedIn,
+    const feedstore::Metadata& metadata) {
+  base::UmaHistogramEnumeration(
+      "ContentSuggestions.Feed.UserSettingsOnStart",
+      GetUserSettingsOnStart(isEnabledByEnterprisePolicy, isFeedVisible,
+                             isSignedIn, metadata));
+}
+
 void MetricsReporter::OnEnterBackground() {
   FinalizeMetrics();
 }
diff --git a/components/feed/core/v2/metrics_reporter.h b/components/feed/core/v2/metrics_reporter.h
index 0b85649d..3448b302 100644
--- a/components/feed/core/v2/metrics_reporter.h
+++ b/components/feed/core/v2/metrics_reporter.h
@@ -19,7 +19,13 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 class PrefService;
+namespace feedstore {
+class Metadata;
+}
+
 namespace feed {
+// If cached user setting info is older than this, it will not be reported.
+constexpr base::TimeDelta kUserSettingsMaxAge = base::Days(14);
 
 // Reports UMA metrics for feed.
 // Note this is inherited only for testing.
@@ -46,6 +52,11 @@
   // Two-step initialization, required for circular dependency.
   void Initialize(Delegate* delegate);
 
+  void OnMetadataInitialized(bool isEnabledByEnterprisePolicy,
+                             bool isFeedVisible,
+                             bool isSignedIn,
+                             const feedstore::Metadata& metadata);
+
   // User interactions. See |FeedApi| for definitions.
 
   virtual void ContentSliceViewed(const StreamType& stream_type,
diff --git a/components/feed/core/v2/metrics_reporter_unittest.cc b/components/feed/core/v2/metrics_reporter_unittest.cc
index faad54c..10463a7f 100644
--- a/components/feed/core/v2/metrics_reporter_unittest.cc
+++ b/components/feed/core/v2/metrics_reporter_unittest.cc
@@ -11,7 +11,10 @@
 #include "base/test/metrics/user_action_tester.h"
 #include "base/test/task_environment.h"
 #include "components/feed/core/common/pref_names.h"
+#include "components/feed/core/proto/v2/store.pb.h"
 #include "components/feed/core/shared_prefs/pref_names.h"
+#include "components/feed/core/v2/enums.h"
+#include "components/feed/core/v2/feedstore_util.h"
 #include "components/feed/core/v2/public/common_enums.h"
 #include "components/feed/core/v2/public/feed_api.h"
 #include "components/feed/core/v2/public/stream_type.h"
@@ -1017,4 +1020,120 @@
                   .empty());
 }
 
+TEST_F(MetricsReporterTest, UserSettingsOnStart_FeedNotEnabled) {
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/false,
+                                   /*isFeedVisible=*/false,
+                                   /*isSignedIn=*/false, feedstore::Metadata());
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kFeedNotEnabledByPolicy,
+                                1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_FeedNotVisible_SignedOut) {
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/false,
+                                   /*isSignedIn=*/false, feedstore::Metadata());
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kFeedNotVisibleSignedOut,
+                                1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_FeedNotVisible_SignedIn) {
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/false,
+                                   /*isSignedIn=*/true, feedstore::Metadata());
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kFeedNotVisibleSignedIn,
+                                1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_EnabledSignedOut) {
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/true,
+                                   /*isSignedIn=*/false, feedstore::Metadata());
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedOut, 1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_WaaOffDpOff) {
+  feedstore::Metadata metadata;
+  // Content age is within kUserSettingsMaxAge.
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now() - kUserSettingsMaxAge));
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/true,
+                                   /*isSignedIn=*/true, metadata);
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInWaaOffDpOff, 1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_WaaOnDpOff) {
+  feedstore::Metadata metadata;
+  // Content age is within kUserSettingsMaxAge.
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now()));
+  metadata.set_web_and_app_activity_enabled(true);
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/true,
+                                   /*isSignedIn=*/true, metadata);
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInWaaOnDpOff, 1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_WaaOffDpOn) {
+  feedstore::Metadata metadata;
+  // Only the first stream has age less than kUserSettingsMaxAge.
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now()));
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now() - kUserSettingsMaxAge -
+                                   base::Seconds(1)));
+  metadata.set_discover_personalization_enabled(true);
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/true,
+                                   /*isSignedIn=*/true, metadata);
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInWaaOffDpOn, 1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_WaaOnDpOn) {
+  feedstore::Metadata metadata;
+  // Only the second stream has age less than kUserSettingsMaxAge.
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now() - kUserSettingsMaxAge -
+                                   base::Seconds(1)));
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now()));
+  metadata.set_discover_personalization_enabled(true);
+  metadata.set_web_and_app_activity_enabled(true);
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/true,
+                                   /*isSignedIn=*/true, metadata);
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInWaaOnDpOn, 1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_FeedDataTooOld) {
+  feedstore::Metadata metadata;
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now() - kUserSettingsMaxAge -
+                                   base::Seconds(1)));
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/true,
+                                   /*isSignedIn=*/true, metadata);
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInNoRecentData, 1);
+}
+
+TEST_F(MetricsReporterTest, UserSettingsOnStart_FeedDataFromFuture) {
+  feedstore::Metadata metadata;
+  metadata.add_stream_metadata()->set_last_fetch_time_millis(
+      feedstore::ToTimestampMillis(base::Time::Now() + base::Seconds(1)));
+  reporter_->OnMetadataInitialized(/*isEnabledByEnterprisePolicy=*/true,
+                                   /*isFeedVisible=*/true,
+                                   /*isSignedIn=*/true, metadata);
+  histogram_.ExpectUniqueSample("ContentSuggestions.Feed.UserSettingsOnStart",
+                                UserSettingsOnStart::kSignedInNoRecentData, 1);
+}
+
 }  // namespace feed
diff --git a/components/feed/core/v2/prefs.cc b/components/feed/core/v2/prefs.cc
index 7d5b485e..27195f95 100644
--- a/components/feed/core/v2/prefs.cc
+++ b/components/feed/core/v2/prefs.cc
@@ -31,7 +31,8 @@
 std::vector<int> GetThrottlerRequestCounts(PrefService& pref_service) {
   std::vector<int> result;
   const auto& value_list =
-      pref_service.GetList(kThrottlerRequestCountListPrefName)->GetList();
+      pref_service.GetList(kThrottlerRequestCountListPrefName)
+          ->GetListDeprecated();
   for (const base::Value& value : value_list) {
     result.push_back(value.is_int() ? value.GetInt() : 0);
   }
diff --git a/components/feed/core/v2/protocol_translator.cc b/components/feed/core/v2/protocol_translator.cc
index d102c1b..a795d3c 100644
--- a/components/feed/core/v2/protocol_translator.cc
+++ b/components/feed/core/v2/protocol_translator.cc
@@ -377,6 +377,10 @@
       feed_response->feed_response_metadata().event_id().time_usec() * 1'000;
   response_data.server_response_sent_timestamp_ns =
       feed_response->feed_response_metadata().response_time_ms() * 1'000'000;
+  response_data.web_and_app_activity_enabled =
+      chrome_response_metadata.web_and_app_activity_enabled();
+  response_data.discover_personalization_enabled =
+      chrome_response_metadata.discover_personalization_enabled();
 
   return response_data;
 }
diff --git a/components/feed/core/v2/protocol_translator.h b/components/feed/core/v2/protocol_translator.h
index 4551c3f..d3d290d0 100644
--- a/components/feed/core/v2/protocol_translator.h
+++ b/components/feed/core/v2/protocol_translator.h
@@ -81,6 +81,9 @@
   // each other but not to client timestamps.
   int64_t server_request_received_timestamp_ns;
   int64_t server_response_sent_timestamp_ns;
+
+  bool web_and_app_activity_enabled = false;
+  bool discover_personalization_enabled = false;
 };
 
 absl::optional<feedstore::DataOperation> TranslateDataOperation(
diff --git a/components/feed/core/v2/tasks/load_stream_task.cc b/components/feed/core/v2/tasks/load_stream_task.cc
index ff088f85..5b21ae8e 100644
--- a/components/feed/core/v2/tasks/load_stream_task.cc
+++ b/components/feed/core/v2/tasks/load_stream_task.cc
@@ -400,8 +400,12 @@
                                          fetched_content_has_notice_card);
   MetricsReporter::NoticeCardFulfilled(fetched_content_has_notice_card);
 
-  auto updated_metadata = stream_.GetMetadata();
+  feedstore::Metadata updated_metadata = stream_.GetMetadata();
   SetLastFetchTime(updated_metadata, options_.stream_type, base::Time::Now());
+  updated_metadata.set_web_and_app_activity_enabled(
+      response_data.web_and_app_activity_enabled);
+  updated_metadata.set_discover_personalization_enabled(
+      response_data.discover_personalization_enabled);
   feedstore::MaybeUpdateSessionId(updated_metadata, response_data.session_id);
   if (response_data.content_lifetime) {
     feedstore::SetContentLifetime(updated_metadata, options_.stream_type,
diff --git a/components/flags_ui/flags_state_unittest.cc b/components/flags_ui/flags_state_unittest.cc
index 0b20bd4..6331fdf 100644
--- a/components/flags_ui/flags_state_unittest.cc
+++ b/components/flags_ui/flags_state_unittest.cc
@@ -247,10 +247,10 @@
   const base::Value* entries_list = prefs_.GetList(prefs::kAboutFlagsEntries);
   ASSERT_TRUE(entries_list != nullptr);
 
-  ASSERT_EQ(2u, entries_list->GetList().size());
+  ASSERT_EQ(2u, entries_list->GetListDeprecated().size());
 
-  std::string s0 = entries_list->GetList()[0].GetString();
-  std::string s1 = entries_list->GetList()[1].GetString();
+  std::string s0 = entries_list->GetListDeprecated()[0].GetString();
+  std::string s1 = entries_list->GetListDeprecated()[1].GetString();
 
   EXPECT_TRUE(s0 == kFlags1 || s1 == kFlags1);
   EXPECT_TRUE(s0 == kFlags2 || s1 == kFlags2);
@@ -260,8 +260,8 @@
 
   entries_list = prefs_.GetList(prefs::kAboutFlagsEntries);
   ASSERT_TRUE(entries_list != nullptr);
-  ASSERT_EQ(1u, entries_list->GetList().size());
-  s0 = entries_list->GetList()[0].GetString();
+  ASSERT_EQ(1u, entries_list->GetListDeprecated().size());
+  s0 = entries_list->GetListDeprecated()[0].GetString();
   EXPECT_TRUE(s0 == kFlags1);
 }
 
@@ -276,7 +276,8 @@
   flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags1, false);
   flags_state_->SetFeatureEntryEnabled(&flags_storage_, kFlags2, false);
   entries_list = prefs_.GetList(prefs::kAboutFlagsEntries);
-  EXPECT_TRUE(entries_list == nullptr || entries_list->GetList().size() == 0);
+  EXPECT_TRUE(entries_list == nullptr ||
+              entries_list->GetListDeprecated().size() == 0);
 }
 
 TEST_F(FlagsStateTest, CombineOriginListValues) {
@@ -572,10 +573,10 @@
   // FeatureEntry 3 should show still be persisted in preferences though.
   const base::Value* entries_list = prefs_.GetList(prefs::kAboutFlagsEntries);
   ASSERT_TRUE(entries_list);
-  EXPECT_EQ(2U, entries_list->GetList().size());
-  std::string s0 = entries_list->GetList()[0].GetString();
+  EXPECT_EQ(2U, entries_list->GetListDeprecated().size());
+  std::string s0 = entries_list->GetListDeprecated()[0].GetString();
   EXPECT_EQ(kFlags1, s0);
-  std::string s1 = entries_list->GetList()[1].GetString();
+  std::string s1 = entries_list->GetListDeprecated()[1].GetString();
   EXPECT_EQ(kFlags3, s1);
 }
 
@@ -624,10 +625,10 @@
   // And it should persist.
   const base::Value* entries_list = prefs_.GetList(prefs::kAboutFlagsEntries);
   ASSERT_TRUE(entries_list);
-  EXPECT_EQ(2U, entries_list->GetList().size());
-  std::string s0 = entries_list->GetList()[0].GetString();
+  EXPECT_EQ(2U, entries_list->GetListDeprecated().size());
+  std::string s0 = entries_list->GetListDeprecated()[0].GetString();
   EXPECT_EQ(kFlags1, s0);
-  std::string s1 = entries_list->GetList()[1].GetString();
+  std::string s1 = entries_list->GetListDeprecated()[1].GetString();
   EXPECT_EQ(kFlags2, s1);
 }
 
diff --git a/components/flags_ui/flags_test_helpers.cc b/components/flags_ui/flags_test_helpers.cc
index b9b71c1..e64da34 100644
--- a/components/flags_ui/flags_test_helpers.cc
+++ b/components/flags_ui/flags_test_helpers.cc
@@ -72,7 +72,7 @@
     std::string name = entry.FindKey("name")->GetString();
     std::vector<std::string> owners;
     if (const base::Value* e = entry.FindKey("owners")) {
-      for (const auto& owner : e->GetList())
+      for (const auto& owner : e->GetListDeprecated())
         owners.push_back(owner.GetString());
     }
     int expiry_milestone = entry.FindKey("expiry_milestone")->GetInt();
diff --git a/components/flags_ui/pref_service_flags_storage.cc b/components/flags_ui/pref_service_flags_storage.cc
index a42ae1e..b531ebe 100644
--- a/components/flags_ui/pref_service_flags_storage.cc
+++ b/components/flags_ui/pref_service_flags_storage.cc
@@ -25,7 +25,7 @@
   const base::Value* enabled_experiments =
       prefs_->GetList(prefs::kAboutFlagsEntries);
   std::set<std::string> flags;
-  for (const auto& entry : enabled_experiments->GetList()) {
+  for (const auto& entry : enabled_experiments->GetListDeprecated()) {
     if (!entry.is_string()) {
       LOG(WARNING) << "Invalid entry in " << prefs::kAboutFlagsEntries;
       continue;
diff --git a/components/heap_profiling/in_process/heap_profiler_controller.cc b/components/heap_profiling/in_process/heap_profiler_controller.cc
index 816a781f..8b17b88 100644
--- a/components/heap_profiling/in_process/heap_profiler_controller.cc
+++ b/components/heap_profiling/in_process/heap_profiler_controller.cc
@@ -15,6 +15,8 @@
 #include "base/profiler/module_cache.h"
 #include "base/rand_util.h"
 #include "base/sampling_heap_profiler/sampling_heap_profiler.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_piece.h"
 #include "base/task/post_task.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/sequenced_task_runner_handle.h"
@@ -89,6 +91,30 @@
   return base::RandDouble() < probability;
 }
 
+// Records a time histogram for the `interval` between snapshots, using the
+// appropriate histogram buckets for the platform (desktop or mobile).
+// `recording_time` must be one of the {RecordingTime} token variants in the
+// definition of HeapProfiling.InProcess.SnapshotInterval.{Platform}.
+// {RecordingTime} in tools/metrics/histograms/metadata/memory/histograms.xml.
+void RecordUmaSnapshotInterval(base::TimeDelta interval,
+                               base::StringPiece recording_time) {
+#if BUILDFLAG(IS_IOS) || BUILDFLAG(IS_ANDROID)
+  // On mobile, the interval is distributed around a mean of 30 minutes.
+  constexpr base::TimeDelta kMinHistogramTime = base::Seconds(30);
+  constexpr base::TimeDelta kMaxHistogramTime = base::Hours(3);
+  constexpr const char* const kPlatform = "Mobile";
+#else
+  // On desktop, the interval is distributed around a mean of 1 day.
+  constexpr base::TimeDelta kMinHistogramTime = base::Minutes(30);
+  constexpr base::TimeDelta kMaxHistogramTime = base::Days(6);
+  constexpr const char* const kPlatform = "Desktop";
+#endif
+  base::UmaHistogramCustomTimes(
+      base::StrCat({"HeapProfiling.InProcess.SnapshotInterval.", kPlatform, ".",
+                    recording_time}),
+      interval, kMinHistogramTime, kMaxHistogramTime, 50);
+}
+
 }  // namespace
 
 constexpr base::Feature HeapProfilerController::kHeapProfilerReporting{
@@ -126,31 +152,26 @@
 void HeapProfilerController::ScheduleNextSnapshot(
     scoped_refptr<StoppedFlag> stopped,
     CollectionInterval heap_collection_interval) {
-  base::TimeDelta next_interval =
+  base::TimeDelta interval =
       heap_collection_interval.use_random_interval
           ? RandomInterval(heap_collection_interval.interval)
           : heap_collection_interval.interval;
-  // Poisson distribution gives ~1% chance of >5 days on desktop, so set the
-  // overflow bucket just beyond that. Use minute granularity at the lower end
-  // the distribution is centered around 30 min on mobile.
-  constexpr base::TimeDelta kMinHistogramTime = base::Minutes(1);
-  constexpr base::TimeDelta kMaxHistogramTime = base::Days(6);
-  base::UmaHistogramCustomTimes("HeapProfiling.InProcess.SnapshotInterval",
-                                next_interval, kMinHistogramTime,
-                                kMaxHistogramTime, 50);
+  RecordUmaSnapshotInterval(interval, "Scheduled");
   base::ThreadPool::PostDelayedTask(
       FROM_HERE, {base::TaskPriority::BEST_EFFORT},
       base::BindOnce(&HeapProfilerController::TakeSnapshot, std::move(stopped),
-                     heap_collection_interval),
-      next_interval);
+                     heap_collection_interval, /*previous_interval=*/interval),
+      interval);
 }
 
 // static
 void HeapProfilerController::TakeSnapshot(
     scoped_refptr<StoppedFlag> stopped,
-    CollectionInterval heap_collection_interval) {
+    CollectionInterval heap_collection_interval,
+    base::TimeDelta previous_interval) {
   if (stopped->data.IsSet())
     return;
+  RecordUmaSnapshotInterval(previous_interval, "Taken");
   RetrieveAndSendSnapshot();
   ScheduleNextSnapshot(std::move(stopped), heap_collection_interval);
 }
diff --git a/components/heap_profiling/in_process/heap_profiler_controller.h b/components/heap_profiling/in_process/heap_profiler_controller.h
index 0d482eb8..65ce892 100644
--- a/components/heap_profiling/in_process/heap_profiler_controller.h
+++ b/components/heap_profiling/in_process/heap_profiler_controller.h
@@ -76,8 +76,15 @@
   };
   static void ScheduleNextSnapshot(scoped_refptr<StoppedFlag> stopped,
                                    CollectionInterval heap_collection_interval);
+
+  // Takes a heap snapshot unless the `stopped` flag is set.
+  // `heap_collection_interval` is used to schedule the next snapshot.
+  // `previous_interval` is the time since the previous snapshot, which is used
+  // to log metrics about snapshot frequency.
   static void TakeSnapshot(scoped_refptr<StoppedFlag> stopped,
-                           CollectionInterval heap_collection_interval);
+                           CollectionInterval heap_collection_interval,
+                           base::TimeDelta previous_interval);
+
   static void RetrieveAndSendSnapshot();
 
   // On startup this will be determined randomly based on the current channel
diff --git a/components/heap_profiling/multi_process/test_driver.cc b/components/heap_profiling/multi_process/test_driver.cc
index f5d358a..13a547e 100644
--- a/components/heap_profiling/multi_process/test_driver.cc
+++ b/components/heap_profiling/multi_process/test_driver.cc
@@ -89,7 +89,7 @@
                          std::vector<int>* pids) {
   int num_processes = 0;
   base::Value* events = dump_json->FindKey("traceEvents");
-  for (const base::Value& event : events->GetList()) {
+  for (const base::Value& event : events->GetListDeprecated()) {
     const base::Value* found_name =
         event.FindKeyOfType("name", base::Value::Type::STRING);
     if (!found_name)
@@ -128,7 +128,7 @@
   base::Value* events = dump_json->FindKey("traceEvents");
   base::Value* dumps = nullptr;
   base::Value* heaps_v2 = nullptr;
-  for (base::Value& event : events->GetList()) {
+  for (base::Value& event : events->GetListDeprecated()) {
     const base::Value* found_name =
         event.FindKeyOfType("name", base::Value::Type::STRING);
     if (!found_name)
@@ -160,7 +160,7 @@
 // Parses maps.types and maps.strings. Returns |true| on success.
 bool ParseTypes(base::Value* heaps_v2, NodeMap* output) {
   base::Value* types = heaps_v2->FindPath({"maps", "types"});
-  for (const base::Value& type_value : types->GetList()) {
+  for (const base::Value& type_value : types->GetListDeprecated()) {
     const base::Value* id = type_value.FindKey("id");
     const base::Value* name_sid = type_value.FindKey("name_sid");
     if (!id || !name_sid) {
@@ -174,7 +174,7 @@
   }
 
   base::Value* strings = heaps_v2->FindPath({"maps", "strings"});
-  for (const base::Value& string_value : strings->GetList()) {
+  for (const base::Value& string_value : strings->GetListDeprecated()) {
     const base::Value* id = string_value.FindKey("id");
     const base::Value* string = string_value.FindKey("string");
     if (!id || !string) {
@@ -206,7 +206,7 @@
     return false;
   }
 
-  base::Value::ConstListView subarray_list = subarray->GetList();
+  base::Value::ConstListView subarray_list = subarray->GetListDeprecated();
   if (expected_size && subarray_list.size() != expected_size) {
     LOG(ERROR) << subarray_name << " has wrong size";
     return false;
@@ -300,7 +300,7 @@
   size_t count = 0;
   if (process_mmaps) {
     vm_regions = process_mmaps->FindKey("vm_regions");
-    count = vm_regions->GetList().size();
+    count = vm_regions->GetListDeprecated().size();
   }
   if (!should_have_contents) {
     if (count != 0) {
@@ -317,7 +317,7 @@
 
   // File paths may contain PII. Make sure that "mf" entries only contain the
   // basename, rather than a full path.
-  for (const base::Value& vm_region : vm_regions->GetList()) {
+  for (const base::Value& vm_region : vm_regions->GetListDeprecated()) {
     const base::Value* file_path_value = vm_region.FindKey("mf");
     if (file_path_value) {
       std::string file_path = file_path_value->GetString();
diff --git a/components/history/core/browser/browsing_history_service.cc b/components/history/core/browser/browsing_history_service.cc
index 3f6a214e..4233f6b 100644
--- a/components/history/core/browser/browsing_history_service.cc
+++ b/components/history/core/browser/browsing_history_service.cc
@@ -687,22 +687,22 @@
     has_synced_results_ = true;
     if (const base::Value* events = results_value->FindListKey("event")) {
       state->remote_results.reserve(state->remote_results.size() +
-                                    events->GetList().size());
+                                    events->GetListDeprecated().size());
       std::string host_name_utf8 = base::UTF16ToUTF8(state->search_text);
-      for (const base::Value& event : events->GetList()) {
+      for (const base::Value& event : events->GetListDeprecated()) {
         if (!event.is_dict())
           continue;
         const base::Value* results = event.FindListKey("result");
-        if (!results || results->GetList().empty())
+        if (!results || results->GetListDeprecated().empty())
           continue;
-        const base::Value& result = results->GetList()[0];
+        const base::Value& result = results->GetListDeprecated()[0];
         if (!result.is_dict())
           continue;
         const std::string* url = result.FindStringKey("url");
         if (!url)
           continue;
         const base::Value* ids = result.FindListKey("id");
-        if (!ids || ids->GetList().empty())
+        if (!ids || ids->GetListDeprecated().empty())
           continue;
 
         GURL gurl(*url);
@@ -729,7 +729,7 @@
 
         // Extract the timestamps of all the visits to this URL.
         // They are referred to as "IDs" by the server.
-        for (const base::Value& id : ids->GetList()) {
+        for (const base::Value& id : ids->GetListDeprecated()) {
           const std::string* timestamp_string;
           int64_t timestamp_usec = 0;
 
diff --git a/components/language/content/browser/geo_language_provider.cc b/components/language/content/browser/geo_language_provider.cc
index 15c0874..a252fbcfd 100644
--- a/components/language/content/browser/geo_language_provider.cc
+++ b/components/language/content/browser/geo_language_provider.cc
@@ -75,7 +75,8 @@
 
   const base::Value* const cached_languages_list =
       prefs_->GetList(kCachedGeoLanguagesPref);
-  for (const auto& language_value : cached_languages_list->GetList()) {
+  for (const auto& language_value :
+       cached_languages_list->GetListDeprecated()) {
     languages_.push_back(language_value.GetString());
   }
 
diff --git a/components/language/content/browser/geo_language_provider_unittest.cc b/components/language/content/browser/geo_language_provider_unittest.cc
index c76de1e..45cd11b 100644
--- a/components/language/content/browser/geo_language_provider_unittest.cc
+++ b/components/language/content/browser/geo_language_provider_unittest.cc
@@ -75,7 +75,8 @@
     std::vector<std::string> languages;
     const base::Value* const cached_languages_list =
         local_state_.GetList(GeoLanguageProvider::kCachedGeoLanguagesPref);
-    for (const auto& language_value : cached_languages_list->GetList()) {
+    for (const auto& language_value :
+         cached_languages_list->GetListDeprecated()) {
       languages.push_back(language_value.GetString());
     }
     return languages;
diff --git a/components/language/content/browser/ulp_language_code_locator/ulp_language_code_locator.cc b/components/language/content/browser/ulp_language_code_locator/ulp_language_code_locator.cc
index d6bf5b3..8cd8296 100644
--- a/components/language/content/browser/ulp_language_code_locator/ulp_language_code_locator.cc
+++ b/components/language/content/browser/ulp_language_code_locator/ulp_language_code_locator.cc
@@ -61,8 +61,8 @@
 
     bool is_cached = false;
     const base::Value* celllang_cached = nullptr;
-    if (index < celllangs_cached->GetList().size()) {
-      celllang_cached = &celllangs_cached->GetList()[index];
+    if (index < celllangs_cached->GetListDeprecated().size()) {
+      celllang_cached = &celllangs_cached->GetListDeprecated()[index];
       is_cached = celllang_cached->is_dict();
     }
 
@@ -84,7 +84,7 @@
       language = root.Get(cell, &level);
       if (level != -1) {
         if (is_cached) {
-          celllangs_cached->GetList()[index] =
+          celllangs_cached->GetListDeprecated()[index] =
               GetCellLanguagePairValue(cell.parent(level), language);
         } else {
           celllangs_cached->Append(
diff --git a/components/language/core/browser/language_prefs.cc b/components/language/core/browser/language_prefs.cc
index 491315f..26f86d6 100644
--- a/components/language/core/browser/language_prefs.cc
+++ b/components/language/core/browser/language_prefs.cc
@@ -107,8 +107,8 @@
   forced_languages_set_.clear();
 
   // Add policy languages.
-  for (const auto& language :
-       prefs_->GetList(language::prefs::kForcedLanguages)->GetList()) {
+  for (const auto& language : prefs_->GetList(language::prefs::kForcedLanguages)
+                                  ->GetListDeprecated()) {
     if (forced_languages_set_.find(language.GetString()) ==
         forced_languages_set_.end()) {
       deduplicated_languages.emplace_back(language.GetString());
diff --git a/components/leveldb_proto/public/shared_proto_database_client_list.cc b/components/leveldb_proto/public/shared_proto_database_client_list.cc
index 28996d09..efb2369 100644
--- a/components/leveldb_proto/public/shared_proto_database_client_list.cc
+++ b/components/leveldb_proto/public/shared_proto_database_client_list.cc
@@ -108,6 +108,8 @@
       return "CouponDatabase";
     case ProtoDbType::PAGE_ENTITY_METADATA_STORE:
       return "PageEntityMetadataDatabase";
+    case ProtoDbType::WEBRTC_VIDEO_STATS_DB:
+      return "WebrtcVideoStatsDB";
     case ProtoDbType::LAST:
       NOTREACHED();
       return std::string();
diff --git a/components/leveldb_proto/public/shared_proto_database_client_list.h b/components/leveldb_proto/public/shared_proto_database_client_list.h
index abe40fb..bc2171cd 100644
--- a/components/leveldb_proto/public/shared_proto_database_client_list.h
+++ b/components/leveldb_proto/public/shared_proto_database_client_list.h
@@ -67,6 +67,7 @@
   VIDEO_TUTORIALS_V2_DATABASE = 40,
   COUPON_DATABASE = 41,
   PAGE_ENTITY_METADATA_STORE = 42,
+  WEBRTC_VIDEO_STATS_DB = 43,
   LAST,
 };
 
diff --git a/components/login/base_screen_handler_utils.cc b/components/login/base_screen_handler_utils.cc
index c984d7bd..231698b 100644
--- a/components/login/base_screen_handler_utils.cc
+++ b/components/login/base_screen_handler_utils.cc
@@ -24,7 +24,7 @@
 bool ParseStringList(const base::Value* value, StringListType* out_value) {
   if (!value->is_list())
     return false;
-  base::Value::ConstListView list = value->GetList();
+  base::Value::ConstListView list = value->GetListDeprecated();
   out_value->resize(list.size());
   for (size_t i = 0; i < list.size(); ++i) {
     if (!list[i].is_string())
diff --git a/components/login/base_screen_handler_utils.h b/components/login/base_screen_handler_utils.h
index 49518d89..dd69713 100644
--- a/components/login/base_screen_handler_utils.h
+++ b/components/login/base_screen_handler_utils.h
@@ -87,7 +87,7 @@
     const base::ListValue* args,
     std::index_sequence<Ns...> indexes) {
   DCHECK(args);
-  DCHECK_EQ(sizeof...(Args), args->GetList().size());
+  DCHECK_EQ(sizeof...(Args), args->GetListDeprecated().size());
 
   callback.Run(ParseArg<Args, Ns>(args)...);
 }
diff --git a/components/lookalikes/core/lookalike_url_util.cc b/components/lookalikes/core/lookalike_url_util.cc
index aa456ecd..c229b9ed 100644
--- a/components/lookalikes/core/lookalike_url_util.cc
+++ b/components/lookalikes/core/lookalike_url_util.cc
@@ -1073,7 +1073,7 @@
                                  const GURL& url) {
   const auto* list =
       pref_service->GetList(prefs::kLookalikeWarningAllowlistDomains);
-  for (const auto& domain_val : list->GetList()) {
+  for (const auto& domain_val : list->GetListDeprecated()) {
     auto domain = domain_val.GetString();
     if (url.DomainIs(domain)) {
       return true;
diff --git a/components/management_strings.grdp b/components/management_strings.grdp
index fd7cfc5..7f2475e 100644
--- a/components/management_strings.grdp
+++ b/components/management_strings.grdp
@@ -253,6 +253,9 @@
   <message name="IDS_MANAGEMENT_TEXT_ENTERED_EVENT" desc="Event for the text entry scanning feature.">
     Text is entered
   </message>
+  <message name="IDS_MANAGEMENT_PAGE_PRINTED_EVENT" desc="Event for the page print scanning feature.">
+    Page is printed
+  </message>
   <message name="IDS_MANAGEMENT_ENTERPRISE_REPORTING_EVENT" desc="Event for the enterprise reporting feature">
     Security event occurs
   </message>
@@ -268,6 +271,9 @@
   <message name="IDS_MANAGEMENT_TEXT_ENTERED_VISIBLE_DATA" desc="Description of the visible data for the text entry scanning feature.">
     Text you paste or attach is sent to Google Cloud or third parties for analysis. For example, it might be scanned for sensitive data.
   </message>
+  <message name="IDS_MANAGEMENT_PAGE_PRINTED_VISIBLE_DATA" desc="Description of the visible data for the page print scanning feature.">
+    The content of pages you print is sent to Google Cloud or third parties for analysis. For example, it might be scanned for sensitive data.
+  </message>
   <message name="IDS_MANAGEMENT_ENTERPRISE_REPORTING_VISIBLE_DATA" desc="Description of the visible data for the Connectors reporting feature">
     When security events are flagged by Chrome, relevant data about the events is sent to your administrator. This can include URLs of pages you visit in Chrome, file names or metadata, and the username that you use to sign in to web based applications, your device and Chrome.
   </message>
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_PAGE_PRINTED_EVENT.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_PAGE_PRINTED_EVENT.png.sha1
new file mode 100644
index 0000000..5e7810c
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_PAGE_PRINTED_EVENT.png.sha1
@@ -0,0 +1 @@
+0b4070b8a3c7f607fe81cf8a4d97e383266d1ba8
\ No newline at end of file
diff --git a/components/management_strings_grdp/IDS_MANAGEMENT_PAGE_PRINTED_VISIBLE_DATA.png.sha1 b/components/management_strings_grdp/IDS_MANAGEMENT_PAGE_PRINTED_VISIBLE_DATA.png.sha1
new file mode 100644
index 0000000..5e7810c
--- /dev/null
+++ b/components/management_strings_grdp/IDS_MANAGEMENT_PAGE_PRINTED_VISIBLE_DATA.png.sha1
@@ -0,0 +1 @@
+0b4070b8a3c7f607fe81cf8a4d97e383266d1ba8
\ No newline at end of file
diff --git a/components/media_router/browser/logger_impl.cc b/components/media_router/browser/logger_impl.cc
index 48bb1872..a5a6228 100644
--- a/components/media_router/browser/logger_impl.cc
+++ b/components/media_router/browser/logger_impl.cc
@@ -96,7 +96,7 @@
       sink_id, media_source, session_id);
 }
 
-void LoggerImpl::Bind(mojo::PendingReceiver<mojom::Logger> receiver) {
+void LoggerImpl::BindReceiver(mojo::PendingReceiver<mojom::Logger> receiver) {
   receivers_.Add(this, std::move(receiver));
 }
 
diff --git a/components/media_router/browser/logger_impl.h b/components/media_router/browser/logger_impl.h
index fcf7b60..49a9696 100644
--- a/components/media_router/browser/logger_impl.h
+++ b/components/media_router/browser/logger_impl.h
@@ -47,8 +47,7 @@
                 const std::string& sink_id,
                 const std::string& media_source,
                 const std::string& session_id) override;
-
-  void Bind(mojo::PendingReceiver<mojom::Logger> receiver);
+  void BindReceiver(mojo::PendingReceiver<mojom::Logger> receiver) override;
 
   std::string GetLogsAsJson() const;
   base::Value GetLogsAsValue() const;
diff --git a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
index 8a611a6..0819fa08 100644
--- a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
+++ b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
@@ -715,8 +715,8 @@
   const base::Value* origins =
       user_prefs::UserPrefs::Get(GetWebContents().GetBrowserContext())
           ->GetList(prefs::kMediaRouterTabMirroringSources);
-  return origins &&
-         base::Contains(origins->GetList(), base::Value(origin.Serialize()));
+  return origins && base::Contains(origins->GetListDeprecated(),
+                                   base::Value(origin.Serialize()));
 }
 #endif  // !BUILDFLAG(IS_ANDROID)
 
diff --git a/components/media_router/common/mojom/logger.mojom b/components/media_router/common/mojom/logger.mojom
index 340062e..edde0c45 100644
--- a/components/media_router/common/mojom/logger.mojom
+++ b/components/media_router/common/mojom/logger.mojom
@@ -50,4 +50,8 @@
       string sink_id,
       string media_source,
       string session_id);
+
+  // Binds this logger to a new pending receiver, allowing any code with access
+  // to a Logger to create a new receiver for it.
+  BindReceiver(pending_receiver<Logger> receiver);
 };
diff --git a/components/media_router/common/test/mock_logger.h b/components/media_router/common/test/mock_logger.h
index 694413d..0efef0b 100644
--- a/components/media_router/common/test/mock_logger.h
+++ b/components/media_router/common/test/mock_logger.h
@@ -40,6 +40,8 @@
                     const std::string&,
                     const std::string&));
 
+  MOCK_METHOD1(BindReceiver, void(mojo::PendingReceiver<mojom::Logger>));
+
  private:
   mojo::Receiver<media_router::mojom::Logger> receiver_{this};
 };
diff --git a/components/metrics/clean_exit_beacon.cc b/components/metrics/clean_exit_beacon.cc
index 03d34431..c294556 100644
--- a/components/metrics/clean_exit_beacon.cc
+++ b/components/metrics/clean_exit_beacon.cc
@@ -265,12 +265,9 @@
 #if BUILDFLAG(IS_ANDROID)
   // TODO(crbug/1248239): Use the beacon file, if any, to maybe increment the
   // crash streak when the Extended Variations Safe Mode experiment is fully
-  // enabled on Android Chrome beta and stable.
-  if (channel_ != version_info::Channel::UNKNOWN &&
-      channel_ != version_info::Channel::CANARY &&
-      channel_ != version_info::Channel::DEV) {
+  // enabled on Android Chrome stable.
+  if (channel_ == version_info::Channel::STABLE)
     beacon_file_contents.reset();
-  }
 #endif  // BUILDFLAG(IS_ANDROID)
 
   MaybeIncrementCrashStreak(did_previous_session_exit_cleanly_,
@@ -309,12 +306,9 @@
 #if BUILDFLAG(IS_ANDROID)
   // TODO(crbug/1248239): Fully enable the Extended Variations Safe Mode
   // experiment on Android Chrome by using the beacon file's beacon value for
-  // clients in the SignalAndWriteViaFileUtil group on beta and stable.
-  if (channel_ != version_info::Channel::UNKNOWN &&
-      channel_ != version_info::Channel::CANARY &&
-      channel_ != version_info::Channel::DEV) {
+  // clients in the SignalAndWriteViaFileUtil group on stable.
+  if (channel_ == version_info::Channel::STABLE)
     return local_state_beacon_value.value_or(true);
-  }
 #endif  // BUILDFLAG(IS_ANDROID)
 #if BUILDFLAG(IS_IOS)
   // For the time being, this is a no-op to avoid interference with the Extended
diff --git a/components/metrics/clean_exit_beacon_unittest.cc b/components/metrics/clean_exit_beacon_unittest.cc
index 443a22a..47d746c87 100644
--- a/components/metrics/clean_exit_beacon_unittest.cc
+++ b/components/metrics/clean_exit_beacon_unittest.cc
@@ -96,12 +96,6 @@
     : public testing::WithParamInterface<BadBeaconTestParams>,
       public CleanExitBeaconTest {};
 
-#if BUILDFLAG(IS_ANDROID)
-class IgnoredBeaconFileTest
-    : public testing::WithParamInterface<version_info::Channel>,
-      public CleanExitBeaconTest {};
-#endif  // BUILDFLAG(IS_ANDROID)
-
 struct BeaconConsistencyTestParams {
   // Inputs:
   const std::string test_name;
@@ -419,15 +413,10 @@
 
 #if BUILDFLAG(IS_ANDROID)
 // TODO(crbug/1248239): Remove this test once the Extended Variations Safe Mode
-// experiment is fully enabled on Android Chrome. Until then, update the
-// channels as necessary.
-INSTANTIATE_TEST_SUITE_P(All,
-                         IgnoredBeaconFileTest,
-                         ::testing::Values(version_info::Channel::BETA,
-                                           version_info::Channel::STABLE));
-
+// experiment is enabled on Android Chrome stable.
+//
 // Verify that the beacon file, if any, is ignored on Android.
-TEST_P(IgnoredBeaconFileTest, FileIgnoredOnAndroid) {
+TEST_F(CleanExitBeaconTest, FileIgnoredOnAndroid) {
   SetUpExtendedSafeModeExperiment(variations::kSignalAndWriteViaFileUtilGroup);
 
   // Set up the beacon file such that the previous session did not exit cleanly
@@ -453,7 +442,7 @@
                     expected_num_crashes);
 
   TestCleanExitBeacon clean_exit_beacon(&prefs_, user_data_dir_path,
-                                        GetParam());
+                                        version_info::Channel::STABLE);
 
   // Verify that the Local State beacon was used (not the beacon file beacon).
   EXPECT_TRUE(clean_exit_beacon.exited_cleanly());
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc
index a153ba6..0112c8c 100644
--- a/components/metrics/file_metrics_provider.cc
+++ b/components/metrics/file_metrics_provider.cc
@@ -926,10 +926,10 @@
 
   ListPrefUpdate list_value(pref_service_,
                             metrics::prefs::kMetricsFileMetricsMetadata);
-  if (list_value->GetList().empty())
+  if (list_value->GetListDeprecated().empty())
     return false;
 
-  base::Value::ListView mutable_list = list_value->GetList();
+  base::Value::ListView mutable_list = list_value->GetListDeprecated();
   size_t count = pref_service_->GetInteger(
       metrics::prefs::kStabilityFileMetricsUnsentSamplesCount);
   pref_service_->SetInteger(
@@ -937,7 +937,7 @@
       mutable_list[0].GetInt() + count);
   pref_service_->SetInteger(
       metrics::prefs::kStabilityFileMetricsUnsentFilesCount,
-      list_value->GetList().size() - 1);
+      list_value->GetListDeprecated().size() - 1);
   list_value->EraseListIter(mutable_list.begin());
 
   return true;
diff --git a/components/metrics/metrics_log_store_unittest.cc b/components/metrics/metrics_log_store_unittest.cc
index f546a57..929c592 100644
--- a/components/metrics/metrics_log_store_unittest.cc
+++ b/components/metrics/metrics_log_store_unittest.cc
@@ -59,7 +59,7 @@
     const char* pref = log_type == MetricsLog::INITIAL_STABILITY_LOG
                            ? prefs::kMetricsInitialLogs
                            : prefs::kMetricsOngoingLogs;
-    return pref_service_.GetList(pref)->GetList().size();
+    return pref_service_.GetList(pref)->GetListDeprecated().size();
   }
 
   TestMetricsServiceClient client_;
diff --git a/components/metrics/unsent_log_store_unittest.cc b/components/metrics/unsent_log_store_unittest.cc
index 83d7aaa..c79ce10 100644
--- a/components/metrics/unsent_log_store_unittest.cc
+++ b/components/metrics/unsent_log_store_unittest.cc
@@ -139,7 +139,7 @@
 
   unsent_log_store.TrimAndPersistUnsentLogs();
   const base::Value* list_value = prefs_.GetList(kTestPrefName);
-  EXPECT_EQ(0U, list_value->GetList().size());
+  EXPECT_EQ(0U, list_value->GetListDeprecated().size());
 
   TestUnsentLogStore result_unsent_log_store(&prefs_, kLogByteLimit);
   result_unsent_log_store.LoadPersistedUnsentLogs();
diff --git a/components/mirroring/service/session_unittest.cc b/components/mirroring/service/session_unittest.cc
index 8b64a610..036baaa3d 100644
--- a/components/mirroring/service/session_unittest.cc
+++ b/components/mirroring/service/session_unittest.cc
@@ -140,7 +140,7 @@
       ASSERT_TRUE(offer);
       auto* raw_streams = offer->FindKey("supportedStreams");
       if (raw_streams) {
-        base::Value::ListView streams = raw_streams->GetList();
+        base::Value::ListView streams = raw_streams->GetListDeprecated();
         for (auto it = streams.begin(); it != streams.end(); ++it) {
           EXPECT_EQ(it->FindKey("targetDelay")->GetInt(),
                     target_playout_delay_ms_);
diff --git a/components/mirroring/service/value_util.cc b/components/mirroring/service/value_util.cc
index 63eec3d..2815cf85 100644
--- a/components/mirroring/service/value_util.cc
+++ b/components/mirroring/service/value_util.cc
@@ -66,7 +66,7 @@
     return true;
   if (!found->is_list())
     return false;
-  for (const auto& number_value : found->GetList()) {
+  for (const auto& number_value : found->GetListDeprecated()) {
     if (number_value.is_int())
       result->emplace_back(number_value.GetInt());
     else
@@ -83,7 +83,7 @@
     return true;
   if (!found->is_list())
     return false;
-  for (const auto& string_value : found->GetList()) {
+  for (const auto& string_value : found->GetListDeprecated()) {
     if (string_value.is_string())
       result->emplace_back(string_value.GetString());
     else
diff --git a/components/mirroring/service/video_capture_client.cc b/components/mirroring/service/video_capture_client.cc
index 486e652..d520080 100644
--- a/components/mirroring/service/video_capture_client.cc
+++ b/components/mirroring/service/video_capture_client.cc
@@ -282,7 +282,7 @@
         nv12_to_i420_pool_->CreateFrame(
             media::PIXEL_FORMAT_I420, frame->coded_size(),
             frame->visible_rect(), frame->natural_size(), frame->timestamp());
-    media::Status status =
+    media::EncoderStatus status =
         media::ConvertAndScaleFrame(*frame, *new_frame, nv12_to_i420_tmp_buf_);
     if (!status.is_ok()) {
       LOG(DFATAL) << "Unable to convert frame to I420.";
diff --git a/components/net_log/net_export_file_writer_unittest.cc b/components/net_log/net_export_file_writer_unittest.cc
index 1186e131..9f2f37d 100644
--- a/components/net_log/net_export_file_writer_unittest.cc
+++ b/components/net_log/net_export_file_writer_unittest.cc
@@ -801,7 +801,7 @@
   ASSERT_TRUE(root->GetList("events", &events));
 
   // Check there is at least one event as a result of the ongoing request.
-  ASSERT_GE(events->GetList().size(), 1u);
+  ASSERT_GE(events->GetListDeprecated().size(), 1u);
 
   // Check the URL in the params of the first event.
   base::DictionaryValue* event;
diff --git a/components/network_hints/renderer/renderer_dns_prefetch.cc b/components/network_hints/renderer/renderer_dns_prefetch.cc
index e65032f..cda0ef3 100644
--- a/components/network_hints/renderer/renderer_dns_prefetch.cc
+++ b/components/network_hints/renderer/renderer_dns_prefetch.cc
@@ -15,6 +15,7 @@
 #include "base/check_op.h"
 #include "base/location.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "base/time/time.h"
 #include "components/network_hints/renderer/dns_prefetch_queue.h"
 
 namespace network_hints {
diff --git a/components/no_state_prefetch/browser/prerender_history_unittest.cc b/components/no_state_prefetch/browser/prerender_history_unittest.cc
index 712e2a6..5665409 100644
--- a/components/no_state_prefetch/browser/prerender_history_unittest.cc
+++ b/components/no_state_prefetch/browser/prerender_history_unittest.cc
@@ -61,7 +61,7 @@
   entry_value = history.CopyEntriesAsValue();
   ASSERT_TRUE(entry_value.get() != nullptr);
   ASSERT_TRUE(entry_value->is_list());
-  EXPECT_TRUE(entry_value->GetList().empty());
+  EXPECT_TRUE(entry_value->GetListDeprecated().empty());
 
   // Base time used for all events.  Each event is given a time 1 millisecond
   // after that of the previous one.
@@ -77,8 +77,8 @@
   entry_value = history.CopyEntriesAsValue();
   ASSERT_TRUE(entry_value.get() != nullptr);
   ASSERT_TRUE(entry_value->is_list());
-  EXPECT_EQ(1u, entry_value->GetList().size());
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetList(), 0u, kFirstUrl,
+  EXPECT_EQ(1u, entry_value->GetListDeprecated().size());
+  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 0u, kFirstUrl,
                                kFirstFinalStatus, kFirstOrigin, "0"));
 
   // Add a second entry and make sure both first and second appear.
@@ -92,10 +92,10 @@
   entry_value = history.CopyEntriesAsValue();
   ASSERT_TRUE(entry_value.get() != nullptr);
   ASSERT_TRUE(entry_value->is_list());
-  EXPECT_EQ(2u, entry_value->GetList().size());
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetList(), 0u, kSecondUrl,
+  EXPECT_EQ(2u, entry_value->GetListDeprecated().size());
+  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 0u, kSecondUrl,
                                kSecondFinalStatus, kSecondOrigin, "1"));
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetList(), 1u, kFirstUrl,
+  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 1u, kFirstUrl,
                                kFirstFinalStatus, kFirstOrigin, "0"));
 
   // Add a third entry and make sure that the first one drops off.
@@ -109,10 +109,10 @@
   entry_value = history.CopyEntriesAsValue();
   ASSERT_TRUE(entry_value.get() != nullptr);
   ASSERT_TRUE(entry_value->is_list());
-  EXPECT_EQ(2u, entry_value->GetList().size());
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetList(), 0u, kThirdUrl,
+  EXPECT_EQ(2u, entry_value->GetListDeprecated().size());
+  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 0u, kThirdUrl,
                                kThirdFinalStatus, kThirdOrigin, "2"));
-  EXPECT_TRUE(ListEntryMatches(entry_value->GetList(), 1u, kSecondUrl,
+  EXPECT_TRUE(ListEntryMatches(entry_value->GetListDeprecated(), 1u, kSecondUrl,
                                kSecondFinalStatus, kSecondOrigin, "1"));
 
   // Make sure clearing history acts as expected.
@@ -120,7 +120,7 @@
   entry_value = history.CopyEntriesAsValue();
   ASSERT_TRUE(entry_value.get() != nullptr);
   ASSERT_TRUE(entry_value->is_list());
-  EXPECT_TRUE(entry_value->GetList().empty());
+  EXPECT_TRUE(entry_value->GetListDeprecated().empty());
 }
 
 }  // namespace
diff --git a/components/ntp_snippets/category_rankers/click_based_category_ranker.cc b/components/ntp_snippets/category_rankers/click_based_category_ranker.cc
index 08d7df6..b5875e4 100644
--- a/components/ntp_snippets/category_rankers/click_based_category_ranker.cc
+++ b/components/ntp_snippets/category_rankers/click_based_category_ranker.cc
@@ -349,11 +349,11 @@
   result_categories->clear();
   const base::Value* list =
       pref_service_->GetList(prefs::kClickBasedCategoryRankerOrderWithClicks);
-  if (!list || list->GetList().size() == 0) {
+  if (!list || list->GetListDeprecated().size() == 0) {
     return false;
   }
 
-  for (const base::Value& value : list->GetList()) {
+  for (const base::Value& value : list->GetListDeprecated()) {
     const base::DictionaryValue* dictionary;
     if (!value.GetAsDictionary(&dictionary)) {
       LOG(DFATAL) << "Failed to parse category data from prefs param "
diff --git a/components/ntp_snippets/content_suggestions_service.cc b/components/ntp_snippets/content_suggestions_service.cc
index 0fd34cb..8f91653 100644
--- a/components/ntp_snippets/content_suggestions_service.cc
+++ b/components/ntp_snippets/content_suggestions_service.cc
@@ -674,7 +674,7 @@
   DCHECK(providers_by_category_.empty());
 
   const base::Value* list = pref_service_->GetList(prefs::kDismissedCategories);
-  for (const base::Value& entry : list->GetList()) {
+  for (const base::Value& entry : list->GetListDeprecated()) {
     if (!entry.is_int()) {
       DLOG(WARNING) << "Invalid category pref value: " << entry;
       continue;
diff --git a/components/ntp_snippets/pref_util.cc b/components/ntp_snippets/pref_util.cc
index 9f269a9..e84c1b7 100644
--- a/components/ntp_snippets/pref_util.cc
+++ b/components/ntp_snippets/pref_util.cc
@@ -16,7 +16,7 @@
                                                 const std::string& pref_name) {
   std::set<std::string> dismissed_ids;
   const base::Value* list = pref_service.GetList(pref_name);
-  for (const base::Value& value : list->GetList()) {
+  for (const base::Value& value : list->GetListDeprecated()) {
     DCHECK(value.is_string())
         << "Failed to parse dismissed id from prefs param " << pref_name
         << " into string.";
diff --git a/components/ntp_snippets/remote/json_to_categories.cc b/components/ntp_snippets/remote/json_to_categories.cc
index d024ecb..7c5a76d0 100644
--- a/components/ntp_snippets/remote/json_to_categories.cc
+++ b/components/ntp_snippets/remote/json_to_categories.cc
@@ -93,7 +93,7 @@
     return false;
   }
 
-  for (const base::Value& v : categories_value->GetList()) {
+  for (const base::Value& v : categories_value->GetListDeprecated()) {
     if (!v.is_dict())
       return false;
 
diff --git a/components/ntp_snippets/remote/remote_suggestion.cc b/components/ntp_snippets/remote/remote_suggestion.cc
index 25df172..8e9be08 100644
--- a/components/ntp_snippets/remote/remote_suggestion.cc
+++ b/components/ntp_snippets/remote/remote_suggestion.cc
@@ -84,7 +84,7 @@
     return nullptr;
   }
   std::vector<std::string> parsed_ids;
-  for (const base::Value& value : ids->GetList()) {
+  for (const base::Value& value : ids->GetListDeprecated()) {
     if (!value.is_string()) {
       return nullptr;
     }
diff --git a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
index ce93c83d..bfbd93c 100644
--- a/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_provider_impl.cc
@@ -1558,7 +1558,7 @@
 
   const base::Value* list =
       pref_service_->GetList(prefs::kRemoteSuggestionCategories);
-  for (const base::Value& entry : list->GetList()) {
+  for (const base::Value& entry : list->GetListDeprecated()) {
     const base::DictionaryValue* dict = nullptr;
     if (!entry.GetAsDictionary(&dict)) {
       DLOG(WARNING) << "Invalid category pref value: " << entry;
diff --git a/components/ntp_tiles/custom_links_store.cc b/components/ntp_tiles/custom_links_store.cc
index 3d5515b..82a119b9 100644
--- a/components/ntp_tiles/custom_links_store.cc
+++ b/components/ntp_tiles/custom_links_store.cc
@@ -36,7 +36,7 @@
 
   const base::Value* stored_links = prefs_->GetList(prefs::kCustomLinksList);
 
-  for (const base::Value& link : stored_links->GetList()) {
+  for (const base::Value& link : stored_links->GetListDeprecated()) {
     const base::Value* url_value = link.FindKey(kDictionaryKeyUrl);
     const base::Value* title_value = link.FindKey(kDictionaryKeyTitle);
     const base::Value* mv_value = link.FindKey(kDictionaryKeyIsMostVisited);
diff --git a/components/ntp_tiles/most_visited_sites.cc b/components/ntp_tiles/most_visited_sites.cc
index e60c671..f3b3ca8 100644
--- a/components/ntp_tiles/most_visited_sites.cc
+++ b/components/ntp_tiles/most_visited_sites.cc
@@ -768,7 +768,7 @@
       prefs->GetList(webapps::kWebAppsMigratedPreinstalledApps);
   if (!migrated_apps)
     return false;
-  for (const auto& val : migrated_apps->GetList()) {
+  for (const auto& val : migrated_apps->GetListDeprecated()) {
     if (val.is_string() && val.GetString() == url.host())
       return true;
   }
diff --git a/components/ntp_tiles/popular_sites_impl.cc b/components/ntp_tiles/popular_sites_impl.cc
index 256e6f1..f9aa518 100644
--- a/components/ntp_tiles/popular_sites_impl.cc
+++ b/components/ntp_tiles/popular_sites_impl.cc
@@ -186,7 +186,7 @@
     const base::Value* sites_list = item_value.FindListKey("sites");
     if (!sites_list)
       continue;
-    sections[section_type] = ParseSiteList(sites_list->GetList());
+    sections[section_type] = ParseSiteList(sites_list->GetListDeprecated());
   }
   return sections;
 }
@@ -204,7 +204,7 @@
 void SetDefaultResourceForSite(size_t index,
                                int resource_id,
                                base::Value* sites) {
-  base::Value::ListView list = sites->GetList();
+  base::Value::ListView list = sites->GetListDeprecated();
   if (index >= list.size() || !list[index].is_dict())
     return;
 
@@ -269,9 +269,9 @@
       variations_(variations_service),
       url_loader_factory_(std::move(url_loader_factory)),
       is_fallback_(false),
-      sections_(
-          ParseSites(prefs->GetList(prefs::kPopularSitesJsonPref)->GetList(),
-                     prefs_->GetInteger(prefs::kPopularSitesVersionPref))) {}
+      sections_(ParseSites(
+          prefs->GetList(prefs::kPopularSitesJsonPref)->GetListDeprecated(),
+          prefs_->GetInteger(prefs::kPopularSitesVersionPref))) {}
 
 PopularSitesImpl::~PopularSitesImpl() {}
 
diff --git a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
index 33ac642..2d43720 100644
--- a/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
+++ b/components/ntp_tiles/webui/ntp_tiles_internals_message_handler.cc
@@ -98,7 +98,7 @@
     SendTiles(NTPTilesVector(), FaviconResultMap());
     return;
   }
-  DCHECK_EQ(0u, args->GetList().size());
+  DCHECK_EQ(0u, args->GetListDeprecated().size());
 
   popular_sites_json_.clear();
   most_visited_sites_ = client_->MakeMostVisitedSites();
@@ -112,8 +112,8 @@
     return;
   }
 
-  DCHECK_EQ(1u, args->GetList().size());
-  const base::Value& dict = args->GetList()[0];
+  DCHECK_EQ(1u, args->GetListDeprecated().size());
+  const base::Value& dict = args->GetListDeprecated()[0];
   DCHECK(dict.is_dict());
 
   PrefService* prefs = client_->GetPrefs();
@@ -166,7 +166,7 @@
 
 void NTPTilesInternalsMessageHandler::HandleViewPopularSitesJson(
     const base::ListValue* args) {
-  DCHECK_EQ(0u, args->GetList().size());
+  DCHECK_EQ(0u, args->GetListDeprecated().size());
   if (!most_visited_sites_ ||
       !most_visited_sites_->DoesSourceExist(ntp_tiles::TileSource::POPULAR)) {
     return;
diff --git a/components/omnibox/browser/actions/omnibox_pedal_provider.cc b/components/omnibox/browser/actions/omnibox_pedal_provider.cc
index 8594d39..26eaa10 100644
--- a/components/omnibox/browser/actions/omnibox_pedal_provider.cc
+++ b/components/omnibox/browser/actions/omnibox_pedal_provider.cc
@@ -293,7 +293,8 @@
     tokenize_characters_ = u" -";
   }
 
-  const auto& dictionary = concept_data->FindKey("dictionary")->GetList();
+  const auto& dictionary =
+      concept_data->FindKey("dictionary")->GetListDeprecated();
   dictionary_.reserve(dictionary.size());
   int token_id = 0;
   for (const auto& token_value : dictionary) {
@@ -324,7 +325,8 @@
     ignore_group_ = LoadSynonymGroupValue(*ignore_group_value);
   }
 
-  for (const auto& pedal_value : concept_data->FindKey("pedals")->GetList()) {
+  for (const auto& pedal_value :
+       concept_data->FindKey("pedals")->GetListDeprecated()) {
     DCHECK(pedal_value.is_dict());
     const int id = pedal_value.FindIntKey("id").value();
     if (!locale_is_english) {
@@ -373,7 +375,8 @@
     // back to loading from JSON to robustly handle partial presence of data.
     if (specs.empty() ||
         !OmniboxFieldTrial::IsPedalsTranslationConsoleEnabled()) {
-      for (const auto& group_value : pedal_value.FindKey("groups")->GetList()) {
+      for (const auto& group_value :
+           pedal_value.FindKey("groups")->GetListDeprecated()) {
         // Note, group JSON values are preprocessed by the data generation tool.
         pedal->AddSynonymGroup(LoadSynonymGroupValue(group_value));
       }
@@ -403,7 +406,7 @@
   DCHECK(group_value.is_dict());
   const bool required = group_value.FindKey("required")->GetBool();
   const bool single = group_value.FindKey("single")->GetBool();
-  const auto& synonyms = group_value.FindKey("synonyms")->GetList();
+  const auto& synonyms = group_value.FindKey("synonyms")->GetListDeprecated();
   OmniboxPedal::SynonymGroup synonym_group(required, single, synonyms.size());
   for (const auto& synonyms_value : synonyms) {
     DCHECK(synonyms_value.is_list());
diff --git a/components/omnibox/browser/document_provider.cc b/components/omnibox/browser/document_provider.cc
index dcf387aa..f6e6d4af 100644
--- a/components/omnibox/browser/document_provider.cc
+++ b/components/omnibox/browser/document_provider.cc
@@ -173,7 +173,7 @@
   if (!values)
     return {};
 
-  auto list = values->GetList();
+  auto list = values->GetListDeprecated();
   std::vector<const std::string*> extracted(list.size());
   std::transform(list.begin(), list.end(), extracted.begin(),
                  [field_path](const auto& value) {
@@ -702,7 +702,7 @@
   if (!results) {
     return matches;
   }
-  size_t num_results = results->GetList().size();
+  size_t num_results = results->GetListDeprecated().size();
   UMA_HISTOGRAM_COUNTS_1M("Omnibox.DocumentSuggest.ResultCount", num_results);
 
   // During development/quality iteration we may wish to defeat server scores.
@@ -733,7 +733,7 @@
   // Ensure server's suggestions are added with monotonically decreasing scores.
   int previous_score = INT_MAX;
   for (size_t i = 0; i < num_results; i++) {
-    const base::Value& result = results->GetList()[i];
+    const base::Value& result = results->GetListDeprecated()[i];
     if (!result.is_dict()) {
       return matches;
     }
diff --git a/components/omnibox/browser/search_suggestion_parser.cc b/components/omnibox/browser/search_suggestion_parser.cc
index 1846b38..1708c20 100644
--- a/components/omnibox/browser/search_suggestion_parser.cc
+++ b/components/omnibox/browser/search_suggestion_parser.cc
@@ -71,7 +71,7 @@
 
   if (subtypes_value == nullptr || !subtypes_value->is_list())
     return result;
-  auto subtypes_list = subtypes_value->GetList();
+  auto subtypes_list = subtypes_value->GetListDeprecated();
 
   if (!subtypes_list.empty() && subtypes_list.size() != expected_size) {
     LOG(WARNING) << "The length of reported subtypes (" << subtypes_list.size()
@@ -494,7 +494,8 @@
 
     relevances = extras.FindListKey("google:suggestrelevance");
     // Discard this list if its size does not match that of the suggestions.
-    if (relevances && relevances->GetList().size() != results_list.size()) {
+    if (relevances &&
+        relevances->GetListDeprecated().size() != results_list.size()) {
       relevances = nullptr;
     }
 
@@ -513,7 +514,7 @@
     const base::Value* experiment_stats =
         extras.FindListKey("google:experimentstats");
     if (experiment_stats) {
-      for (const auto& experiment_stat : experiment_stats->GetList())
+      for (const auto& experiment_stat : experiment_stats->GetListDeprecated())
         results->experiment_stats.push_back(experiment_stat.Clone());
     }
 
@@ -531,7 +532,7 @@
 
       const base::Value* hidden_group_ids = header_texts->FindListKey("h");
       if (hidden_group_ids) {
-        for (const auto& value : hidden_group_ids->GetList()) {
+        for (const auto& value : hidden_group_ids->GetListDeprecated()) {
           if (value.is_int())
             results->hidden_group_ids.emplace_back(value.GetInt());
         }
@@ -547,7 +548,7 @@
     suggestion_details = extras.FindListKey("google:suggestdetail");
     // Discard this list if its size does not match that of the suggestions.
     if (suggestion_details &&
-        suggestion_details->GetList().size() != results_list.size()) {
+        suggestion_details->GetListDeprecated().size() != results_list.size()) {
       suggestion_details = nullptr;
     }
 
@@ -555,7 +556,8 @@
     subtype_identifiers = extras.FindListKey("google:subtypeid");
     // Discard this list if its size does not match that of the suggestions.
     if (subtype_identifiers &&
-        subtype_identifiers->GetList().size() != results_list.size()) {
+        subtype_identifiers->GetListDeprecated().size() !=
+            results_list.size()) {
       subtype_identifiers = nullptr;
     }
 
@@ -592,10 +594,10 @@
 
     // Apply valid suggested relevance scores; discard invalid lists.
     if (relevances) {
-      if (!relevances->GetList()[index].is_int()) {
+      if (!relevances->GetListDeprecated()[index].is_int()) {
         relevances = nullptr;
       } else {
-        relevance = relevances->GetList()[index].GetInt();
+        relevance = relevances->GetListDeprecated()[index].GetInt();
       }
     }
 
@@ -604,23 +606,25 @@
 
     // Legacy code: if the server sends us a single subtype ID, place it beside
     // other subtypes.
-    if (subtype_identifiers && index < subtype_identifiers->GetList().size() &&
-        subtype_identifiers->GetList()[index].is_int()) {
+    if (subtype_identifiers &&
+        index < subtype_identifiers->GetListDeprecated().size() &&
+        subtype_identifiers->GetListDeprecated()[index].is_int()) {
       subtypes[index].emplace_back(
-          subtype_identifiers->GetList()[index].GetInt());
+          subtype_identifiers->GetListDeprecated()[index].GetInt());
     }
 
-    if (suggest_types && index < suggest_types->GetList().size() &&
-        suggest_types->GetList()[index].is_string()) {
-      match_type =
-          GetAutocompleteMatchType(suggest_types->GetList()[index].GetString());
+    if (suggest_types && index < suggest_types->GetListDeprecated().size() &&
+        suggest_types->GetListDeprecated()[index].is_string()) {
+      match_type = GetAutocompleteMatchType(
+          suggest_types->GetListDeprecated()[index].GetString());
     }
 
     std::string deletion_url;
-    if (suggestion_details && index < suggestion_details->GetList().size() &&
-        suggestion_details->GetList()[index].is_dict()) {
+    if (suggestion_details &&
+        index < suggestion_details->GetListDeprecated().size() &&
+        suggestion_details->GetListDeprecated()[index].is_dict()) {
       const base::Value& suggestion_detail =
-          suggestion_details->GetList()[index];
+          suggestion_details->GetListDeprecated()[index];
       deletion_url = FindStringKeyOrEmpty(suggestion_detail, "du");
     }
 
@@ -671,9 +675,9 @@
       absl::optional<int> suggestion_group_id;
 
       if (suggestion_details &&
-          suggestion_details->GetList()[index].is_dict()) {
+          suggestion_details->GetListDeprecated()[index].is_dict()) {
         const base::Value& suggestion_detail =
-            suggestion_details->GetList()[index];
+            suggestion_details->GetListDeprecated()[index];
         match_contents =
             base::UTF8ToUTF16(FindStringKeyOrEmpty(suggestion_detail, "t"));
         if (match_contents.empty()) {
diff --git a/components/omnibox/browser/search_suggestion_parser_fuzzer.cc b/components/omnibox/browser/search_suggestion_parser_fuzzer.cc
index 37a216a..443b69c 100644
--- a/components/omnibox/browser/search_suggestion_parser_fuzzer.cc
+++ b/components/omnibox/browser/search_suggestion_parser_fuzzer.cc
@@ -38,7 +38,7 @@
     {
       // Set-up the input so downstream won't reject it.
       if (value->is_list()) {
-        base::Value::ConstListView root_list = value->GetList();
+        base::Value::ConstListView root_list = value->GetListDeprecated();
         if (!root_list.empty() && root_list[0].is_string()) {
           std::string query = root_list[0].GetString();
           input = AutocompleteInput(base::UTF8ToUTF16(query),
diff --git a/components/omnibox/browser/suggestion_answer.cc b/components/omnibox/browser/suggestion_answer.cc
index 65486e99..18cab71 100644
--- a/components/omnibox/browser/suggestion_answer.cc
+++ b/components/omnibox/browser/suggestion_answer.cc
@@ -128,12 +128,12 @@
 
   const base::Value* fields_json =
       inner_json->FindKeyOfType(kAnswerJsonText, base::Value::Type::LIST);
-  if (!fields_json || fields_json->GetList().empty()) {
+  if (!fields_json || fields_json->GetListDeprecated().empty()) {
     return false;
   }
 
   bool found_num_lines = false;
-  for (const base::Value& field_json : fields_json->GetList()) {
+  for (const base::Value& field_json : fields_json->GetListDeprecated()) {
     TextField text_field;
     if (!field_json.is_dict() ||
         !TextField::ParseTextField(field_json, &text_field)) {
@@ -314,17 +314,17 @@
 
   const base::Value* lines_json =
       answer_json.FindKeyOfType(kAnswerJsonLines, base::Value::Type::LIST);
-  if (!lines_json || lines_json->GetList().size() != 2) {
+  if (!lines_json || lines_json->GetListDeprecated().size() != 2) {
     return false;
   }
 
-  const base::Value& first_line_json = lines_json->GetList()[0];
+  const base::Value& first_line_json = lines_json->GetListDeprecated()[0];
   if (!first_line_json.is_dict() ||
       !ImageLine::ParseImageLine(first_line_json, &result->first_line_)) {
     return false;
   }
 
-  const base::Value& second_line_json = lines_json->GetList()[1];
+  const base::Value& second_line_json = lines_json->GetListDeprecated()[1];
   if (!second_line_json.is_dict() ||
       !ImageLine::ParseImageLine(second_line_json, &result->second_line_)) {
     return false;
diff --git a/components/omnibox/browser/zero_suggest_provider.cc b/components/omnibox/browser/zero_suggest_provider.cc
index 84dd003..1aa94e43 100644
--- a/components/omnibox/browser/zero_suggest_provider.cc
+++ b/components/omnibox/browser/zero_suggest_provider.cc
@@ -417,10 +417,11 @@
     // If we received an empty result list, we should update the display, as it
     // may be showing cached results that should not be shown.
     //
-    // `data->GetList()[1]` is the results list.
+    // `data->GetListDeprecated()[1]` is the results list.
     const bool non_empty_parsed_list =
-        data->is_list() && data->GetList().size() >= 2u &&
-        data->GetList()[1].is_list() && !data->GetList()[1].GetList().empty();
+        data->is_list() && data->GetListDeprecated().size() >= 2u &&
+        data->GetListDeprecated()[1].is_list() &&
+        !data->GetListDeprecated()[1].GetList().empty();
     const bool non_empty_cache = !results_.suggest_results.empty() ||
                                  !results_.navigation_results.empty();
     if (non_empty_parsed_list && non_empty_cache)
diff --git a/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc b/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
index 9c59dcf..14069a7 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
+++ b/components/optimization_guide/content/browser/page_content_annotations_model_manager.cc
@@ -52,7 +52,8 @@
 
 PageContentAnnotationsModelManager::PageContentAnnotationsModelManager(
     const std::string& application_locale,
-    OptimizationGuideModelProvider* optimization_guide_model_provider) {
+    OptimizationGuideModelProvider* optimization_guide_model_provider)
+    : optimization_guide_model_provider_(optimization_guide_model_provider) {
   for (auto opt_target :
        features::GetPageContentModelsToExecute(application_locale)) {
     if (opt_target == proto::OPTIMIZATION_TARGET_PAGE_TOPICS) {
@@ -223,6 +224,9 @@
   if (!features::PageTopicsBatchAnnotationsEnabled())
     return;
 
+  if (on_demand_page_topics_model_executor_)
+    return;
+
   on_demand_page_topics_model_executor_ =
       std::make_unique<PageTopicsModelExecutor>(
           optimization_guide_model_provider,
@@ -236,6 +240,9 @@
   if (!features::PageVisibilityBatchAnnotationsEnabled())
     return;
 
+  if (page_visibility_model_executor_)
+    return;
+
   page_visibility_model_executor_ =
       std::make_unique<PageVisibilityModelExecutor>(
           optimization_guide_model_provider,
@@ -466,21 +473,29 @@
   out_content_annotations->categories = final_categories;
 }
 
-void PageContentAnnotationsModelManager::NotifyWhenModelAvailable(
+void PageContentAnnotationsModelManager::RequestAndNotifyWhenModelAvailable(
     AnnotationType type,
     base::OnceCallback<void(bool)> callback) {
-  if (type == AnnotationType::kPageTopics &&
-      on_demand_page_topics_model_executor_) {
-    on_demand_page_topics_model_executor_->AddOnModelUpdatedCallback(
-        base::BindOnce(std::move(callback), true));
-    return;
+  if (type == AnnotationType::kPageTopics) {
+    // No-op if the executor is already setup.
+    SetUpPageTopicsV2Model(optimization_guide_model_provider_);
+
+    if (on_demand_page_topics_model_executor_) {
+      on_demand_page_topics_model_executor_->AddOnModelUpdatedCallback(
+          base::BindOnce(std::move(callback), true));
+      return;
+    }
   }
 
-  if (type == AnnotationType::kContentVisibility &&
-      page_visibility_model_executor_) {
-    page_visibility_model_executor_->AddOnModelUpdatedCallback(
-        base::BindOnce(std::move(callback), true));
-    return;
+  if (type == AnnotationType::kContentVisibility) {
+    // No-op if the executor is already setup.
+    SetUpPageVisibilityModel(optimization_guide_model_provider_);
+
+    if (page_visibility_model_executor_) {
+      page_visibility_model_executor_->AddOnModelUpdatedCallback(
+          base::BindOnce(std::move(callback), true));
+      return;
+    }
   }
 
   // TODO(crbug/1278828): Add support for page entities.
diff --git a/components/optimization_guide/content/browser/page_content_annotations_model_manager.h b/components/optimization_guide/content/browser/page_content_annotations_model_manager.h
index d32412d..dc43f85 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_model_manager.h
+++ b/components/optimization_guide/content/browser/page_content_annotations_model_manager.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_PAGE_CONTENT_ANNOTATIONS_MODEL_MANAGER_H_
 #define COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_PAGE_CONTENT_ANNOTATIONS_MODEL_MANAGER_H_
 
+#include "base/memory/raw_ptr.h"
 #include "components/history/core/browser/url_row.h"
 #include "components/optimization_guide/content/browser/page_content_annotator.h"
 #include "components/optimization_guide/core/bert_model_handler.h"
@@ -57,12 +58,13 @@
                 const std::vector<std::string>& inputs,
                 AnnotationType annotation_type) override;
 
-  // Runs |callback| with true when the model that powers |BatchAnnotate| for
-  // the given annotation type is ready to execute. If the model is ready now,
-  // the callback is run immediately. If the model will never become ready, due
-  // to feature flags for example, the callback run with false.
-  void NotifyWhenModelAvailable(AnnotationType type,
-                                base::OnceCallback<void(bool)> callback);
+  // Requests that the given model for |type| be loaded in the background and
+  // then runs |callback| with true when the model is ready to execute. If the
+  // model is ready now, the callback is run immediately. If the model file will
+  // never be available, the callback is run with false.
+  void RequestAndNotifyWhenModelAvailable(
+      AnnotationType type,
+      base::OnceCallback<void(bool)> callback);
 
   // Returns the model info associated with the given AnnotationType, if it is
   // available and loaded.
@@ -254,6 +256,9 @@
   // The current state of the running job, if any.
   JobExecutionState job_state_ = JobExecutionState::kIdle;
 
+  // The model provider, not owned.
+  raw_ptr<OptimizationGuideModelProvider> optimization_guide_model_provider_;
+
   base::WeakPtrFactory<PageContentAnnotationsModelManager> weak_ptr_factory_{
       this};
 };
diff --git a/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc b/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc
index 003f377..d95a7c0 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc
+++ b/components/optimization_guide/content/browser/page_content_annotations_model_manager_unittest.cc
@@ -173,7 +173,8 @@
   }
 
   void SetupPageTopicsV2ModelExecutor() {
-    model_manager()->SetUpPageTopicsV2Model(model_observer_tracker());
+    model_manager()->RequestAndNotifyWhenModelAvailable(
+        AnnotationType::kPageTopics, base::DoNothing());
     // If the feature flag is disabled, the executor won't have been created so
     // skip everything else.
     if (!model_manager()->on_demand_page_topics_model_executor_)
@@ -205,7 +206,8 @@
 
   void SendPageVisibilityModelToExecutor(
       const absl::optional<proto::Any>& model_metadata) {
-    model_manager()->SetUpPageVisibilityModel(model_observer_tracker());
+    model_manager()->RequestAndNotifyWhenModelAvailable(
+        AnnotationType::kContentVisibility, base::DoNothing());
     // If the feature flag is disabled, the executor won't have been created so
     // skip everything else.
     if (!model_manager()->page_visibility_model_executor_)
@@ -936,49 +938,24 @@
 }
 
 TEST_F(PageContentAnnotationsModelManagerTest,
-       NotifyWhenModelAvailable_NotAvailable) {
-  absl::optional<bool> topics_callback_success;
-  absl::optional<bool> visibility_callback_success;
-
-  model_manager()->NotifyWhenModelAvailable(
-      AnnotationType::kPageTopics,
-      base::BindOnce([](absl::optional<bool>* out_success,
-                        bool success) { *out_success = success; },
-                     &topics_callback_success));
-  model_manager()->NotifyWhenModelAvailable(
-      AnnotationType::kContentVisibility,
-      base::BindOnce([](absl::optional<bool>* out_success,
-                        bool success) { *out_success = success; },
-                     &visibility_callback_success));
-
-  ASSERT_TRUE(topics_callback_success);
-  ASSERT_TRUE(visibility_callback_success);
-  EXPECT_FALSE(*topics_callback_success);
-  EXPECT_FALSE(*visibility_callback_success);
-}
-
-TEST_F(PageContentAnnotationsModelManagerTest,
        NotifyWhenModelAvailable_TopicsOnly) {
   SetupPageTopicsV2ModelExecutor();
 
-  absl::optional<bool> topics_callback_success;
-  absl::optional<bool> visibility_callback_success;
+  base::RunLoop topics_run_loop;
+  bool topics_callback_success = false;
 
-  model_manager()->NotifyWhenModelAvailable(
+  model_manager()->RequestAndNotifyWhenModelAvailable(
       AnnotationType::kPageTopics,
-      base::BindOnce([](absl::optional<bool>* out_success,
-                        bool success) { *out_success = success; },
-                     &topics_callback_success));
-  model_manager()->NotifyWhenModelAvailable(
-      AnnotationType::kContentVisibility,
-      base::BindOnce([](absl::optional<bool>* out_success,
-                        bool success) { *out_success = success; },
-                     &visibility_callback_success));
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool* out_success, bool success) {
+            *out_success = success;
+            run_loop->Quit();
+          },
+          &topics_run_loop, &topics_callback_success));
 
-  ASSERT_TRUE(topics_callback_success);
-  ASSERT_TRUE(visibility_callback_success);
-  EXPECT_TRUE(*topics_callback_success);
-  EXPECT_FALSE(*visibility_callback_success);
+  topics_run_loop.Run();
+
+  EXPECT_TRUE(topics_callback_success);
 }
 
 TEST_F(PageContentAnnotationsModelManagerTest,
@@ -994,24 +971,64 @@
   page_topics_model_metadata.SerializeToString(any_metadata.mutable_value());
   SendPageVisibilityModelToExecutor(any_metadata);
 
-  absl::optional<bool> topics_callback_success;
-  absl::optional<bool> visibility_callback_success;
+  base::RunLoop visibility_run_loop;
+  bool visibility_callback_success = false;
 
-  model_manager()->NotifyWhenModelAvailable(
-      AnnotationType::kPageTopics,
-      base::BindOnce([](absl::optional<bool>* out_success,
-                        bool success) { *out_success = success; },
-                     &topics_callback_success));
-  model_manager()->NotifyWhenModelAvailable(
+  model_manager()->RequestAndNotifyWhenModelAvailable(
       AnnotationType::kContentVisibility,
-      base::BindOnce([](absl::optional<bool>* out_success,
-                        bool success) { *out_success = success; },
-                     &visibility_callback_success));
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool* out_success, bool success) {
+            *out_success = success;
+            run_loop->Quit();
+          },
+          &visibility_run_loop, &visibility_callback_success));
 
-  ASSERT_TRUE(topics_callback_success);
-  ASSERT_TRUE(visibility_callback_success);
-  EXPECT_FALSE(*topics_callback_success);
-  EXPECT_TRUE(*visibility_callback_success);
+  visibility_run_loop.Run();
+
+  EXPECT_TRUE(visibility_callback_success);
+}
+
+TEST_F(PageContentAnnotationsModelManagerTest, NotifyWhenModelAvailable_Both) {
+  proto::Any any_metadata;
+  any_metadata.set_type_url(
+      "type.googleapis.com/com.foo.PageTopicsModelMetadata");
+  proto::PageTopicsModelMetadata page_topics_model_metadata;
+  page_topics_model_metadata.set_version(123);
+  page_topics_model_metadata.mutable_output_postprocessing_params()
+      ->mutable_visibility_params()
+      ->set_category_name("DO NOT EVALUATE");
+  page_topics_model_metadata.SerializeToString(any_metadata.mutable_value());
+  SendPageVisibilityModelToExecutor(any_metadata);
+
+  SetupPageTopicsV2ModelExecutor();
+
+  base::RunLoop topics_run_loop;
+  base::RunLoop visibility_run_loop;
+  bool topics_callback_success = false;
+  bool visibility_callback_success = false;
+
+  model_manager()->RequestAndNotifyWhenModelAvailable(
+      AnnotationType::kPageTopics,
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool* out_success, bool success) {
+            *out_success = success;
+            run_loop->Quit();
+          },
+          &topics_run_loop, &topics_callback_success));
+  model_manager()->RequestAndNotifyWhenModelAvailable(
+      AnnotationType::kContentVisibility,
+      base::BindOnce(
+          [](base::RunLoop* run_loop, bool* out_success, bool success) {
+            *out_success = success;
+            run_loop->Quit();
+          },
+          &visibility_run_loop, &visibility_callback_success));
+
+  topics_run_loop.Run();
+  visibility_run_loop.Run();
+
+  EXPECT_TRUE(topics_callback_success);
+  EXPECT_TRUE(visibility_callback_success);
 }
 
 class PageContentAnnotationsModelManagerEntitiesOnlyTest
diff --git a/components/optimization_guide/content/browser/page_content_annotations_service.cc b/components/optimization_guide/content/browser/page_content_annotations_service.cc
index d3ba5ba6..9350d2d 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_service.cc
+++ b/components/optimization_guide/content/browser/page_content_annotations_service.cc
@@ -248,12 +248,12 @@
 #endif
 }
 
-void PageContentAnnotationsService::NotifyWhenModelAvailable(
+void PageContentAnnotationsService::RequestAndNotifyWhenModelAvailable(
     AnnotationType type,
     base::OnceCallback<void(bool)> callback) {
 #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
   DCHECK(model_manager_);
-  model_manager_->NotifyWhenModelAvailable(type, std::move(callback));
+  model_manager_->RequestAndNotifyWhenModelAvailable(type, std::move(callback));
 #else
   std::move(callback).Run(false);
 #endif
diff --git a/components/optimization_guide/content/browser/page_content_annotations_service.h b/components/optimization_guide/content/browser/page_content_annotations_service.h
index 278a005..32dbca92 100644
--- a/components/optimization_guide/content/browser/page_content_annotations_service.h
+++ b/components/optimization_guide/content/browser/page_content_annotations_service.h
@@ -93,31 +93,34 @@
       const PageContentAnnotationsService&) = delete;
 
   // This is the main entry point for page content annotations by external
-  // callers.
+  // callers. Callers must call |RequestAndNotifyWhenModelAvailable| as close to
+  // session start as possible to allow time for the model file to be
+  // downloaded.
   void BatchAnnotate(BatchAnnotationCallback callback,
                      const std::vector<std::string>& inputs,
                      AnnotationType annotation_type);
 
-  // Overrides the PageContentAnnotator for testing. See
-  // test_page_content_annotator.h for an implementation designed for testing.
-  void OverridePageContentAnnotatorForTesting(PageContentAnnotator* annotator);
+  // Requests that the given model for |type| be loaded in the background and
+  // then runs |callback| with true when the model is ready to execute. If the
+  // model is ready now, the callback is run immediately. If the model file will
+  // never be available, the callback is run with false.
+  void RequestAndNotifyWhenModelAvailable(
+      AnnotationType type,
+      base::OnceCallback<void(bool)> callback);
 
   // Returns the model info for the given annotation type, if the model file is
   // available.
   absl::optional<ModelInfo> GetModelInfoForType(AnnotationType type) const;
 
-  // Runs |callback| with true when the model that powers |BatchAnnotate| for
-  // the given annotation type is ready to execute. If the model is ready now,
-  // the callback is run immediately. If the model file will never be available,
-  // the callback is run with false.
-  void NotifyWhenModelAvailable(AnnotationType type,
-                                base::OnceCallback<void(bool)> callback);
-
   // EntityMetadataProvider:
   void GetMetadataForEntityId(
       const std::string& entity_id,
       EntityMetadataRetrievedCallback callback) override;
 
+  // Overrides the PageContentAnnotator for testing. See
+  // test_page_content_annotator.h for an implementation designed for testing.
+  void OverridePageContentAnnotatorForTesting(PageContentAnnotator* annotator);
+
  private:
 #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
   // Callback invoked when |visit| has been annotated.
diff --git a/components/optimization_guide/core/optimization_guide_switches.cc b/components/optimization_guide/core/optimization_guide_switches.cc
index 3145c7a..e2026ddc 100644
--- a/components/optimization_guide/core/optimization_guide_switches.cc
+++ b/components/optimization_guide/core/optimization_guide_switches.cc
@@ -27,12 +27,6 @@
 // hosts.
 const char kFetchHintsOverride[] = "optimization-guide-fetch-hints-override";
 
-// Overrides scheduling and time delays for fetching prediction models and host
-// model features. This causes a prediction model and host model features fetch
-// immediately on start up.
-const char kFetchModelsAndHostModelFeaturesOverrideTimer[] =
-    "optimization-guide-fetch-models-and-features-override";
-
 // Overrides the hints fetch scheduling and delay, causing a hints fetch
 // immediately on start up using the TopHostProvider. This is meant for testing.
 const char kFetchHintsOverrideTimer[] =
@@ -142,11 +136,6 @@
       kFetchHintsOverrideTimer);
 }
 
-bool ShouldOverrideFetchModelsAndFeaturesTimer() {
-  return base::CommandLine::ForCurrentProcess()->HasSwitch(
-      kFetchModelsAndHostModelFeaturesOverrideTimer);
-}
-
 std::unique_ptr<optimization_guide::proto::Configuration>
 ParseComponentConfigFromCommandLine() {
   base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
diff --git a/components/optimization_guide/core/optimization_guide_switches.h b/components/optimization_guide/core/optimization_guide_switches.h
index 604fa18..c7e80ce 100644
--- a/components/optimization_guide/core/optimization_guide_switches.h
+++ b/components/optimization_guide/core/optimization_guide_switches.h
@@ -22,7 +22,6 @@
 extern const char kHintsProtoOverride[];
 extern const char kFetchHintsOverride[];
 extern const char kFetchHintsOverrideTimer[];
-extern const char kFetchModelsAndHostModelFeaturesOverrideTimer[];
 extern const char kOptimizationGuideServiceGetHintsURL[];
 extern const char kOptimizationGuideServiceGetModelsURL[];
 extern const char kOptimizationGuideServiceAPIKey[];
@@ -60,10 +59,6 @@
 // Whether the hints fetcher timer should be overridden.
 bool ShouldOverrideFetchHintsTimer();
 
-// Whether the prediction model and host model features fetcher timer should be
-// overridden.
-bool ShouldOverrideFetchModelsAndFeaturesTimer();
-
 // Attempts to parse a base64 encoded Optimization Guide Configuration proto
 // from the command line. If no proto is given or if it is encoded incorrectly,
 // nullptr is returned.
diff --git a/components/optimization_guide/core/prediction_model_fetcher_impl.cc b/components/optimization_guide/core/prediction_model_fetcher_impl.cc
index 79282f1..1aba12c 100644
--- a/components/optimization_guide/core/prediction_model_fetcher_impl.cc
+++ b/components/optimization_guide/core/prediction_model_fetcher_impl.cc
@@ -22,7 +22,6 @@
 #include "net/http/http_response_headers.h"
 #include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
-#include "services/network/public/cpp/network_connection_tracker.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/cpp/simple_url_loader.h"
@@ -32,16 +31,14 @@
 
 PredictionModelFetcherImpl::PredictionModelFetcherImpl(
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    const GURL& optimization_guide_service_get_models_url,
-    network::NetworkConnectionTracker* network_connection_tracker)
+    const GURL& optimization_guide_service_get_models_url)
     : optimization_guide_service_get_models_url_(
           net::AppendOrReplaceQueryParameter(
               optimization_guide_service_get_models_url,
               "key",
               optimization_guide::features::
                   GetOptimizationGuideServiceAPIKey())),
-      url_loader_factory_(url_loader_factory),
-      network_connection_tracker_(network_connection_tracker) {
+      url_loader_factory_(url_loader_factory) {
   CHECK(optimization_guide_service_get_models_url_.SchemeIs(url::kHttpsScheme));
 }
 
@@ -55,11 +52,6 @@
     ModelsFetchedCallback models_fetched_callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (network_connection_tracker_->IsOffline()) {
-    std::move(models_fetched_callback).Run(absl::nullopt);
-    return false;
-  }
-
   if (url_loader_)
     return false;
 
diff --git a/components/optimization_guide/core/prediction_model_fetcher_impl.h b/components/optimization_guide/core/prediction_model_fetcher_impl.h
index 2d2557e8..969af656 100644
--- a/components/optimization_guide/core/prediction_model_fetcher_impl.h
+++ b/components/optimization_guide/core/prediction_model_fetcher_impl.h
@@ -19,7 +19,6 @@
 #include "url/gurl.h"
 
 namespace network {
-class NetworkConnectionTracker;
 class SharedURLLoaderFactory;
 class SimpleURLLoader;
 }  // namespace network
@@ -34,8 +33,7 @@
  public:
   PredictionModelFetcherImpl(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      const GURL& optimization_guide_service_get_models_url,
-      network::NetworkConnectionTracker* network_connection_tracker);
+      const GURL& optimization_guide_service_get_models_url);
 
   PredictionModelFetcherImpl(const PredictionModelFetcherImpl&) = delete;
   PredictionModelFetcherImpl& operator=(const PredictionModelFetcherImpl&) =
@@ -82,10 +80,6 @@
   // Used for creating a |url_loader_| when needed for request hints.
   scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
-  // Listens to changes around the network connection. Not owned. Guaranteed to
-  // outlive |this|.
-  raw_ptr<network::NetworkConnectionTracker> network_connection_tracker_;
-
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
diff --git a/components/optimization_guide/core/prediction_model_fetcher_unittest.cc b/components/optimization_guide/core/prediction_model_fetcher_unittest.cc
index 1b59d31..a4ca4b8 100644
--- a/components/optimization_guide/core/prediction_model_fetcher_unittest.cc
+++ b/components/optimization_guide/core/prediction_model_fetcher_unittest.cc
@@ -21,7 +21,6 @@
 #include "net/base/url_util.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
-#include "services/network/test/test_network_connection_tracker.h"
 #include "services/network/test/test_url_loader_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -37,11 +36,9 @@
       : task_environment_(base::test::TaskEnvironment::MainThreadType::UI),
         shared_url_loader_factory_(
             base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
-                &test_url_loader_factory_)),
-        network_tracker_(network::TestNetworkConnectionTracker::GetInstance()) {
+                &test_url_loader_factory_)) {
     prediction_model_fetcher_ = std::make_unique<PredictionModelFetcherImpl>(
-        shared_url_loader_factory_, GURL(optimization_guide_service_url),
-        network_tracker_);
+        shared_url_loader_factory_, GURL(optimization_guide_service_url));
   }
 
   PredictionModelFetcherTest(const PredictionModelFetcherTest&) = delete;
@@ -58,16 +55,6 @@
 
   bool models_fetched() { return models_fetched_; }
 
-  void SetConnectionOffline() {
-    network_tracker_->SetConnectionType(
-        network::mojom::ConnectionType::CONNECTION_NONE);
-  }
-
-  void SetConnectionOnline() {
-    network_tracker_->SetConnectionType(
-        network::mojom::ConnectionType::CONNECTION_4G);
-  }
-
  protected:
   bool FetchModels(const std::vector<proto::ModelInfo> models_request_info,
                    const std::vector<proto::FieldTrial>& active_field_trials,
@@ -116,7 +103,6 @@
 
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
   network::TestURLLoaderFactory test_url_loader_factory_;
-  raw_ptr<network::TestNetworkConnectionTracker> network_tracker_;
 };
 
 TEST_F(PredictionModelFetcherTest, FetchOptimizationGuideServiceModels) {
@@ -173,26 +159,6 @@
   EXPECT_FALSE(models_fetched());
 }
 
-TEST_F(PredictionModelFetcherTest, FetchAttemptWhenNetworkOffline) {
-  SetConnectionOffline();
-  std::string response_content;
-  proto::ModelInfo model_info;
-  model_info.set_optimization_target(
-      proto::OptimizationTarget::OPTIMIZATION_TARGET_PAINFUL_PAGE_LOAD);
-  EXPECT_FALSE(FetchModels({model_info}, /*active_field_trials=*/{},
-                           proto::RequestContext::CONTEXT_BATCH_UPDATE_MODELS,
-                           "en-US"));
-  EXPECT_FALSE(models_fetched());
-
-  SetConnectionOnline();
-  EXPECT_TRUE(FetchModels({model_info}, /*active_field_trials=*/{},
-                          proto::RequestContext::CONTEXT_BATCH_UPDATE_MODELS,
-                          "en-US"));
-  VerifyHasPendingFetchRequests();
-  EXPECT_TRUE(SimulateResponse(response_content, net::HTTP_OK));
-  EXPECT_TRUE(models_fetched());
-}
-
 TEST_F(PredictionModelFetcherTest, EmptyModelInfo) {
   base::HistogramTester histogram_tester;
   std::string response_content;
diff --git a/components/password_manager/content/browser/content_password_manager_driver.cc b/components/password_manager/content/browser/content_password_manager_driver.cc
index 182d2eb..9cbbc3b 100644
--- a/components/password_manager/content/browser/content_password_manager_driver.cc
+++ b/components/password_manager/content/browser/content_password_manager_driver.cc
@@ -408,11 +408,6 @@
   if (!password_manager::bad_message::CheckFrameNotPrerendering(
           render_frame_host_))
     return;
-  // Despite the name, this method is only called on password fields.
-  // (See PasswordAutofillAgent::MaybeCheckSafeBrowsingReputation())
-  if (client_->GetMetricsRecorder()) {
-    client_->GetMetricsRecorder()->RecordUserFocusedPasswordField();
-  }
 #if defined(ON_FOCUS_PING_ENABLED)
   client_->CheckSafeBrowsingReputation(form_action, frame_url);
 #endif
diff --git a/components/password_manager/core/browser/hash_password_manager.cc b/components/password_manager/core/browser/hash_password_manager.cc
index 19aa516..1cd60391 100644
--- a/components/password_manager/core/browser/hash_password_manager.cc
+++ b/components/password_manager/core/browser/hash_password_manager.cc
@@ -136,7 +136,7 @@
   // unchanged, no need to save password hash again. Instead we update the last
   // sign in timestamp.
   ListPrefUpdate update(prefs_, prefs::kPasswordHashDataList);
-  for (base::Value& password_hash_data : update.Get()->GetList()) {
+  for (base::Value& password_hash_data : update.Get()->GetListDeprecated()) {
     if (AreUsernamesSame(
             GetAndDecryptField(password_hash_data, kUsernameFieldKey),
             IsGaiaPassword(password_hash_data), username, is_gaia_password)) {
@@ -224,7 +224,7 @@
 
   const base::Value* hash_list = prefs_->GetList(prefs::kPasswordHashDataList);
 
-  for (const base::Value& entry : hash_list->GetList()) {
+  for (const base::Value& entry : hash_list->GetListDeprecated()) {
     absl::optional<PasswordHashData> password_hash_data =
         ConvertToPasswordHashData(entry);
     if (password_hash_data)
@@ -242,7 +242,7 @@
   }
 
   for (const base::Value& entry :
-       prefs_->GetList(prefs::kPasswordHashDataList)->GetList()) {
+       prefs_->GetList(prefs::kPasswordHashDataList)->GetListDeprecated()) {
     if (AreUsernamesSame(GetAndDecryptField(entry, kUsernameFieldKey),
                          IsGaiaPassword(entry), username, is_gaia_password)) {
       return ConvertToPasswordHashData(entry);
@@ -260,7 +260,7 @@
   }
 
   for (const base::Value& entry :
-       prefs_->GetList(prefs::kPasswordHashDataList)->GetList()) {
+       prefs_->GetList(prefs::kPasswordHashDataList)->GetListDeprecated()) {
     if (AreUsernamesSame(GetAndDecryptField(entry, kUsernameFieldKey),
                          IsGaiaPassword(entry), username, is_gaia_password)) {
       return true;
@@ -321,10 +321,10 @@
   });
 
   if (num_erased == 0 &&
-      update->GetList().size() >= kMaxPasswordHashDataDictSize) {
+      update->GetListDeprecated().size() >= kMaxPasswordHashDataDictSize) {
     // Erase the oldest sign-in password hash data.
     update->EraseListIter(std::min_element(
-        update->GetList().begin(), update->GetList().end(),
+        update->GetListDeprecated().begin(), update->GetListDeprecated().end(),
         [](const auto& lhs, const auto& rhs) {
           return lhs.FindKey(kLastSignInTimeFieldKey)->GetDouble() <
                  rhs.FindKey(kLastSignInTimeFieldKey)->GetDouble();
diff --git a/components/password_manager/core/browser/hash_password_manager_unittest.cc b/components/password_manager/core/browser/hash_password_manager_unittest.cc
index 8c351e4..ee468c6 100644
--- a/components/password_manager/core/browser/hash_password_manager_unittest.cc
+++ b/components/password_manager/core/browser/hash_password_manager_unittest.cc
@@ -90,7 +90,9 @@
   hash_password_manager.SavePasswordHash(canonical_username, password,
                                          /*is_gaia_password=*/true);
   ASSERT_TRUE(prefs_.HasPrefPath(prefs::kPasswordHashDataList));
-  EXPECT_EQ(1u, prefs_.GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(
+      1u,
+      prefs_.GetList(prefs::kPasswordHashDataList)->GetListDeprecated().size());
   EXPECT_EQ(
       canonical_username,
       hash_password_manager
@@ -108,7 +110,9 @@
       hash_password_manager.RetrievePasswordHash(username,
                                                  /*is_gaia_password=*/true);
   EXPECT_EQ(current_password_hash_data->hash, existing_password_data->hash);
-  EXPECT_EQ(1u, prefs_.GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(
+      1u,
+      prefs_.GetList(prefs::kPasswordHashDataList)->GetListDeprecated().size());
   EXPECT_EQ(canonical_username,
             hash_password_manager
                 .RetrievePasswordHash(username, /*is_gaia_password=*/true)
@@ -120,7 +124,9 @@
                 .RetrievePasswordHash(gmail_prefix,
                                       /*is_gaia_password=*/true)
                 ->hash);
-  EXPECT_EQ(1u, prefs_.GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(
+      1u,
+      prefs_.GetList(prefs::kPasswordHashDataList)->GetListDeprecated().size());
   EXPECT_EQ(canonical_username,
             hash_password_manager
                 .RetrievePasswordHash(gmail_prefix, /*is_gaia_password=*/true)
@@ -130,7 +136,9 @@
   // full gmail user name.
   hash_password_manager.SavePasswordHash("user.name", password,
                                          /*is_gaia_password=*/true);
-  EXPECT_EQ(2u, prefs_.GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(
+      2u,
+      prefs_.GetList(prefs::kPasswordHashDataList)->GetListDeprecated().size());
   EXPECT_EQ("username@gmail.com",
             hash_password_manager
                 .RetrievePasswordHash("user.name", /*is_gaia_password=*/true)
diff --git a/components/password_manager/core/browser/password_manager_metrics_recorder.cc b/components/password_manager/core/browser/password_manager_metrics_recorder.cc
index dec7702..b07d7eb 100644
--- a/components/password_manager/core/browser/password_manager_metrics_recorder.cc
+++ b/components/password_manager/core/browser/password_manager_metrics_recorder.cc
@@ -19,12 +19,9 @@
 namespace password_manager {
 
 PasswordManagerMetricsRecorder::PasswordManagerMetricsRecorder(
-    ukm::SourceId source_id,
-    std::unique_ptr<NavigationMetricRecorderDelegate>
-        navigation_metric_recorder)
+    ukm::SourceId source_id)
     : ukm_entry_builder_(
-          std::make_unique<ukm::builders::PageWithPassword>(source_id)),
-      navigation_metric_recorder_(std::move(navigation_metric_recorder)) {}
+          std::make_unique<ukm::builders::PageWithPassword>(source_id)) {}
 
 PasswordManagerMetricsRecorder::PasswordManagerMetricsRecorder(
     PasswordManagerMetricsRecorder&& that) noexcept = default;
@@ -42,19 +39,9 @@
     PasswordManagerMetricsRecorder&& that) = default;
 
 void PasswordManagerMetricsRecorder::RecordUserModifiedPasswordField() {
-  if (!user_modified_password_field_ && navigation_metric_recorder_) {
-    navigation_metric_recorder_->OnUserModifiedPasswordFieldFirstTime();
-  }
   user_modified_password_field_ = true;
 }
 
-void PasswordManagerMetricsRecorder::RecordUserFocusedPasswordField() {
-  if (!user_focused_password_field_ && navigation_metric_recorder_) {
-    navigation_metric_recorder_->OnUserFocusedPasswordFieldFirstTime();
-  }
-  user_focused_password_field_ = true;
-}
-
 void PasswordManagerMetricsRecorder::RecordProvisionalSaveFailure(
     ProvisionalSaveFailure failure,
     const GURL& main_frame_url,
diff --git a/components/password_manager/core/browser/password_manager_metrics_recorder.h b/components/password_manager/core/browser/password_manager_metrics_recorder.h
index 91a931b..d4da077 100644
--- a/components/password_manager/core/browser/password_manager_metrics_recorder.h
+++ b/components/password_manager/core/browser/password_manager_metrics_recorder.h
@@ -78,22 +78,8 @@
     kObsoleteShowAllPasswordsWhileNoneAreSuggested = 2,
   };
 
-  // This purpose of this interface is to allow browser to record metrics
-  // about the current navigation.
-  class NavigationMetricRecorderDelegate {
-   public:
-    virtual ~NavigationMetricRecorderDelegate() = default;
-    // Called the first time the user focuses on a password field.
-    virtual void OnUserFocusedPasswordFieldFirstTime() = 0;
-    // Called the first time the user types into a password field.
-    virtual void OnUserModifiedPasswordFieldFirstTime() = 0;
-  };
-
   // Records UKM metrics and reports them on destruction.
-  PasswordManagerMetricsRecorder(
-      ukm::SourceId source_id,
-      std::unique_ptr<NavigationMetricRecorderDelegate>
-          navigation_metric_recorder);
+  explicit PasswordManagerMetricsRecorder(ukm::SourceId source_id);
 
   PasswordManagerMetricsRecorder(
       PasswordManagerMetricsRecorder&& that) noexcept;
@@ -111,9 +97,6 @@
   // Records that the user has modified a password field on a page. This may be
   // called multiple times but a single metric will be reported.
   void RecordUserModifiedPasswordField();
-  // Records that the user has focused a password field on a page. This may be
-  // called multiple times but a single metric will be reported.
-  void RecordUserFocusedPasswordField();
 
   // Log failure to provisionally save a password to in the PasswordManager to
   // UMA and the |logger|.
@@ -133,13 +116,10 @@
   std::unique_ptr<ukm::builders::PageWithPassword> ukm_entry_builder_;
 
   bool user_modified_password_field_ = false;
-  bool user_focused_password_field_ = false;
 
   // Stores the value most recently reported via RecordFormManagerAvailable.
   FormManagerAvailable form_manager_availability_ =
       FormManagerAvailable::kNotSet;
-
-  std::unique_ptr<NavigationMetricRecorderDelegate> navigation_metric_recorder_;
 };
 
 }  // namespace password_manager
diff --git a/components/password_manager/core/browser/password_manager_metrics_recorder_unittest.cc b/components/password_manager/core/browser/password_manager_metrics_recorder_unittest.cc
index eaa179a8f..17b2820 100644
--- a/components/password_manager/core/browser/password_manager_metrics_recorder_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_metrics_recorder_unittest.cc
@@ -26,7 +26,7 @@
 using UkmEntry = ukm::builders::PageWithPassword;
 
 PasswordManagerMetricsRecorder CreateMetricsRecorder() {
-  return PasswordManagerMetricsRecorder(kTestSourceId, nullptr);
+  return PasswordManagerMetricsRecorder(kTestSourceId);
 }
 
 }  // namespace
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index 3b1fefa8..0b5d5564 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -3134,7 +3134,7 @@
   base::HistogramTester histogram_tester;
   ukm::TestAutoSetUkmRecorder test_ukm_recorder;
   auto metrics_recorder =
-      std::make_unique<PasswordManagerMetricsRecorder>(1234, nullptr);
+      std::make_unique<PasswordManagerMetricsRecorder>(1234);
   EXPECT_CALL(client_, GetMetricsRecorder())
       .WillRepeatedly(Return(metrics_recorder.get()));
 
@@ -3268,7 +3268,7 @@
 
     ukm::TestAutoSetUkmRecorder test_ukm_recorder;
     auto metrics_recorder =
-        std::make_unique<PasswordManagerMetricsRecorder>(1234, nullptr);
+        std::make_unique<PasswordManagerMetricsRecorder>(1234);
     EXPECT_CALL(client_, GetMetricsRecorder())
         .WillRepeatedly(Return(metrics_recorder.get()));
 
diff --git a/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc b/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc
index 460ba671..dcac2bb 100644
--- a/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc
+++ b/components/password_manager/core/browser/password_reuse_manager_impl_unittest.cc
@@ -222,8 +222,10 @@
   // Check that no sync password reuse is found after clearing the password
   // hash.
   reuse_manager()->ClearGaiaPasswordHash("sync_username");
-  EXPECT_EQ(0u,
-            prefs().GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(0u, prefs()
+                    .GetList(prefs::kPasswordHashDataList)
+                    ->GetListDeprecated()
+                    .size());
   MockPasswordReuseDetectorConsumer mock_consumer;
   EXPECT_CALL(mock_consumer, OnReuseCheckDone(false, _, _, _, _));
   reuse_manager()->CheckReuse(input, "https://facebook.com", &mock_consumer);
@@ -249,8 +251,10 @@
   // Check that no Gaia password reuse is found after clearing all Gaia
   // password hash.
   MockPasswordReuseDetectorConsumer mock_consumer;
-  EXPECT_EQ(0u,
-            prefs().GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(0u, prefs()
+                    .GetList(prefs::kPasswordHashDataList)
+                    ->GetListDeprecated()
+                    .size());
   EXPECT_CALL(mock_consumer, OnReuseCheckDone(false, _, _, _, _));
   reuse_manager()->CheckReuse(input, "https://example.com", &mock_consumer);
   RunUntilIdle();
@@ -292,8 +296,10 @@
   // Check that no enterprise password reuse is found after clearing the
   // password hash.
   reuse_manager()->ClearAllEnterprisePasswordHash();
-  EXPECT_EQ(0u,
-            prefs().GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(0u, prefs()
+                    .GetList(prefs::kPasswordHashDataList)
+                    ->GetListDeprecated()
+                    .size());
   MockPasswordReuseDetectorConsumer mock_consumer;
   EXPECT_CALL(mock_consumer, OnReuseCheckDone(false, _, _, _, _));
   reuse_manager()->CheckReuse(input, "https://example.com", &mock_consumer);
@@ -325,15 +331,19 @@
       "username@gmail.com", /*is_gaia_password=*/true, prefs());
   ASSERT_TRUE(gmail_password_hash.has_value());
 
-  EXPECT_EQ(2u,
-            prefs().GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(2u, prefs()
+                    .GetList(prefs::kPasswordHashDataList)
+                    ->GetListDeprecated()
+                    .size());
 
   // Check that no non-gmail password reuse is found after clearing the
   // password hash.
   reuse_manager()->ClearAllNonGmailPasswordHash();
   MockPasswordReuseDetectorConsumer mock_consumer;
-  EXPECT_EQ(1u,
-            prefs().GetList(prefs::kPasswordHashDataList)->GetList().size());
+  EXPECT_EQ(1u, prefs()
+                    .GetList(prefs::kPasswordHashDataList)
+                    ->GetListDeprecated()
+                    .size());
   EXPECT_CALL(mock_consumer, OnReuseCheckDone(false, _, _, _, _));
   reuse_manager()->CheckReuse(non_sync_gaia_password, "https://example.com",
                               &mock_consumer);
diff --git a/components/password_manager/core/browser/password_scripts_fetcher_impl.cc b/components/password_manager/core/browser/password_scripts_fetcher_impl.cc
index fb1b64c7..4ad6464 100644
--- a/components/password_manager/core/browser/password_scripts_fetcher_impl.cc
+++ b/components/password_manager/core/browser/password_scripts_fetcher_impl.cc
@@ -67,7 +67,8 @@
     }
   }
 
-  for (const base::Value& domain : supported_domains_list->GetList()) {
+  for (const base::Value& domain :
+       supported_domains_list->GetListDeprecated()) {
     if (!domain.is_string()) {
       warnings.insert(ParsingResult::kInvalidJson);
       continue;
diff --git a/components/password_manager/core/browser/site_affiliation/asset_link_data.cc b/components/password_manager/core/browser/site_affiliation/asset_link_data.cc
index bc057677..1f2fac4 100644
--- a/components/password_manager/core/browser/site_affiliation/asset_link_data.cc
+++ b/components/password_manager/core/browser/site_affiliation/asset_link_data.cc
@@ -58,7 +58,7 @@
   if (!value || !value->is_list())
     return false;
   base::JSONValueConverter<Statement> converter;
-  for (const auto& item : value->GetList()) {
+  for (const auto& item : value->GetListDeprecated()) {
     Statement statement;
     if (converter.Convert(item, &statement)) {
       if (!statement.include.empty()) {
diff --git a/components/password_manager/core/browser/stub_password_manager_client.cc b/components/password_manager/core/browser/stub_password_manager_client.cc
index 4a1bf36..af829d6 100644
--- a/components/password_manager/core/browser/stub_password_manager_client.cc
+++ b/components/password_manager/core/browser/stub_password_manager_client.cc
@@ -143,7 +143,7 @@
 PasswordManagerMetricsRecorder*
 StubPasswordManagerClient::GetMetricsRecorder() {
   if (!metrics_recorder_) {
-    metrics_recorder_.emplace(GetUkmSourceId(), nullptr);
+    metrics_recorder_.emplace(GetUkmSourceId());
   }
   return base::OptionalOrNullptr(metrics_recorder_);
 }
diff --git a/components/payments/content/utility/payment_manifest_parser.cc b/components/payments/content/utility/payment_manifest_parser.cc
index f5d876c..69f6ce1 100644
--- a/components/payments/content/utility/payment_manifest_parser.cc
+++ b/components/payments/content/utility/payment_manifest_parser.cc
@@ -85,7 +85,7 @@
         base::StringPrintf("\"%s\" must be a list.", kDefaultApplications));
     return false;
   }
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
 
   size_t apps_number = list_view.size();
   if (apps_number > kMaximumNumberOfItems) {
@@ -139,7 +139,7 @@
                                  kSupportedOrigins));
     return false;
   }
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
 
   size_t supported_origins_number = list_view.size();
   if (supported_origins_number > kMaximumNumberOfSupportedOrigins) {
@@ -193,7 +193,7 @@
     return;
   }
 
-  for (const auto& icon : icons_list->GetList()) {
+  for (const auto& icon : icons_list->GetListDeprecated()) {
     if (!icon.is_dict()) {
       log.Warn(base::StringPrintf(
           "Each item in the list \"%s\" should be a dictionary.",
@@ -270,7 +270,7 @@
     return;
   }
 
-  size_t size = related_applications->GetList().size();
+  size_t size = related_applications->GetListDeprecated().size();
   if (size == 0) {
     log.Warn(base::StringPrintf(
         "Did not find any entries in \"%s\", even though \"%s\" is true.",
@@ -280,7 +280,7 @@
 
   for (size_t i = 0; i < size; ++i) {
     const base::Value& related_application_value =
-        related_applications->GetList()[i];
+        related_applications->GetListDeprecated()[i];
     if (!related_application_value.is_dict()) {
       log.Warn(
           base::StringPrintf("Element #%zu in \"%s\" should be a dictionary.",
@@ -426,7 +426,8 @@
     return false;
   }
 
-  for (const base::Value& related_application_value : list->GetList()) {
+  for (const base::Value& related_application_value :
+       list->GetListDeprecated()) {
     if (!related_application_value.is_dict()) {
       log.Error(base::StringPrintf("\"%s\" must be a list of dictionaries.",
                                    kRelatedApplications));
@@ -487,8 +488,8 @@
 
     const base::ListValue* fingerprints_list = nullptr;
     if (!related_application.GetList(kFingerprints, &fingerprints_list) ||
-        fingerprints_list->GetList().empty() ||
-        fingerprints_list->GetList().size() > kMaximumNumberOfItems) {
+        fingerprints_list->GetListDeprecated().empty() ||
+        fingerprints_list->GetListDeprecated().size() > kMaximumNumberOfItems) {
       log.Error(base::StringPrintf(
           "\"%s\" must be a non-empty list of at most %zu items.",
           kFingerprints, kMaximumNumberOfItems));
@@ -497,7 +498,7 @@
     }
 
     for (const base::Value& fingerprint_dict_value :
-         fingerprints_list->GetList()) {
+         fingerprints_list->GetListDeprecated()) {
       const base::DictionaryValue* fingerprint_dict = nullptr;
       if (fingerprint_dict_value.is_dict()) {
         fingerprint_dict =
@@ -600,8 +601,8 @@
   if (dict->GetDictionary(kPayment, &payment_dict)) {
     const base::ListValue* delegation_list = nullptr;
     if (payment_dict->GetList(kSupportedDelegations, &delegation_list)) {
-      if (delegation_list->GetList().empty() ||
-          delegation_list->GetList().size() >
+      if (delegation_list->GetListDeprecated().empty() ||
+          delegation_list->GetListDeprecated().size() >
               kMaximumNumberOfSupportedDelegations) {
         log.Error(base::StringPrintf(
             "\"%s.%s\" must be a non-empty list of at most %zu entries.",
@@ -609,7 +610,7 @@
             kMaximumNumberOfSupportedDelegations));
         return false;
       }
-      for (const auto& delegation_item : delegation_list->GetList()) {
+      for (const auto& delegation_item : delegation_list->GetListDeprecated()) {
         std::string delegation_name = delegation_item.GetString();
         if (delegation_name == "shippingAddress") {
           installation_info->supported_delegations.shipping_address = true;
diff --git a/components/payments/core/payment_details.cc b/components/payments/core/payment_details.cc
index 8fa8d27..15a51e1 100644
--- a/components/payments/core/payment_details.cc
+++ b/components/payments/core/payment_details.cc
@@ -91,7 +91,8 @@
   const base::Value* display_items_list =
       value.FindListKey(kPaymentDetailsDisplayItems);
   if (display_items_list) {
-    for (const base::Value& payment_item_dict : display_items_list->GetList()) {
+    for (const base::Value& payment_item_dict :
+         display_items_list->GetListDeprecated()) {
       PaymentItem payment_item;
       if (!payment_item.FromValue(payment_item_dict)) {
         return false;
@@ -104,7 +105,7 @@
       value.FindListKey(kPaymentDetailsShippingOptions);
   if (shipping_options_list) {
     for (const base::Value& shipping_option_dict :
-         shipping_options_list->GetList()) {
+         shipping_options_list->GetListDeprecated()) {
       PaymentShippingOption shipping_option;
       if (!shipping_option.FromValue(shipping_option_dict)) {
         return false;
@@ -116,7 +117,8 @@
   const base::Value* modifiers_list =
       value.FindListKey(kPaymentDetailsModifiers);
   if (modifiers_list) {
-    for (const base::Value& modifier_dict : modifiers_list->GetList()) {
+    for (const base::Value& modifier_dict :
+         modifiers_list->GetListDeprecated()) {
       PaymentDetailsModifier modifier;
       if (!modifier.method_data.FromValue(modifier_dict)) {
         return false;
@@ -132,7 +134,7 @@
           modifier_dict.FindListKey(kPaymentDetailsAdditionalDisplayItems);
       if (additional_display_items_list) {
         for (const base::Value& additional_display_item_dict :
-             additional_display_items_list->GetList()) {
+             additional_display_items_list->GetListDeprecated()) {
           PaymentItem additional_display_item;
           if (!additional_display_item.FromValue(
                   additional_display_item_dict)) {
diff --git a/components/payments/core/payment_details_unittest.cc b/components/payments/core/payment_details_unittest.cc
index 3cc11e6..3398c81 100644
--- a/components/payments/core/payment_details_unittest.cc
+++ b/components/payments/core/payment_details_unittest.cc
@@ -128,13 +128,13 @@
   payment_method.SetKey("total", std::move(invalid_total_dict));
   details_dict.FindKey("modifiers")->Append(std::move(payment_method));
   EXPECT_FALSE(actual.FromValue(details_dict, /*requires_total=*/false));
-  details_dict.FindKey("modifiers")->GetList()[0].RemoveKey("total");
+  details_dict.FindKey("modifiers")->GetListDeprecated()[0].RemoveKey("total");
 
   // Invalid additional_display_item in modifiers.
   base::Value additional_display_items_list(base::Value::Type::LIST);
   additional_display_items_list.Append("not a payment item");
   details_dict.FindKey("modifiers")
-      ->GetList()[0]
+      ->GetListDeprecated()[0]
       .SetKey("additionalDisplayItems",
               std::move(additional_display_items_list));
   EXPECT_FALSE(actual.FromValue(details_dict, /*requires_total=*/false));
diff --git a/components/payments/core/payment_method_data.cc b/components/payments/core/payment_method_data.cc
index f19de2c..efb777f 100644
--- a/components/payments/core/payment_method_data.cc
+++ b/components/payments/core/payment_method_data.cc
@@ -60,7 +60,7 @@
         data_dict->FindListKey(kSupportedNetworks);
     if (supported_networks_list) {
       for (const base::Value& supported_network :
-           supported_networks_list->GetList()) {
+           supported_networks_list->GetListDeprecated()) {
         if (!supported_network.is_string() ||
             !base::IsStringASCII(supported_network.GetString())) {
           return false;
diff --git a/components/payments/core/payment_method_data_unittest.cc b/components/payments/core/payment_method_data_unittest.cc
index 9f8d18b..399c5329 100644
--- a/components/payments/core/payment_method_data_unittest.cc
+++ b/components/payments/core/payment_method_data_unittest.cc
@@ -74,7 +74,9 @@
   method_data_dict.SetKey("data", std::move(data_dict));
   EXPECT_FALSE(actual.FromValue(method_data_dict));
 
-  method_data_dict.FindKey("data")->FindKey("supportedNetworks")->GetList()[0] =
+  method_data_dict.FindKey("data")
+      ->FindKey("supportedNetworks")
+      ->GetListDeprecated()[0] =
       base::Value("\xD0\xA2\xD0\xB5\xD1\x81\xD1\x82");
   EXPECT_FALSE(actual.FromValue(method_data_dict));
 }
diff --git a/components/performance_manager/graph/graph_impl_unittest.cc b/components/performance_manager/graph/graph_impl_unittest.cc
index 75f98dd..80caab7 100644
--- a/components/performance_manager/graph/graph_impl_unittest.cc
+++ b/components/performance_manager/graph/graph_impl_unittest.cc
@@ -252,7 +252,7 @@
   const base::Value* v = descr.FindListKey(key);
   ASSERT_NE(nullptr, v);
 
-  const auto list = v->GetList();
+  const auto list = v->GetListDeprecated();
   ASSERT_EQ(2u, list.size());
   ASSERT_EQ(list[0], base::Value(s1));
   ASSERT_EQ(list[1], base::Value(s2));
diff --git a/components/permissions/contexts/bluetooth_chooser_context.cc b/components/permissions/contexts/bluetooth_chooser_context.cc
index f8a83989..f09dc36 100644
--- a/components/permissions/contexts/bluetooth_chooser_context.cc
+++ b/components/permissions/contexts/bluetooth_chooser_context.cc
@@ -289,7 +289,8 @@
   if (!manufacturer_data_list)
     return false;
 
-  for (const auto& manufacturer_data : manufacturer_data_list->GetList()) {
+  for (const auto& manufacturer_data :
+       manufacturer_data_list->GetListDeprecated()) {
     if (manufacturer_code == manufacturer_data.GetInt())
       return true;
   }
diff --git a/components/permissions/object_permission_context_base.cc b/components/permissions/object_permission_context_base.cc
index e034fe8..6a9262d 100644
--- a/components/permissions/object_permission_context_base.cc
+++ b/components/permissions/object_permission_context_base.cc
@@ -319,7 +319,7 @@
     if (!objects)
       continue;
 
-    for (auto& object : objects->GetList()) {
+    for (auto& object : objects->GetListDeprecated()) {
       if (!IsValidObject(object)) {
         continue;
       }
diff --git a/components/permissions/permission_actions_history.cc b/components/permissions/permission_actions_history.cc
index bcb2cac..ae5be88 100644
--- a/components/permissions/permission_actions_history.cc
+++ b/components/permissions/permission_actions_history.cc
@@ -150,7 +150,7 @@
 
   std::vector<Entry> matching_actions;
 
-  for (const auto& entry : permission_actions->GetList()) {
+  for (const auto& entry : permission_actions->GetListDeprecated()) {
     const absl::optional<base::Time> timestamp =
         base::ValueToTime(entry.FindKey(kPermissionActionEntryTimestampKey));
 
diff --git a/components/permissions/prediction_service/prediction_common.cc b/components/permissions/prediction_service/prediction_common.cc
index 944312f7..fe7c578 100644
--- a/components/permissions/prediction_service/prediction_common.cc
+++ b/components/permissions/prediction_service/prediction_common.cc
@@ -235,13 +235,13 @@
     return message;
 
   auto* prediction_list = parsed_message->FindListKey(kPrediction);
-  if (!prediction_list || prediction_list->GetList().empty() ||
-      !prediction_list->GetList()[0].is_dict()) {
+  if (!prediction_list || prediction_list->GetListDeprecated().empty() ||
+      !prediction_list->GetListDeprecated()[0].is_dict()) {
     return message;
   }
 
   auto* likelihood_dict =
-      prediction_list->GetList()[0].FindDictKey(kGrantLikelihood);
+      prediction_list->GetListDeprecated()[0].FindDictKey(kGrantLikelihood);
   if (!likelihood_dict)
     return message;
 
diff --git a/components/policy/core/browser/configuration_policy_handler.cc b/components/policy/core/browser/configuration_policy_handler.cc
index 4430fb7..aad4ed2 100644
--- a/components/policy/core/browser/configuration_policy_handler.cc
+++ b/components/policy/core/browser/configuration_policy_handler.cc
@@ -119,7 +119,7 @@
     return true;
 
   // Filter the list, rejecting any invalid strings.
-  base::Value::ConstListView list = value->GetList();
+  base::Value::ConstListView list = value->GetListDeprecated();
   if (filtered_list)
     *filtered_list = base::Value(base::Value::Type::LIST);
   for (size_t list_index = 0; list_index < list.size(); ++list_index) {
@@ -251,7 +251,7 @@
   }
 
   int index = -1;
-  for (const auto& entry : input->GetList()) {
+  for (const auto& entry : input->GetListDeprecated()) {
     ++index;
     if (!entry.is_string()) {
       if (errors) {
@@ -536,7 +536,7 @@
 
   // If that succeeds, validate all the list items are strings and validate
   // the JSON inside the strings.
-  base::Value::ConstListView list = root_value->GetList();
+  base::Value::ConstListView list = root_value->GetListDeprecated();
   bool json_error_seen = false;
 
   for (size_t index = 0; index < list.size(); ++index) {
diff --git a/components/policy/core/browser/policy_pref_mapping_test.cc b/components/policy/core/browser/policy_pref_mapping_test.cc
index 352ea028..a212bb2 100644
--- a/components/policy/core/browser/policy_pref_mapping_test.cc
+++ b/components/policy/core/browser/policy_pref_mapping_test.cc
@@ -223,7 +223,8 @@
     const base::Value* required_preprocessor_macros_value =
         mapping.FindListKey("required_preprocessor_macros");
     if (required_preprocessor_macros_value) {
-      for (const auto& macro : required_preprocessor_macros_value->GetList())
+      for (const auto& macro :
+           required_preprocessor_macros_value->GetListDeprecated())
         required_preprocessor_macros_.push_back(macro.GetString());
     }
   }
@@ -299,7 +300,7 @@
 
     const base::Value* os_list = test_case.FindListKey("os");
     if (os_list) {
-      for (const auto& os : os_list->GetList()) {
+      for (const auto& os : os_list->GetListDeprecated()) {
         if (os.is_string())
           supported_os_.push_back(os.GetString());
       }
@@ -308,7 +309,8 @@
     const base::Value* policy_pref_mapping_tests =
         test_case.FindListKey("policy_pref_mapping_tests");
     if (policy_pref_mapping_tests) {
-      for (const auto& mapping : policy_pref_mapping_tests->GetList()) {
+      for (const auto& mapping :
+           policy_pref_mapping_tests->GetListDeprecated()) {
         if (mapping.is_dict()) {
           policy_pref_mapping_tests_.push_back(
               std::make_unique<PolicyPrefMappingTest>(mapping));
diff --git a/components/policy/core/browser/url_allowlist_policy_handler.cc b/components/policy/core/browser/url_allowlist_policy_handler.cc
index 7de0bf33..79b3153 100644
--- a/components/policy/core/browser/url_allowlist_policy_handler.cc
+++ b/components/policy/core/browser/url_allowlist_policy_handler.cc
@@ -42,7 +42,7 @@
 
   // Filters more than |policy::kMaxUrlFiltersPerPolicy| are ignored, add a
   // warning message.
-  if (url_allowlist->GetList().size() > kMaxUrlFiltersPerPolicy) {
+  if (url_allowlist->GetListDeprecated().size() > kMaxUrlFiltersPerPolicy) {
     errors->AddError(policy_name(),
                      IDS_POLICY_URL_ALLOW_BLOCK_LIST_MAX_FILTERS_LIMIT_WARNING,
                      base::NumberToString(kMaxUrlFiltersPerPolicy));
@@ -51,7 +51,7 @@
   bool type_error = false;
   std::string policy;
   std::vector<std::string> invalid_policies;
-  for (const auto& policy_iter : url_allowlist->GetList()) {
+  for (const auto& policy_iter : url_allowlist->GetListDeprecated()) {
     if (!policy_iter.is_string()) {
       type_error = true;
       continue;
@@ -83,7 +83,7 @@
   }
 
   std::vector<base::Value> filtered_url_allowlist;
-  for (const auto& entry : url_allowlist->GetList()) {
+  for (const auto& entry : url_allowlist->GetListDeprecated()) {
     if (entry.is_string())
       filtered_url_allowlist.push_back(entry.Clone());
   }
diff --git a/components/policy/core/browser/url_allowlist_policy_handler_unittest.cc b/components/policy/core/browser/url_allowlist_policy_handler_unittest.cc
index beb82e5..36657a6 100644
--- a/components/policy/core/browser/url_allowlist_policy_handler_unittest.cc
+++ b/components/policy/core/browser/url_allowlist_policy_handler_unittest.cc
@@ -87,7 +87,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlAllowlist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(0U, out->GetList().size());
+  EXPECT_EQ(0U, out->GetListDeprecated().size());
 }
 
 TEST_F(URLAllowlistPolicyHandlerTest, ApplyPolicySettings_WrongElementType) {
@@ -101,7 +101,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlAllowlist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(0U, out->GetList().size());
+  EXPECT_EQ(0U, out->GetListDeprecated().size());
 }
 
 TEST_F(URLAllowlistPolicyHandlerTest, ApplyPolicySettings_Successful) {
@@ -113,9 +113,9 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlAllowlist, &out));
   ASSERT_TRUE(out->is_list());
-  ASSERT_EQ(1U, out->GetList().size());
+  ASSERT_EQ(1U, out->GetListDeprecated().size());
 
-  const std::string* out_string = out->GetList()[0].GetIfString();
+  const std::string* out_string = out->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(out_string);
   EXPECT_EQ(kTestAllowlistValue, *out_string);
 }
@@ -134,7 +134,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlAllowlist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(max_filters_per_policy, out->GetList().size());
+  EXPECT_EQ(max_filters_per_policy, out->GetListDeprecated().size());
 }
 
 // Test that the warning message, mapped to
@@ -160,7 +160,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlAllowlist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(max_filters_per_policy + 1, out->GetList().size());
+  EXPECT_EQ(max_filters_per_policy + 1, out->GetListDeprecated().size());
 }
 
 TEST_F(URLAllowlistPolicyHandlerTest, ValidatePolicy) {
diff --git a/components/policy/core/browser/url_blocklist_policy_handler.cc b/components/policy/core/browser/url_blocklist_policy_handler.cc
index 0415748..e2c0f9f 100644
--- a/components/policy/core/browser/url_blocklist_policy_handler.cc
+++ b/components/policy/core/browser/url_blocklist_policy_handler.cc
@@ -40,7 +40,7 @@
       errors->AddError(key::kDisabledSchemes, IDS_POLICY_TYPE_ERROR,
                        base::Value::GetTypeName(base::Value::Type::LIST));
     } else {
-      disabled_schemes_entries = disabled_schemes->GetList().size();
+      disabled_schemes_entries = disabled_schemes->GetListDeprecated().size();
     }
   }
 
@@ -57,7 +57,7 @@
 
   // Filters more than |url_util::kMaxFiltersPerPolicy| are ignored, add a
   // warning message.
-  if (url_blocklist->GetList().size() + disabled_schemes_entries >
+  if (url_blocklist->GetListDeprecated().size() + disabled_schemes_entries >
       kMaxUrlFiltersPerPolicy) {
     errors->AddError(policy_name(),
                      IDS_POLICY_URL_ALLOW_BLOCK_LIST_MAX_FILTERS_LIMIT_WARNING,
@@ -67,7 +67,7 @@
   bool type_error = false;
   std::string policy;
   std::vector<std::string> invalid_policies;
-  for (const auto& policy_iter : url_blocklist->GetList()) {
+  for (const auto& policy_iter : url_blocklist->GetListDeprecated()) {
     if (!policy_iter.is_string()) {
       type_error = true;
       continue;
@@ -103,7 +103,7 @@
   // handling URLBlocklists.
   if (disabled_schemes_policy && disabled_schemes_policy->is_list()) {
     merged_url_blocklist = std::vector<base::Value>();
-    for (const auto& entry : disabled_schemes_policy->GetList()) {
+    for (const auto& entry : disabled_schemes_policy->GetListDeprecated()) {
       if (entry.is_string()) {
         merged_url_blocklist->emplace_back(
             base::StrCat({entry.GetString(), "://*"}));
@@ -115,7 +115,7 @@
     if (!merged_url_blocklist)
       merged_url_blocklist = std::vector<base::Value>();
 
-    for (const auto& entry : url_blocklist_policy->GetList()) {
+    for (const auto& entry : url_blocklist_policy->GetListDeprecated()) {
       if (entry.is_string())
         merged_url_blocklist->push_back(entry.Clone());
     }
diff --git a/components/policy/core/browser/url_blocklist_policy_handler_unittest.cc b/components/policy/core/browser/url_blocklist_policy_handler_unittest.cc
index 22dda01d..b693f46 100644
--- a/components/policy/core/browser/url_blocklist_policy_handler_unittest.cc
+++ b/components/policy/core/browser/url_blocklist_policy_handler_unittest.cc
@@ -128,7 +128,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(0U, out->GetList().size());
+  EXPECT_EQ(0U, out->GetListDeprecated().size());
 }
 
 TEST_F(URLBlocklistPolicyHandlerTest, ApplyPolicySettings_URLBlocklistEmpty) {
@@ -137,7 +137,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(0U, out->GetList().size());
+  EXPECT_EQ(0U, out->GetListDeprecated().size());
 }
 
 TEST_F(URLBlocklistPolicyHandlerTest,
@@ -152,7 +152,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(0U, out->GetList().size());
+  EXPECT_EQ(0U, out->GetListDeprecated().size());
 }
 
 TEST_F(URLBlocklistPolicyHandlerTest,
@@ -167,7 +167,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(0U, out->GetList().size());
+  EXPECT_EQ(0U, out->GetListDeprecated().size());
 }
 
 TEST_F(URLBlocklistPolicyHandlerTest,
@@ -180,9 +180,9 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(1U, out->GetList().size());
+  EXPECT_EQ(1U, out->GetListDeprecated().size());
 
-  const std::string* out_string = out->GetList()[0].GetIfString();
+  const std::string* out_string = out->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(out_string);
   EXPECT_EQ(kTestDisabledScheme + std::string("://*"), *out_string);
 }
@@ -197,9 +197,9 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(1U, out->GetList().size());
+  EXPECT_EQ(1U, out->GetListDeprecated().size());
 
-  const std::string* out_string = out->GetList()[0].GetIfString();
+  const std::string* out_string = out->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(out_string);
   EXPECT_EQ(kTestBlocklistValue, *out_string);
 }
@@ -217,13 +217,13 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  ASSERT_EQ(2U, out->GetList().size());
+  ASSERT_EQ(2U, out->GetListDeprecated().size());
 
-  const std::string* out_string1 = out->GetList()[0].GetIfString();
+  const std::string* out_string1 = out->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(out_string1);
   EXPECT_EQ(kTestDisabledScheme + std::string("://*"), *out_string1);
 
-  const std::string* out_string2 = out->GetList()[1].GetIfString();
+  const std::string* out_string2 = out->GetListDeprecated()[1].GetIfString();
   ASSERT_TRUE(out_string2);
   EXPECT_EQ(kTestBlocklistValue, *out_string2);
 }
@@ -242,7 +242,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(max_filters_per_policy, out->GetList().size());
+  EXPECT_EQ(max_filters_per_policy, out->GetListDeprecated().size());
 }
 
 // Test that the warning message, mapped to
@@ -268,7 +268,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(max_filters_per_policy + 1, out->GetList().size());
+  EXPECT_EQ(max_filters_per_policy + 1, out->GetListDeprecated().size());
 }
 
 // Test that the warning message, mapped to
@@ -299,7 +299,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(policy_prefs::kUrlBlocklist, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(max_filters_per_policy + 1, out->GetList().size());
+  EXPECT_EQ(max_filters_per_policy + 1, out->GetListDeprecated().size());
 }
 
 TEST_F(URLBlocklistPolicyHandlerTest, ValidatePolicy) {
diff --git a/components/policy/core/browser/url_scheme_list_policy_handler.cc b/components/policy/core/browser/url_scheme_list_policy_handler.cc
index 9f170a9..33774e56 100644
--- a/components/policy/core/browser/url_scheme_list_policy_handler.cc
+++ b/components/policy/core/browser/url_scheme_list_policy_handler.cc
@@ -36,21 +36,21 @@
     return false;
 
   const base::Value* schemes = policies.GetValue(policy_name());
-  if (!schemes || schemes->GetList().empty())
+  if (!schemes || schemes->GetListDeprecated().empty())
     return true;
 
   DCHECK(schemes->is_list());
 
   // Filters more than |url_util::kMaxFiltersPerPolicy| are ignored, add a
   // warning message.
-  if (schemes->GetList().size() > policy::kMaxUrlFiltersPerPolicy) {
+  if (schemes->GetListDeprecated().size() > policy::kMaxUrlFiltersPerPolicy) {
     errors->AddError(policy_name(),
                      IDS_POLICY_URL_ALLOW_BLOCK_LIST_MAX_FILTERS_LIMIT_WARNING,
                      base::NumberToString(policy::kMaxUrlFiltersPerPolicy));
   }
 
   std::vector<std::string> invalid_policies;
-  for (const auto& entry : schemes->GetList()) {
+  for (const auto& entry : schemes->GetListDeprecated()) {
     if (!ValidatePolicyEntry(entry.GetIfString()))
       invalid_policies.push_back(entry.GetString());
   }
@@ -60,7 +60,7 @@
                      base::JoinString(invalid_policies, ","));
   }
 
-  return invalid_policies.size() < schemes->GetList().size();
+  return invalid_policies.size() < schemes->GetListDeprecated().size();
 }
 
 void URLSchemeListPolicyHandler::ApplyPolicySettings(const PolicyMap& policies,
@@ -69,7 +69,7 @@
   if (!schemes || !schemes->is_list())
     return;
   std::vector<base::Value> filtered_schemes;
-  for (const auto& entry : schemes->GetList()) {
+  for (const auto& entry : schemes->GetListDeprecated()) {
     if (ValidatePolicyEntry(entry.GetIfString()))
       filtered_schemes.push_back(entry.Clone());
   }
diff --git a/components/policy/core/browser/url_scheme_list_policy_handler_unittest.cc b/components/policy/core/browser/url_scheme_list_policy_handler_unittest.cc
index d1a80c7..6199210 100644
--- a/components/policy/core/browser/url_scheme_list_policy_handler_unittest.cc
+++ b/components/policy/core/browser/url_scheme_list_policy_handler_unittest.cc
@@ -120,7 +120,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_TRUE(out->GetList().empty());
+  EXPECT_TRUE(out->GetListDeprecated().empty());
 }
 
 TEST_F(URLSchemeListPolicyHandlerTest, ApplyPolicySettings_WrongElementType) {
@@ -135,9 +135,9 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(1U, out->GetList().size());
+  EXPECT_EQ(1U, out->GetListDeprecated().size());
 
-  const std::string* out_string = out->GetList()[0].GetIfString();
+  const std::string* out_string = out->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(out_string);
   EXPECT_EQ(kTestUrl, *out_string);
 }
@@ -154,9 +154,9 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(1U, out->GetList().size());
+  EXPECT_EQ(1U, out->GetListDeprecated().size());
 
-  const std::string* out_string = out->GetList()[0].GetIfString();
+  const std::string* out_string = out->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(out_string);
   EXPECT_EQ(kTestUrl, *out_string);
 }
@@ -170,9 +170,9 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(1U, out->GetList().size());
+  EXPECT_EQ(1U, out->GetListDeprecated().size());
 
-  const std::string* out_string = out->GetList()[0].GetIfString();
+  const std::string* out_string = out->GetListDeprecated()[0].GetIfString();
   ASSERT_TRUE(out_string);
   EXPECT_EQ(kTestUrl, *out_string);
 }
@@ -189,7 +189,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(policy::kMaxUrlFiltersPerPolicy, out->GetList().size());
+  EXPECT_EQ(policy::kMaxUrlFiltersPerPolicy, out->GetListDeprecated().size());
 }
 
 // Test that the warning message, mapped to
@@ -214,7 +214,7 @@
   base::Value* out;
   EXPECT_TRUE(prefs_.GetValue(kTestPrefName, &out));
   ASSERT_TRUE(out->is_list());
-  EXPECT_EQ(policy::kMaxUrlFiltersPerPolicy, out->GetList().size());
+  EXPECT_EQ(policy::kMaxUrlFiltersPerPolicy, out->GetListDeprecated().size());
 }
 
 TEST_F(URLSchemeListPolicyHandlerTest, ValidatePolicyEntry) {
diff --git a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
index 987a223..90d60a3 100644
--- a/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
+++ b/components/policy/core/common/cloud/cloud_policy_client_unittest.cc
@@ -1828,7 +1828,7 @@
   base::Value* events =
       payload->FindPath(RealtimeReportingJobConfiguration::kEventListKey);
   EXPECT_EQ(base::Value::Type::LIST, events->type());
-  EXPECT_EQ(1u, events->GetList().size());
+  EXPECT_EQ(1u, events->GetListDeprecated().size());
 }
 
 TEST_F(CloudPolicyClientTest, RealtimeReportMerge) {
@@ -1903,7 +1903,7 @@
   ASSERT_EQ(
       2u,
       payload->FindListPath(RealtimeReportingJobConfiguration::kEventListKey)
-          ->GetList()
+          ->GetListDeprecated()
           .size());
 }
 
diff --git a/components/policy/core/common/cloud/encrypted_reporting_job_configuration_unittest.cc b/components/policy/core/common/cloud/encrypted_reporting_job_configuration_unittest.cc
index 9e88807..56d3de9 100644
--- a/components/policy/core/common/cloud/encrypted_reporting_job_configuration_unittest.cc
+++ b/components/policy/core/common/cloud/encrypted_reporting_job_configuration_unittest.cc
@@ -355,11 +355,12 @@
 
   base::Value* record_list = nullptr;
   GetRecordList(&configuration, &record_list);
-  EXPECT_EQ(record_list->GetList().size(), 1u);
-  EXPECT_EQ(record_list->GetList()[0], record_value);
+  EXPECT_EQ(record_list->GetListDeprecated().size(), 1u);
+  EXPECT_EQ(record_list->GetListDeprecated()[0], record_value);
 
   std::string* encrypted_wrapped_record =
-      record_list->GetList()[0].FindStringKey(kEncryptedWrappedRecordKey);
+      record_list->GetListDeprecated()[0].FindStringKey(
+          kEncryptedWrappedRecordKey);
   ASSERT_THAT(encrypted_wrapped_record, NotNull());
 
   std::string decoded_record;
@@ -387,11 +388,11 @@
   base::Value* record_list = nullptr;
   GetRecordList(&configuration, &record_list);
 
-  EXPECT_EQ(record_list->GetList().size(), records.size());
+  EXPECT_EQ(record_list->GetListDeprecated().size(), records.size());
 
   size_t counter = 0;
   for (const auto& record : records) {
-    EXPECT_EQ(record_list->GetList()[counter++], record);
+    EXPECT_EQ(record_list->GetListDeprecated()[counter++], record);
   }
 
   EXPECT_FALSE(GetAttachEncryptionSettings(&configuration));
@@ -411,7 +412,7 @@
   base::Value* record_list = nullptr;
   GetRecordList(&configuration, &record_list);
 
-  EXPECT_TRUE(record_list->GetList().empty());
+  EXPECT_TRUE(record_list->GetListDeprecated().empty());
 
   EXPECT_TRUE(GetAttachEncryptionSettings(&configuration));
 }
@@ -436,11 +437,11 @@
   base::Value* record_list = nullptr;
   GetRecordList(&configuration, &record_list);
 
-  EXPECT_EQ(record_list->GetList().size(), records.size());
+  EXPECT_EQ(record_list->GetListDeprecated().size(), records.size());
 
   size_t counter = 0;
   for (const auto& record : records) {
-    EXPECT_EQ(record_list->GetList()[counter++], record);
+    EXPECT_EQ(record_list->GetListDeprecated()[counter++], record);
   }
 
   EXPECT_TRUE(GetAttachEncryptionSettings(&configuration));
diff --git a/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc b/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc
index c587bd9..1a69db02 100644
--- a/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc
+++ b/components/policy/core/common/cloud/realtime_reporting_job_configuration.cc
@@ -75,7 +75,7 @@
 
   // Append event_list to the payload.
   base::Value* to = payload_.FindListKey(kEventListKey);
-  for (auto& event : event_list->GetList())
+  for (auto& event : event_list->GetListDeprecated())
     to->Append(std::move(event));
   return true;
 }
@@ -130,7 +130,7 @@
   base::Value response_value = response ? std::move(*response) : base::Value();
   base::Value* failedUploads = response_value.FindListKey(kFailedUploadsKey);
   if (failedUploads) {
-    for (const auto& failedUpload : failedUploads->GetList()) {
+    for (const auto& failedUpload : failedUploads->GetListDeprecated()) {
       auto* id = failedUpload.FindStringKey(kEventIdKey);
       if (id) {
         failedIds.insert(*id);
diff --git a/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc b/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc
index 678ef02..337eb53 100644
--- a/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc
+++ b/components/policy/core/common/cloud/realtime_reporting_job_configuration_unittest.cc
@@ -209,9 +209,9 @@
 
   base::Value* events =
       payload->FindListKey(RealtimeReportingJobConfiguration::kEventListKey);
-  EXPECT_EQ(ids.size(), events->GetList().size());
+  EXPECT_EQ(ids.size(), events->GetListDeprecated().size());
   int i = -1;
-  for (const auto& event : events->GetList()) {
+  for (const auto& event : events->GetListDeprecated()) {
     auto* id = event.FindStringKey(kEventId);
     EXPECT_EQ(ids[++i], *id);
     auto type = event.FindKey(kAppInstallEvent)->FindIntKey(kEventType);
@@ -326,8 +326,8 @@
       base::JSONReader::Read(configuration_->GetPayload());
   base::Value* events =
       payload->FindListKey(RealtimeReportingJobConfiguration::kEventListKey);
-  EXPECT_EQ(1u, events->GetList().size());
-  auto& event = events->GetList()[0];
+  EXPECT_EQ(1u, events->GetListDeprecated().size());
+  auto& event = events->GetListDeprecated()[0];
   EXPECT_EQ(ids[1], *event.FindStringKey(kEventId));
 }
 
diff --git a/components/policy/core/common/default_chrome_apps_migrator.cc b/components/policy/core/common/default_chrome_apps_migrator.cc
index 2a914f6..23d961d 100644
--- a/components/policy/core/common/default_chrome_apps_migrator.cc
+++ b/components/policy/core/common/default_chrome_apps_migrator.cc
@@ -48,7 +48,7 @@
   // ExtensionInstallForcelist value. Add the Chrome app ids that need to be
   // blocked to 'chrome_app_ids'. Add the URLs of Web Apps that need to be
   // installed to `web_app_urls`.
-  for (const auto& list_entry : forcelist_value->GetList()) {
+  for (const auto& list_entry : forcelist_value->GetListDeprecated()) {
     if (!list_entry.is_string()) {
       new_forcelist_value.Append(list_entry.Clone());
       continue;
diff --git a/components/policy/core/common/policy_loader_common.cc b/components/policy/core/common/policy_loader_common.cc
index 98b9efb..e3852af 100644
--- a/components/policy/core/common/policy_loader_common.cc
+++ b/components/policy/core/common/policy_loader_common.cc
@@ -77,8 +77,8 @@
     return false;
 
   // Using index for loop to update the list in place.
-  for (size_t i = 0; i < policy_list_value->GetList().size(); i++) {
-    const auto& list_entry = policy_list_value->GetList()[i];
+  for (size_t i = 0; i < policy_list_value->GetListDeprecated().size(); i++) {
+    const auto& list_entry = policy_list_value->GetListDeprecated()[i];
     if (!list_entry.is_string())
       continue;
 
@@ -90,7 +90,7 @@
     // Only allow custom update urls in enterprise environments.
     if (!base::LowerCaseEqualsASCII(entry.substr(pos + 1),
                                     kChromeWebstoreUpdateURL)) {
-      policy_list_value->GetList()[i] =
+      policy_list_value->GetListDeprecated()[i] =
           base::Value(kBlockedExtensionPrefix + entry);
       has_invalid_policies = true;
     }
diff --git a/components/policy/core/common/policy_loader_win_unittest.cc b/components/policy/core/common/policy_loader_win_unittest.cc
index 49ca011..e509072 100644
--- a/components/policy/core/common/policy_loader_win_unittest.cc
+++ b/components/policy/core/common/policy_loader_win_unittest.cc
@@ -323,7 +323,7 @@
       KEY_ALL_ACCESS);
   ASSERT_TRUE(key.Valid());
   int index = 1;
-  for (const auto& element : policy_value->GetList()) {
+  for (const auto& element : policy_value->GetListDeprecated()) {
     if (!element.is_string())
       continue;
 
diff --git a/components/policy/core/common/policy_merger.cc b/components/policy/core/common/policy_merger.cc
index edb85e7..313ffc1 100644
--- a/components/policy/core/common/policy_merger.cc
+++ b/components/policy/core/common/policy_merger.cc
@@ -132,7 +132,7 @@
       compare_value_ptr);
   bool value_changed = false;
 
-  for (const base::Value& val : policy->value()->GetList()) {
+  for (const base::Value& val : policy->value()->GetListDeprecated()) {
     if (duplicates.find(&val) != duplicates.end())
       continue;
     duplicates.insert(&val);
@@ -147,7 +147,7 @@
       continue;
     }
 
-    for (const base::Value& val : it.entry().value()->GetList()) {
+    for (const base::Value& val : it.entry().value()->GetListDeprecated()) {
       if (duplicates.find(&val) != duplicates.end())
         continue;
       duplicates.insert(&val);
diff --git a/components/policy/core/common/schema.cc b/components/policy/core/common/schema.cc
index ad8c4f4..8477175 100644
--- a/components/policy/core/common/schema.cc
+++ b/components/policy/core/common/schema.cc
@@ -330,14 +330,14 @@
                   const std::string& type,
                   std::string* error) {
   if (enum_list->type() != base::Value::Type::LIST ||
-      enum_list->GetList().empty()) {
+      enum_list->GetListDeprecated().empty()) {
     *error = "Attribute 'enum' must be a non-empty list.";
     return false;
   }
   base::Value::Type expected_item_type = base::Value::Type::NONE;
   MapSchemaKeyToValueType(type, kSchemaTypesToValueTypes,
                           kSchemaTypesToValueTypesEnd, &expected_item_type);
-  for (const base::Value& item : enum_list->GetList()) {
+  for (const base::Value& item : enum_list->GetListDeprecated()) {
     if (item.type() != expected_item_type) {
       *error = base::StringPrintf(
           "Attribute 'enum' for type '%s' contains items with invalid types",
@@ -455,7 +455,7 @@
 
     const base::Value* required = dict.FindKey(schema::kRequired);
     if (required) {
-      for (const base::Value& item : required->GetList()) {
+      for (const base::Value& item : required->GetListDeprecated()) {
         if (!item.is_string()) {
           *error = "Attribute 'required' may only contain strings.";
           return false;
@@ -764,13 +764,14 @@
 
     const base::Value* required_properties = schema.FindKey(schema::kRequired);
     if (required_properties) {
-      sizes->strings += required_properties->GetList().size();
-      sizes->required_properties += required_properties->GetList().size();
+      sizes->strings += required_properties->GetListDeprecated().size();
+      sizes->required_properties +=
+          required_properties->GetListDeprecated().size();
     }
   } else if (schema.FindKey(schema::kEnum)) {
     const base::Value* possible_values = schema.FindListKey(schema::kEnum);
     if (possible_values) {
-      size_t num_possible_values = possible_values->GetList().size();
+      size_t num_possible_values = possible_values->GetListDeprecated().size();
       if (type == base::Value::Type::INTEGER) {
         sizes->int_enums += num_possible_values;
       } else if (type == base::Value::Type::STRING) {
@@ -952,7 +953,7 @@
   properties_nodes_[extra].required_begin = required_properties_.size();
   const base::Value* required_properties = schema.FindKey(schema::kRequired);
   if (required_properties) {
-    for (const base::Value& val : required_properties->GetList()) {
+    for (const base::Value& val : required_properties->GetListDeprecated()) {
       strings_.push_back(val.GetString());
       required_properties_.push_back(strings_.back().c_str());
     }
@@ -991,7 +992,7 @@
     *error = "Enum attribute must be a list value";
     return false;
   }
-  if (possible_values->GetList().empty()) {
+  if (possible_values->GetListDeprecated().empty()) {
     *error = "Enum attribute must be non-empty";
     return false;
   }
@@ -999,7 +1000,7 @@
   int offset_end;
   if (type == base::Value::Type::INTEGER) {
     offset_begin = static_cast<int>(int_enums_.size());
-    for (const auto& possible_value : possible_values->GetList()) {
+    for (const auto& possible_value : possible_values->GetListDeprecated()) {
       if (!possible_value.is_int()) {
         *error = "Invalid enumeration member type";
         return false;
@@ -1009,7 +1010,7 @@
     offset_end = static_cast<int>(int_enums_.size());
   } else if (type == base::Value::Type::STRING) {
     offset_begin = static_cast<int>(string_enums_.size());
-    for (const auto& possible_value : possible_values->GetList()) {
+    for (const auto& possible_value : possible_values->GetListDeprecated()) {
       if (!possible_value.is_string()) {
         *error = "Invalid enumeration member type";
         return false;
@@ -1611,7 +1612,7 @@
         schema_item.MaskSensitiveValuesRecursive(&sub_value);
     }
   } else if (value->is_list()) {
-    for (auto& list_elem : value->GetList())
+    for (auto& list_elem : value->GetListDeprecated())
       GetItems().MaskSensitiveValuesRecursive(&list_elem);
   }
 }
diff --git a/components/policy/core/common/values_util.cc b/components/policy/core/common/values_util.cc
index 379d2af..82d8dc6 100644
--- a/components/policy/core/common/values_util.cc
+++ b/components/policy/core/common/values_util.cc
@@ -15,7 +15,7 @@
   if (!value->is_list())
     return base::flat_set<std::string>();
 
-  const auto& items = value->GetList();
+  const auto& items = value->GetListDeprecated();
 
   std::vector<std::string> item_vector;
   item_vector.reserve(items.size());
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto
index d5404e5..cee83c1 100644
--- a/components/policy/proto/chrome_device_policy.proto
+++ b/components/policy/proto/chrome_device_policy.proto
@@ -154,6 +154,8 @@
   optional bool report_network_configuration = 29 [default = true];
   optional bool report_network_status = 30 [default = true];
   optional bool report_security_status = 31 [default = false];
+  optional bool report_crd_sessions = 36 [default = false];
+  optional bool report_peripherals = 37 [default = false];
 
   // Frequency to report device status, default to 3 hours.
   // If changed, the default value has to be updated in
@@ -173,9 +175,6 @@
   // Audio telemetry policy
   optional int64 report_device_audio_status_checking_rate_ms = 35
       [default = 600000];
-
-  // CRD Sessions reporting policy
-  optional bool report_crd_sessions = 36 [default = false];
 }
 
 message EphemeralUsersEnabledProto {
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index cf3eee50..80cb7f6e 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -965,6 +965,7 @@
         'ReportDeviceTimezoneInfo',
         'ReportDeviceMemoryInfo',
         'ReportDeviceBacklightInfo',
+        'ReportDevicePeripherals',
         'ReportDevicePowerStatus',
         'ReportDeviceSecurityStatus',
         'ReportDeviceStorageStatus',
@@ -11040,6 +11041,37 @@
       'arc_support': 'This policy has no effect on the logging done by Android.',
     },
     {
+      'name': 'ReportDevicePeripherals',
+      'owners': ['cros-reporting-team@google.com', 'lbaraz@chromium.org', 'tylergarrett@google.com'],
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome_os:101-'],
+      'supported_chrome_os_management': ['google_cloud'],
+      'device_only': True,
+      'features': {
+        'dynamic_refresh': True,
+      },
+      'default': False,
+      'items': [
+        {
+          'value': True,
+          'caption': 'Report information about peripherals that are plugged into the device',
+        },
+        {
+          'value': False,
+          'caption': 'Do not report information about peripherals that are plugged into the device',
+        },
+      ],
+      'example_value': False,
+      'id': 952,
+      'caption': '''Report peripheral details''',
+      'tags': ['admin-sharing'],
+      'desc': '''Setting the policy to True has enrolled devices report information related to peripherals that are plugged into the device.
+
+      Setting the policy to False or leaving it unset means enrolled devices don't report peripherals information.''',
+      'arc_support': 'This policy has no effect on the logging done by Android.',
+    },
+    {
       'name': 'ReportDeviceStorageStatus',
       'owners': ['cros-reporting-team@google.com', 'lbaraz@chromium.org', 'antrim@chromium.org'],
       'type': 'main',
@@ -30195,6 +30227,7 @@
     'ReportDeviceMemoryInfo': 'device_reporting.report_memory_info',
     'ReportDeviceBacklightInfo': 'device_reporting.report_backlight_info',
     'ReportDeviceStorageStatus': 'device_reporting.report_storage_status',
+    'ReportDevicePeripherals': 'device_reporting.report_peripherals',
     'ReportDevicePowerStatus': 'device_reporting.report_power_status',
     'DeviceOpenNetworkConfiguration': 'open_network_configuration.open_network_configuration',
     'DeviceBootOnAcEnabled': 'device_boot_on_ac.enabled',
@@ -30629,6 +30662,7 @@
         'ReportDeviceTimezoneInfo',
         'ReportDeviceMemoryInfo',
         'ReportDeviceBacklightInfo',
+        'ReportDevicePeripherals',
         'ReportDevicePowerStatus',
         'ReportDeviceSecurityStatus',
         'ReportDeviceStorageStatus',
@@ -30743,6 +30777,6 @@
   'placeholders': [],
   'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872],
   'deleted_atomic_policy_group_ids': [19],
-  'highest_id_currently_used': 951,
+  'highest_id_currently_used': 952,
   'highest_atomic_group_id_currently_used': 41
 }
diff --git a/components/prefs/scoped_user_pref_update_unittest.cc b/components/prefs/scoped_user_pref_update_unittest.cc
index cda141f..fb706f9 100644
--- a/components/prefs/scoped_user_pref_update_unittest.cc
+++ b/components/prefs/scoped_user_pref_update_unittest.cc
@@ -86,11 +86,11 @@
   std::string pref_name = "mypref";
   prefs_.registry()->RegisterListPref(pref_name,
                                       base::Value(std::move(defaults)));
-  EXPECT_EQ(2u, prefs_.GetList(pref_name)->GetList().size());
+  EXPECT_EQ(2u, prefs_.GetList(pref_name)->GetListDeprecated().size());
 
   ListPrefUpdate update(&prefs_, pref_name);
   update->Append("thirdvalue");
-  EXPECT_EQ(3u, prefs_.GetList(pref_name)->GetList().size());
+  EXPECT_EQ(3u, prefs_.GetList(pref_name)->GetListDeprecated().size());
 }
 
 TEST_F(ScopedUserPrefUpdateTest, UpdatingDictionaryPrefWithDefaults) {
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc
index a1ab1be..8dfd56ef 100644
--- a/components/printing/test/print_render_frame_helper_browsertest.cc
+++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -354,7 +354,7 @@
     const base::Value* page_range = job_settings.FindListKey(kSettingPageRange);
     PageRanges new_ranges;
     if (page_range) {
-      for (const base::Value& dict : page_range->GetList()) {
+      for (const base::Value& dict : page_range->GetListDeprecated()) {
         if (!dict.is_dict())
           continue;
 
diff --git a/components/resources/components_resources.grd b/components/resources/components_resources.grd
index be607c11..60f6613 100644
--- a/components/resources/components_resources.grd
+++ b/components/resources/components_resources.grd
@@ -26,6 +26,7 @@
       <part file="security_interstitials_resources.grdp" />
       <part file="translate_resources.grdp" />
       <part file="version_ui_resources.grdp" />
+      <part file="web_app_default_offline.grdp" />
 
       <if expr="is_android">
         <part file="android_system_error_page_resources.grdp" />
diff --git a/components/resources/web_app_default_offline.grdp b/components/resources/web_app_default_offline.grdp
new file mode 100644
index 0000000..2b6de95a
--- /dev/null
+++ b/components/resources/web_app_default_offline.grdp
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit-part>
+  <include name="IDR_WEBAPP_DEFAULT_OFFLINE_HTML" file="../web_app_resources/web_app_default_offline.html" flattenhtml="true" type="BINDATA"/>
+</grit-part>
\ No newline at end of file
diff --git a/components/safe_browsing/android/safe_browsing_api_handler_util.cc b/components/safe_browsing/android/safe_browsing_api_handler_util.cc
index 39d6c485..6bc5553 100644
--- a/components/safe_browsing/android/safe_browsing_api_handler_util.cc
+++ b/components/safe_browsing/android/safe_browsing_api_handler_util.cc
@@ -149,7 +149,7 @@
   // Go through each matched threat type and pick the most severe.
   JavaThreatTypes worst_threat_type = JAVA_THREAT_TYPE_MAX_VALUE;
   const base::DictionaryValue* worst_match = nullptr;
-  for (const base::Value& match_value : matches->GetList()) {
+  for (const base::Value& match_value : matches->GetListDeprecated()) {
     // Get the threat number
     const base::DictionaryValue* match = nullptr;
     if (match_value.is_dict())
diff --git a/components/safe_browsing/content/browser/client_side_detection_service.cc b/components/safe_browsing/content/browser/client_side_detection_service.cc
index 6bdc82d..124c3c4c 100644
--- a/components/safe_browsing/content/browser/client_side_detection_service.cc
+++ b/components/safe_browsing/content/browser/client_side_detection_service.cc
@@ -418,7 +418,7 @@
   for (const base::Value& timestamp :
        delegate_->GetPrefs()
            ->GetList(prefs::kSafeBrowsingCsdPingTimestamps)
-           ->GetList()) {
+           ->GetListDeprecated()) {
     phishing_report_times_.push_back(
         base::Time::FromDoubleT(timestamp.GetDouble()));
   }
diff --git a/components/safe_browsing/content/browser/triggers/trigger_throttler_unittest.cc b/components/safe_browsing/content/browser/triggers/trigger_throttler_unittest.cc
index 8aa1eb6..b760b99 100644
--- a/components/safe_browsing/content/browser/triggers/trigger_throttler_unittest.cc
+++ b/components/safe_browsing/content/browser/triggers/trigger_throttler_unittest.cc
@@ -185,12 +185,12 @@
 
   const std::string kAdSampleKey = "2";
   const base::Value* ad_sample_events = event_dict->FindKey(kAdSampleKey);
-  EXPECT_EQ(3u, ad_sample_events->GetList().size());
+  EXPECT_EQ(3u, ad_sample_events->GetListDeprecated().size());
 
   const std::string kSuspiciousSiteKey = "4";
   const base::Value* suspicious_site_events =
       event_dict->FindKey(kSuspiciousSiteKey);
-  EXPECT_EQ(2u, suspicious_site_events->GetList().size());
+  EXPECT_EQ(2u, suspicious_site_events->GetListDeprecated().size());
 
   // To simulate a new startup of the browser, we can create another throttler
   // using the same quota configuration and pref store. It should read the
diff --git a/components/safe_browsing/content/common/file_type_policies_policy_util.cc b/components/safe_browsing/content/common/file_type_policies_policy_util.cc
index 1726bff..c4d9fea4 100644
--- a/components/safe_browsing/content/common/file_type_policies_policy_util.cc
+++ b/components/safe_browsing/content/common/file_type_policies_policy_util.cc
@@ -44,7 +44,7 @@
 
   if (heuristic_overrides) {
     base::ListValue domains_for_extension;
-    for (const base::Value& entry : heuristic_overrides->GetList()) {
+    for (const base::Value& entry : heuristic_overrides->GetListDeprecated()) {
       const base::DictionaryValue& extension_domain_patterns_dict =
           base::Value::AsDictionaryValue(entry);
       const std::string* extension_for_this_entry =
@@ -54,7 +54,8 @@
         const base::Value* domains_for_this_entry =
             extension_domain_patterns_dict.FindListKey(kDomainListKey);
         if (domains_for_this_entry) {
-          for (const base::Value& domain : domains_for_this_entry->GetList()) {
+          for (const base::Value& domain :
+               domains_for_this_entry->GetListDeprecated()) {
             domains_for_extension.Append(domain.Clone());
           }
         }
diff --git a/components/safe_browsing/core/browser/safe_browsing_metrics_collector.cc b/components/safe_browsing/core/browser/safe_browsing_metrics_collector.cc
index 9fb5aa76..51bda9c 100644
--- a/components/safe_browsing/core/browser/safe_browsing_metrics_collector.cc
+++ b/components/safe_browsing/core/browser/safe_browsing_metrics_collector.cc
@@ -238,8 +238,8 @@
   }
 
   // Remove the oldest timestamp if the length of the timestamps hits the limit.
-  while (timestamps->GetList().size() >= kTimestampsMaxLength) {
-    timestamps->EraseListIter(timestamps->GetList().begin());
+  while (timestamps->GetListDeprecated().size() >= kTimestampsMaxLength) {
+    timestamps->EraseListIter(timestamps->GetListDeprecated().begin());
   }
 
   timestamps->Append(TimeToPrefValue(base::Time::Now()));
@@ -282,8 +282,8 @@
   const base::Value* timestamps =
       event_dict->FindListKey(EventTypeToPrefKey(event_type));
 
-  if (timestamps && timestamps->GetList().size() > 0) {
-    base::Time time = PrefValueToTime(timestamps->GetList().back());
+  if (timestamps && timestamps->GetListDeprecated().size() > 0) {
+    base::Time time = PrefValueToTime(timestamps->GetListDeprecated().back());
     return Event(event_type, time);
   }
 
@@ -419,8 +419,8 @@
     return 0;
   }
 
-  return std::count_if(timestamps->GetList().begin(),
-                       timestamps->GetList().end(),
+  return std::count_if(timestamps->GetListDeprecated().begin(),
+                       timestamps->GetListDeprecated().end(),
                        [&](const base::Value& timestamp) {
                          return PrefValueToTime(timestamp) > since_time;
                        });
diff --git a/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc b/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc
index 757bc230..381125f 100644
--- a/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc
+++ b/components/safe_browsing/core/browser/safe_browsing_metrics_collector_unittest.cc
@@ -58,7 +58,8 @@
   }
 
   bool IsSortedInChronologicalOrder(const base::Value* ts) {
-    return std::is_sorted(ts->GetList().begin(), ts->GetList().end(),
+    return std::is_sorted(ts->GetListDeprecated().begin(),
+                          ts->GetListDeprecated().end(),
                           [](const base::Value& ts_a, const base::Value& ts_b) {
                             return base::ValueToInt64(ts_a).value_or(0) <
                                    base::ValueToInt64(ts_b).value_or(0);
@@ -210,19 +211,21 @@
 
   const base::Value* timestamps = GetTsFromUserStateAndEventType(
       UserState::kEnhancedProtection, EventType::DATABASE_INTERSTITIAL_BYPASS);
-  EXPECT_EQ(30u, timestamps->GetList().size());
+  EXPECT_EQ(30u, timestamps->GetListDeprecated().size());
   EXPECT_TRUE(IsSortedInChronologicalOrder(timestamps));
 
   task_environment_.FastForwardBy(base::Days(1));
   metrics_collector_->AddSafeBrowsingEventToPref(
       EventType::DATABASE_INTERSTITIAL_BYPASS);
 
-  EXPECT_EQ(30u, timestamps->GetList().size());
+  EXPECT_EQ(30u, timestamps->GetListDeprecated().size());
   EXPECT_TRUE(IsSortedInChronologicalOrder(timestamps));
   // The oldest timestamp should be removed.
-  EXPECT_EQ(timestamps->GetList()[0], timestamps->GetList()[1]);
+  EXPECT_EQ(timestamps->GetListDeprecated()[0],
+            timestamps->GetListDeprecated()[1]);
   // The newest timestamp should be added as the last element.
-  EXPECT_NE(timestamps->GetList()[28], timestamps->GetList()[29]);
+  EXPECT_NE(timestamps->GetListDeprecated()[28],
+            timestamps->GetListDeprecated()[29]);
 }
 
 TEST_F(SafeBrowsingMetricsCollectorTest,
@@ -239,10 +242,10 @@
 
   const base::Value* enhanced_timestamps = GetTsFromUserStateAndEventType(
       UserState::kEnhancedProtection, EventType::DATABASE_INTERSTITIAL_BYPASS);
-  EXPECT_EQ(1u, enhanced_timestamps->GetList().size());
+  EXPECT_EQ(1u, enhanced_timestamps->GetListDeprecated().size());
   const base::Value* managed_timestamps = GetTsFromUserStateAndEventType(
       UserState::kManaged, EventType::DATABASE_INTERSTITIAL_BYPASS);
-  EXPECT_EQ(2u, managed_timestamps->GetList().size());
+  EXPECT_EQ(2u, managed_timestamps->GetListDeprecated().size());
 }
 
 TEST_F(SafeBrowsingMetricsCollectorTest,
@@ -780,15 +783,15 @@
   const base::Value* db_timestamps = GetTsFromUserStateAndEventType(
       UserState::kStandardProtection, EventType::DATABASE_INTERSTITIAL_BYPASS);
   // The event is removed from pref because it was logged more than 30 days.
-  EXPECT_EQ(0u, db_timestamps->GetList().size());
+  EXPECT_EQ(0u, db_timestamps->GetListDeprecated().size());
   const base::Value* csd_timestamps = GetTsFromUserStateAndEventType(
       UserState::kStandardProtection, EventType::CSD_INTERSTITIAL_BYPASS);
   // The CSD event is still in pref because it was logged less than 30 days.
-  EXPECT_EQ(1u, csd_timestamps->GetList().size());
+  EXPECT_EQ(1u, csd_timestamps->GetListDeprecated().size());
 
   task_environment_.FastForwardBy(base::Days(1));
   // The CSD event is also removed because it was logged more than 30 days now.
-  EXPECT_EQ(0u, csd_timestamps->GetList().size());
+  EXPECT_EQ(0u, csd_timestamps->GetListDeprecated().size());
 
   histograms.ExpectUniqueSample("SafeBrowsing.MetricsCollector.IsPrefValid",
                                 /* sample */ 1,
diff --git a/components/safe_browsing/core/common/safe_browsing_prefs.cc b/components/safe_browsing/core/common/safe_browsing_prefs.cc
index 971d4424..9fb3f5d 100644
--- a/components/safe_browsing/core/common/safe_browsing_prefs.cc
+++ b/components/safe_browsing/core/common/safe_browsing_prefs.cc
@@ -346,7 +346,7 @@
     return false;
   const base::Value* allowlist =
       pref.GetList(prefs::kSafeBrowsingAllowlistDomains);
-  for (const base::Value& value : allowlist->GetList()) {
+  for (const base::Value& value : allowlist->GetListDeprecated()) {
     if (url.DomainIs(value.GetString()))
       return true;
   }
@@ -357,7 +357,7 @@
   std::vector<std::string> allowlist_domains;
   const base::Value* allowlist =
       pref_service->GetList(prefs::kSafeBrowsingAllowlistDomains);
-  for (const base::Value& value : allowlist->GetList()) {
+  for (const base::Value& value : allowlist->GetListDeprecated()) {
     allowlist_domains.push_back(value.GetString());
   }
   return allowlist_domains;
@@ -377,7 +377,7 @@
   const base::Value* pref_value =
       prefs.GetList(prefs::kPasswordProtectionLoginURLs);
   out_login_url_list->clear();
-  for (const base::Value& value : pref_value->GetList()) {
+  for (const base::Value& value : pref_value->GetListDeprecated()) {
     GURL login_url(value.GetString());
     // Skip invalid or none-http/https login URLs.
     if (login_url.is_valid() && login_url.SchemeIsHTTPOrHTTPS())
diff --git a/components/safe_search_api/safe_search/safe_search_url_checker_client.cc b/components/safe_search_api/safe_search/safe_search_url_checker_client.cc
index 2a246b74..bce77656 100644
--- a/components/safe_search_api/safe_search/safe_search_url_checker_client.cc
+++ b/components/safe_search_api/safe_search/safe_search_url_checker_client.cc
@@ -52,11 +52,12 @@
     DLOG(WARNING) << "ParseResponse failed to parse classifications list";
     return false;
   }
-  if (classifications_list->GetList().size() != 1) {
+  if (classifications_list->GetListDeprecated().size() != 1) {
     DLOG(WARNING) << "ParseResponse expected exactly one result";
     return false;
   }
-  const base::Value& classification_value = classifications_list->GetList()[0];
+  const base::Value& classification_value =
+      classifications_list->GetListDeprecated()[0];
   if (!classification_value.is_dict()) {
     DLOG(WARNING) << "ParseResponse failed to parse classification dict";
     return false;
diff --git a/components/search_engines/keyword_table.cc b/components/search_engines/keyword_table.cc
index e5aee86..e607ebf 100644
--- a/components/search_engines/keyword_table.cc
+++ b/components/search_engines/keyword_table.cc
@@ -504,7 +504,7 @@
   data->alternate_urls.clear();
   absl::optional<base::Value> value(base::JSONReader::Read(s.ColumnString(15)));
   if (value && value->is_list()) {
-    for (const base::Value& alternate_url : value->GetList()) {
+    for (const base::Value& alternate_url : value->GetListDeprecated()) {
       if (alternate_url.is_string()) {
         data->alternate_urls.push_back(alternate_url.GetString());
       }
diff --git a/components/search_engines/template_url_data_util.cc b/components/search_engines/template_url_data_util.cc
index c482e77..d8f2177 100644
--- a/components/search_engines/template_url_data_util.cc
+++ b/components/search_engines/template_url_data_util.cc
@@ -147,7 +147,7 @@
   const base::Value* alternate_urls =
       dict.FindListKey(DefaultSearchManager::kAlternateURLs);
   if (alternate_urls) {
-    for (const auto& it : alternate_urls->GetList()) {
+    for (const auto& it : alternate_urls->GetListDeprecated()) {
       if (it.is_string())
         result->alternate_urls.push_back(it.GetString());
     }
@@ -156,7 +156,7 @@
   const base::Value* encodings =
       dict.FindListKey(DefaultSearchManager::kInputEncodings);
   if (encodings) {
-    for (const auto& it : encodings->GetList()) {
+    for (const auto& it : encodings->GetListDeprecated()) {
       std::string encoding;
       if (it.is_string())
         result->input_encodings.push_back(it.GetString());
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc
index 8e59aa8..2fc0c05 100644
--- a/components/search_engines/template_url_prepopulate_data.cc
+++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -1344,7 +1344,7 @@
   if (!list)
     return t_urls;
 
-  for (const base::Value& engine : list->GetList()) {
+  for (const base::Value& engine : list->GetListDeprecated()) {
     if (engine.is_dict()) {
       auto t_url = TemplateURLDataFromOverrideDictionary(engine);
       if (t_url)
diff --git a/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc b/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc
index 626d4e4..efd772b 100644
--- a/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc
+++ b/components/security_interstitials/content/stateful_ssl_host_state_delegate.cc
@@ -107,7 +107,7 @@
     // Check that the values are in increasing order and wipe out the list if
     // not (presumably because the clock changed).
     double previous = 0;
-    for (const auto& error_instance : list_value->GetList()) {
+    for (const auto& error_instance : list_value->GetListDeprecated()) {
       double error_time = error_instance.GetDouble();
       if (error_time < previous) {
         list_value = nullptr;
@@ -130,8 +130,9 @@
     // Only up to |threshold| values need to be stored. If the list already
     // contains |threshold| values, pop one off the front and append the new one
     // at the end; otherwise just append the new one.
-    while (base::MakeStrictNum(list_value->GetList().size()) >= threshold) {
-      list_value->EraseListIter(list_value->GetList().begin());
+    while (base::MakeStrictNum(list_value->GetListDeprecated().size()) >=
+           threshold) {
+      list_value->EraseListIter(list_value->GetListDeprecated().begin());
     }
     list_value->Append(now);
   }
@@ -155,7 +156,7 @@
   // Assume that the values in the list are in increasing order;
   // UpdateRecurrentInterstitialPref() maintains this ordering. Check if there
   // are more than |threshold| values after the cutoff time.
-  base::Value::ConstListView error_list = list_value->GetList();
+  base::Value::ConstListView error_list = list_value->GetListDeprecated();
   for (size_t i = 0; i < error_list.size(); i++) {
     if (base::Time::FromJsTime(error_list[i].GetDouble()) >= cutoff_time)
       return base::MakeStrictNum(error_list.size() - i) >= threshold;
diff --git a/components/services/app_service/public/cpp/app_types.cc b/components/services/app_service/public/cpp/app_types.cc
index fd7d4e4..672aa81 100644
--- a/components/services/app_service/public/cpp/app_types.cc
+++ b/components/services/app_service/public/cpp/app_types.cc
@@ -45,6 +45,7 @@
   app->has_badge = has_badge;
   app->paused = paused;
   app->intent_filters = CloneIntentFilters(intent_filters);
+  app->resize_locked = resize_locked;
 
   return app;
 }
@@ -245,6 +246,8 @@
     }
   }
 
+  app->resize_locked = GetOptionalBool(mojom_app->resize_locked);
+
   return app;
 }
 
diff --git a/components/services/app_service/public/cpp/app_types.h b/components/services/app_service/public/cpp/app_types.h
index 53d4d4c..5c179d0 100644
--- a/components/services/app_service/public/cpp/app_types.h
+++ b/components/services/app_service/public/cpp/app_types.h
@@ -177,6 +177,10 @@
   // be handled by this app. One app can have multiple intent filters.
   IntentFilters intent_filters;
 
+  // Whether the app can be free resized. If this is true, various resizing
+  // operations will be restricted.
+  absl::optional<bool> resize_locked;
+
   // TODO(crbug.com/1253250): Add other App struct fields.
 
   // When adding new fields to the App type, the `Clone` function and the
diff --git a/components/services/app_service/public/cpp/app_update.cc b/components/services/app_service/public/cpp/app_update.cc
index 427fe0c8..707ec28 100644
--- a/components/services/app_service/public/cpp/app_update.cc
+++ b/components/services/app_service/public/cpp/app_update.cc
@@ -222,6 +222,8 @@
     state->intent_filters = CloneIntentFilters(delta->intent_filters);
   }
 
+  SET_OPTIONAL_VALUE(resize_locked);
+
   // When adding new fields to the App type, this function should also be
   // updated.
 }
@@ -884,6 +886,10 @@
   return apps::mojom::OptionalBool::kUnknown;
 }
 
+absl::optional<bool> AppUpdate::GetResizeLocked() const {
+  GET_VALUE_WITH_FALLBACK(resize_locked, absl::nullopt);
+}
+
 bool AppUpdate::ResizeLockedChanged() const {
   return mojom_delta_ &&
          (mojom_delta_->resize_locked != apps::mojom::OptionalBool::kUnknown) &&
diff --git a/components/services/app_service/public/cpp/app_update.h b/components/services/app_service/public/cpp/app_update.h
index c0f58f8..adff68d 100644
--- a/components/services/app_service/public/cpp/app_update.h
+++ b/components/services/app_service/public/cpp/app_update.h
@@ -194,6 +194,7 @@
   bool IntentFiltersChanged() const;
 
   apps::mojom::OptionalBool ResizeLocked() const;
+  absl::optional<bool> GetResizeLocked() const;
   bool ResizeLockedChanged() const;
 
   apps::mojom::WindowMode WindowMode() const;
diff --git a/components/services/app_service/public/cpp/app_update_unittest.cc b/components/services/app_service/public/cpp/app_update_unittest.cc
index d1d0947..f47c5cb 100644
--- a/components/services/app_service/public/cpp/app_update_unittest.cc
+++ b/components/services/app_service/public/cpp/app_update_unittest.cc
@@ -117,6 +117,8 @@
 
   IntentFilters expect_intent_filters_;
 
+  absl::optional<bool> expect_resize_locked_;
+
   AccountId account_id_ = AccountId::FromUserEmail("test@gmail.com");
 
   void CheckExpects(const AppUpdate& u) {
@@ -176,6 +178,8 @@
 
     EXPECT_TRUE(IsEqual(expect_intent_filters_, u.GetIntentFilters()));
 
+    EXPECT_EQ(expect_resize_locked_, u.GetResizeLocked());
+
     EXPECT_EQ(account_id_, u.AccountId());
   }
 
@@ -211,6 +215,7 @@
     expect_has_badge_ = absl::nullopt;
     expect_paused_ = absl::nullopt;
     expect_intent_filters_.clear();
+    expect_resize_locked_ = absl::nullopt;
     CheckExpects(u);
 
     if (delta) {
@@ -794,6 +799,26 @@
       EXPECT_TRUE(IsEqual(expect_intent_filters_, state->intent_filters));
       CheckExpects(u);
     }
+
+    // ResizeLocked tests.
+
+    if (state) {
+      state->resize_locked = false;
+      expect_resize_locked_ = false;
+      CheckExpects(u);
+    }
+
+    if (delta) {
+      delta->resize_locked = true;
+      expect_resize_locked_ = true;
+      CheckExpects(u);
+    }
+
+    if (state) {
+      apps::AppUpdate::Merge(state, delta);
+      EXPECT_EQ(expect_resize_locked_, state->resize_locked);
+      CheckExpects(u);
+    }
   }
 };
 
diff --git a/components/services/app_service/public/cpp/intent_util.cc b/components/services/app_service/public/cpp/intent_util.cc
index 275b648..57d426c 100644
--- a/components/services/app_service/public/cpp/intent_util.cc
+++ b/components/services/app_service/public/cpp/intent_util.cc
@@ -649,11 +649,11 @@
     const base::DictionaryValue& dict,
     const std::string& key_name) {
   const base::Value* value = dict.FindListKey(key_name);
-  if (!value || !value->is_list() || value->GetList().empty())
+  if (!value || !value->is_list() || value->GetListDeprecated().empty())
     return absl::nullopt;
 
   std::vector<apps::mojom::IntentFilePtr> files;
-  for (const auto& item : value->GetList()) {
+  for (const auto& item : value->GetListDeprecated()) {
     GURL url(item.GetString());
     if (url.is_valid()) {
       auto file = apps::mojom::IntentFile::New();
@@ -668,11 +668,11 @@
     const base::DictionaryValue& dict,
     const std::string& key_name) {
   const base::Value* value = dict.FindListKey(key_name);
-  if (!value || !value->is_list() || value->GetList().empty())
+  if (!value || !value->is_list() || value->GetListDeprecated().empty())
     return absl::nullopt;
 
   std::vector<std::string> categories;
-  for (const auto& item : value->GetList())
+  for (const auto& item : value->GetListDeprecated())
     categories.push_back(item.GetString());
 
   return categories;
diff --git a/components/services/app_service/public/cpp/preferred_apps_converter.cc b/components/services/app_service/public/cpp/preferred_apps_converter.cc
index 0114a7944..e83d2165 100644
--- a/components/services/app_service/public/cpp/preferred_apps_converter.cc
+++ b/components/services/app_service/public/cpp/preferred_apps_converter.cc
@@ -84,7 +84,7 @@
              << apps::kConditionValuesKey << "\" key with list value.";
     return nullptr;
   }
-  for (auto& condition_value : condition_values->GetList()) {
+  for (auto& condition_value : condition_values->GetListDeprecated()) {
     auto parsed_condition_value = ParseValueToConditionValue(condition_value);
     if (!parsed_condition_value) {
       DVLOG(0) << "Fail to parse condition. Cannot parse condition values";
@@ -102,7 +102,7 @@
     return nullptr;
   }
   auto intent_filter = apps::mojom::IntentFilter::New();
-  for (auto& condition : value->GetList()) {
+  for (auto& condition : value->GetListDeprecated()) {
     auto parsed_condition = ParseValueToCondition(condition);
     if (!parsed_condition) {
       DVLOG(0) << "Fail to parse intent filter. Cannot parse conditions.";
@@ -160,7 +160,7 @@
   }
 
   PreferredAppsList::PreferredApps preferred_apps;
-  for (auto& entry : preferred_apps_list->GetList()) {
+  for (auto& entry : preferred_apps_list->GetListDeprecated()) {
     auto* app_id = entry.FindStringKey(kAppIdKey);
     if (!app_id) {
       DVLOG(0) << "Fail to parse condition value. Cannot find \""
diff --git a/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc b/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc
index acc8599..b40d838 100644
--- a/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc
+++ b/components/services/app_service/public/cpp/preferred_apps_converter_unittest.cc
@@ -33,20 +33,21 @@
   auto* converted_preferred_apps =
       converted_value.FindKey(apps::kPreferredAppsKey);
   // Check that each entry is correct.
-  ASSERT_EQ(1u, converted_preferred_apps->GetList().size());
-  auto& entry = converted_preferred_apps->GetList()[0];
+  ASSERT_EQ(1u, converted_preferred_apps->GetListDeprecated().size());
+  auto& entry = converted_preferred_apps->GetListDeprecated()[0];
   EXPECT_EQ(kAppId1, *entry.FindStringKey(apps::kAppIdKey));
 
   auto* converted_intent_filter = entry.FindKey(apps::kIntentFilterKey);
   ASSERT_EQ(intent_filter->conditions.size(),
-            converted_intent_filter->GetList().size());
+            converted_intent_filter->GetListDeprecated().size());
 
   for (size_t i = 0; i < intent_filter->conditions.size(); i++) {
     auto& condition = intent_filter->conditions[i];
-    auto& converted_condition = converted_intent_filter->GetList()[i];
+    auto& converted_condition = converted_intent_filter->GetListDeprecated()[i];
     auto& condition_values = condition->condition_values;
     auto converted_condition_values =
-        converted_condition.FindKey(apps::kConditionValuesKey)->GetList();
+        converted_condition.FindKey(apps::kConditionValuesKey)
+            ->GetListDeprecated();
 
     EXPECT_EQ(static_cast<int>(condition->condition_type),
               converted_condition.FindIntKey(apps::kConditionTypeKey));
diff --git a/components/services/heap_profiling/json_exporter_unittest.cc b/components/services/heap_profiling/json_exporter_unittest.cc
index e8a1701..f6ba7ce 100644
--- a/components/services/heap_profiling/json_exporter_unittest.cc
+++ b/components/services/heap_profiling/json_exporter_unittest.cc
@@ -37,7 +37,7 @@
   if (!found_regions)
     return nullptr;
 
-  for (const base::Value& cur : found_regions->GetList()) {
+  for (const base::Value& cur : found_regions->GetListDeprecated()) {
     const base::Value* found_name =
         cur.FindKeyOfType("mf", base::Value::Type::STRING);
     if (!found_name)
@@ -51,7 +51,7 @@
 
 // Looks up a given string id from the string table. Returns -1 if not found.
 int GetIdFromStringTable(const base::Value* strings, const char* text) {
-  for (const auto& string : strings->GetList()) {
+  for (const auto& string : strings->GetListDeprecated()) {
     const base::Value* string_id =
         string.FindKeyOfType("id", base::Value::Type::INTEGER);
     const base::Value* string_text =
@@ -66,7 +66,7 @@
 // Looks up a given string from the string table. Returns empty string if not
 // found.
 std::string GetStringFromStringTable(const base::Value* strings, int sid) {
-  for (const auto& string : strings->GetList()) {
+  for (const auto& string : strings->GetListDeprecated()) {
     const base::Value* string_id =
         string.FindKeyOfType("id", base::Value::Type::INTEGER);
     if (string_id->GetInt() == sid) {
@@ -81,7 +81,7 @@
 }
 
 int GetNodeWithNameID(const base::Value* nodes, int sid) {
-  for (const auto& node : nodes->GetList()) {
+  for (const auto& node : nodes->GetListDeprecated()) {
     const base::Value* node_id =
         node.FindKeyOfType("id", base::Value::Type::INTEGER);
     const base::Value* node_name_sid =
@@ -95,7 +95,7 @@
 
 int GetOffsetForBacktraceID(const base::Value* nodes, int id) {
   int offset = 0;
-  for (const auto& node : nodes->GetList()) {
+  for (const auto& node : nodes->GetListDeprecated()) {
     if (node.GetInt() == id)
       return offset;
     offset++;
@@ -104,7 +104,7 @@
 }
 
 bool IsBacktraceInList(const base::Value* backtraces, int id, int parent) {
-  for (const auto& backtrace : backtraces->GetList()) {
+  for (const auto& backtrace : backtraces->GetListDeprecated()) {
     const base::Value* backtrace_id =
         backtrace.FindKeyOfType("id", base::Value::Type::INTEGER);
     if (backtrace_id == nullptr)
@@ -192,7 +192,7 @@
   ASSERT_TRUE(strings);
 
   // Validate the strings table.
-  EXPECT_EQ(5u, strings->GetList().size());
+  EXPECT_EQ(5u, strings->GetListDeprecated().size());
   int sid_unknown = GetIdFromStringTable(strings, "[unknown]");
   int sid_1234 = GetIdFromStringTable(strings, "pc:1234");
   int sid_5678 = GetIdFromStringTable(strings, "pc:5678");
@@ -210,7 +210,7 @@
   //   [1] => address: 5678  parent: 0
   //   [2] => address: 9012  parent: 0
   //   [3] => address: 9013  parent: 2
-  EXPECT_EQ(4u, nodes->GetList().size());
+  EXPECT_EQ(4u, nodes->GetListDeprecated().size());
   int id0 = GetNodeWithNameID(nodes, sid_1234);
   int id1 = GetNodeWithNameID(nodes, sid_5678);
   int id2 = GetNodeWithNameID(nodes, sid_9012);
@@ -241,9 +241,9 @@
 
   // Counts should be a list of two items, a 1 and a 2. The two matching 20-byte
   // allocations should be coalesced to produce the 2.
-  EXPECT_EQ(2u, counts->GetList().size());
-  EXPECT_EQ(2u, types->GetList().size());
-  EXPECT_EQ(2u, sizes->GetList().size());
+  EXPECT_EQ(2u, counts->GetListDeprecated().size());
+  EXPECT_EQ(2u, types->GetListDeprecated().size());
+  EXPECT_EQ(2u, sizes->GetListDeprecated().size());
 
   int node1 = GetOffsetForBacktraceID(backtraces, id1);
   int node3 = GetOffsetForBacktraceID(backtraces, id3);
@@ -251,16 +251,16 @@
   EXPECT_NE(-1, node3);
 
   // Validate node allocated with |stack1|.
-  EXPECT_EQ(2, counts->GetList()[node1].GetInt());
-  EXPECT_EQ(0, types->GetList()[node1].GetInt());
-  EXPECT_EQ(40, sizes->GetList()[node1].GetInt());
-  EXPECT_EQ(id1, backtraces->GetList()[node1].GetInt());
+  EXPECT_EQ(2, counts->GetListDeprecated()[node1].GetInt());
+  EXPECT_EQ(0, types->GetListDeprecated()[node1].GetInt());
+  EXPECT_EQ(40, sizes->GetListDeprecated()[node1].GetInt());
+  EXPECT_EQ(id1, backtraces->GetListDeprecated()[node1].GetInt());
 
   // Validate node allocated with |stack2|.
-  EXPECT_EQ(2, counts->GetList()[node3].GetInt());
-  EXPECT_EQ(0, types->GetList()[node3].GetInt());
-  EXPECT_EQ(44, sizes->GetList()[node3].GetInt());
-  EXPECT_EQ(id3, backtraces->GetList()[node3].GetInt());
+  EXPECT_EQ(2, counts->GetListDeprecated()[node3].GetInt());
+  EXPECT_EQ(0, types->GetListDeprecated()[node3].GetInt());
+  EXPECT_EQ(44, sizes->GetListDeprecated()[node3].GetInt());
+  EXPECT_EQ(id3, backtraces->GetListDeprecated()[node3].GetInt());
 
   // Validate that the partition alloc one got through.
   counts = heaps_v2->FindPath({"allocators", "partition_alloc", "counts"});
@@ -274,9 +274,9 @@
   ASSERT_TRUE(backtraces);
 
   // There should just be one entry for the partition_alloc allocation.
-  EXPECT_EQ(1u, counts->GetList().size());
-  EXPECT_EQ(1u, types->GetList().size());
-  EXPECT_EQ(1u, sizes->GetList().size());
+  EXPECT_EQ(1u, counts->GetListDeprecated().size());
+  EXPECT_EQ(1u, types->GetListDeprecated().size());
+  EXPECT_EQ(1u, sizes->GetListDeprecated().size());
 }
 
 // GetProcessMemoryMaps iterates through every memory region, making allocations
@@ -354,8 +354,8 @@
       heaps_v2->FindPath({"allocators", "partition_alloc", "types"});
   ASSERT_TRUE(types);
 
-  const auto& counts_list = counts->GetList();
-  const auto& types_list = types->GetList();
+  const auto& counts_list = counts->GetListDeprecated();
+  const auto& types_list = types->GetListDeprecated();
 
   // There should be three allocations, two coalesced ones, one with unique
   // context, and one with no context.
@@ -369,7 +369,7 @@
 
   // Reconstruct the map from type id to string.
   std::map<int, std::string> type_to_string;
-  for (const auto& type : types_map->GetList()) {
+  for (const auto& type : types_map->GetListDeprecated()) {
     const base::Value* id =
         type.FindKeyOfType("id", base::Value::Type::INTEGER);
     ASSERT_TRUE(id);
@@ -447,8 +447,8 @@
   const base::Value* malloc =
       parsed_json.value->FindPath({"heaps_v2", "allocators", "malloc"});
   const base::Value* malloc_sizes = malloc->FindKey("sizes");
-  EXPECT_EQ(1u, malloc_sizes->GetList().size());
-  EXPECT_EQ(0x9876543210ul, malloc_sizes->GetList()[0].GetDouble());
+  EXPECT_EQ(1u, malloc_sizes->GetListDeprecated().size());
+  EXPECT_EQ(0x9876543210ul, malloc_sizes->GetListDeprecated()[0].GetDouble());
 }
 #endif
 
diff --git a/components/services/storage/public/mojom/quota_client.mojom b/components/services/storage/public/mojom/quota_client.mojom
index 7d3a98c6..a56d4c34 100644
--- a/components/services/storage/public/mojom/quota_client.mojom
+++ b/components/services/storage/public/mojom/quota_client.mojom
@@ -26,7 +26,12 @@
                      blink.mojom.StorageType type)
       => (int64 usage);
 
-  // Returns a list of storage keys that have data in the `type` storage.
+  // Returns a list of storage keys that have data in the default bucket for
+  // `type` storage.
+  //
+  // This method is currently used to bootstrap the buckets table in the quota
+  // database with data produced by old code. No other uses should be added.
+  // We're planning to remove this around 2024.
   GetStorageKeysForType(blink.mojom.StorageType type)
       => (array<blink.mojom.StorageKey> storage_keys);
 
diff --git a/components/sessions/core/command_storage_backend.h b/components/sessions/core/command_storage_backend.h
index 1c7576d..854e4ba 100644
--- a/components/sessions/core/command_storage_backend.h
+++ b/components/sessions/core/command_storage_backend.h
@@ -14,6 +14,7 @@
 #include "base/callback_forward.h"
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted_delete_on_sequence.h"
+#include "base/time/time.h"
 #include "components/sessions/core/command_storage_manager.h"
 #include "components/sessions/core/session_command.h"
 #include "components/sessions/core/sessions_export.h"
diff --git a/components/shared_highlighting/ios/BUILD.gn b/components/shared_highlighting/ios/BUILD.gn
index db903449..b6f511a2 100644
--- a/components/shared_highlighting/ios/BUILD.gn
+++ b/components/shared_highlighting/ios/BUILD.gn
@@ -7,6 +7,8 @@
   sources = [
     "parsing_utils.h",
     "parsing_utils.mm",
+    "shared_highlighting_constants.h",
+    "shared_highlighting_constants.mm",
   ]
 
   deps = [
diff --git a/components/shared_highlighting/ios/shared_highlighting_constants.h b/components/shared_highlighting/ios/shared_highlighting_constants.h
new file mode 100644
index 0000000..866650e
--- /dev/null
+++ b/components/shared_highlighting/ios/shared_highlighting_constants.h
@@ -0,0 +1,15 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SHARED_HIGHLIGHTING_IOS_SHARED_HIGHLIGHTING_CONSTANTS_H_
+#define COMPONENTS_SHARED_HIGHLIGHTING_IOS_SHARED_HIGHLIGHTING_CONSTANTS_H_
+
+namespace shared_highlighting {
+
+// The URL pointing to a help article about shared highlighting.
+const extern char kLearnMoreUrl[];
+
+}  // namespace shared_highlighting
+
+#endif  // COMPONENTS_SHARED_HIGHLIGHTING_IOS_SHARED_HIGHLIGHTING_CONSTANTS_H_
diff --git a/components/shared_highlighting/ios/shared_highlighting_constants.mm b/components/shared_highlighting/ios/shared_highlighting_constants.mm
new file mode 100644
index 0000000..883c88c8
--- /dev/null
+++ b/components/shared_highlighting/ios/shared_highlighting_constants.mm
@@ -0,0 +1,16 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "components/shared_highlighting/ios/shared_highlighting_constants.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace shared_highlighting {
+
+// TODO(crbug.com/1290436): Replace this with the correct URL once it is known.
+const char kLearnMoreUrl[] = "https://www.google.com";
+
+}  // namespace shared_highlighting
diff --git a/components/signin/internal/identity_manager/account_info_util.cc b/components/signin/internal/identity_manager/account_info_util.cc
index f9f9f45..07e2c38 100644
--- a/components/signin/internal/identity_manager/account_info_util.cc
+++ b/components/signin/internal/identity_manager/account_info_util.cc
@@ -94,7 +94,7 @@
 
   // 1. Create "capability name" -> "boolean value" mapping.
   std::map<std::string, bool> boolean_capabilities;
-  for (const auto& capability_value : list->GetList()) {
+  for (const auto& capability_value : list->GetListDeprecated()) {
     const std::string* name =
         capability_value.FindStringKey(kAccountCapabilityNameKey);
     if (!name)
diff --git a/components/signin/internal/identity_manager/account_tracker_service.cc b/components/signin/internal/identity_manager/account_tracker_service.cc
index 96dcf189..c48334c 100644
--- a/components/signin/internal/identity_manager/account_tracker_service.cc
+++ b/components/signin/internal/identity_manager/account_tracker_service.cc
@@ -532,8 +532,9 @@
 
   base::DictionaryValue* dict = nullptr;
   ListPrefUpdate update(pref_service_, prefs::kAccountInfo);
-  for (size_t i = 0; i < update->GetList().size(); ++i, dict = nullptr) {
-    base::Value& dict_value = update->GetList()[i];
+  for (size_t i = 0; i < update->GetListDeprecated().size();
+       ++i, dict = nullptr) {
+    base::Value& dict_value = update->GetListDeprecated()[i];
     if (dict_value.is_dict()) {
       dict = static_cast<base::DictionaryValue*>(&dict_value);
       const std::string* account_key = dict->FindStringKey(kAccountKeyPath);
@@ -560,8 +561,8 @@
 void AccountTrackerService::LoadFromPrefs() {
   const base::Value* list = pref_service_->GetList(prefs::kAccountInfo);
   std::set<CoreAccountId> to_remove;
-  for (size_t i = 0; i < list->GetList().size(); ++i) {
-    const base::Value& dict_value = list->GetList()[i];
+  for (size_t i = 0; i < list->GetListDeprecated().size(); ++i) {
+    const base::Value& dict_value = list->GetListDeprecated()[i];
     if (dict_value.is_dict()) {
       const base::DictionaryValue& dict =
           base::Value::AsDictionaryValue(dict_value);
@@ -595,7 +596,7 @@
                                               : signin::Tribool::kFalse;
           // Migrate to kAccountChildAttributePath.
           ListPrefUpdate update(pref_service_, prefs::kAccountInfo);
-          base::Value* update_dict = &update->GetList()[i];
+          base::Value* update_dict = &update->GetListDeprecated()[i];
           DCHECK(update_dict->is_dict());
           SetAccountCapabilityPath(update_dict, kAccountChildAttributePath,
                                    account_info.is_child_account);
@@ -663,8 +664,9 @@
 
   base::DictionaryValue* dict = nullptr;
   ListPrefUpdate update(pref_service_, prefs::kAccountInfo);
-  for (size_t i = 0; i < update->GetList().size(); ++i, dict = nullptr) {
-    base::Value& dict_value = update->GetList()[i];
+  for (size_t i = 0; i < update->GetListDeprecated().size();
+       ++i, dict = nullptr) {
+    base::Value& dict_value = update->GetListDeprecated()[i];
     if (dict_value.is_dict()) {
       dict = static_cast<base::DictionaryValue*>(&dict_value);
       const std::string* account_key = dict->FindStringKey(kAccountKeyPath);
@@ -676,7 +678,7 @@
 
   if (!dict) {
     update->Append(base::Value(base::Value::Type::DICTIONARY));
-    base::Value& dict_value = update->GetList().back();
+    base::Value& dict_value = update->GetListDeprecated().back();
     DCHECK(dict_value.is_dict());
     dict = static_cast<base::DictionaryValue*>(&dict_value);
     dict->SetString(kAccountKeyPath, account_info.account_id.ToString());
diff --git a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
index eebe4d9..c1bf49a 100644
--- a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
+++ b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
@@ -1024,8 +1024,8 @@
                 ->GetAccountInfo(AccountKeyToAccountId(kAccountKeyAlpha))
                 .is_child_account);
   ListPrefUpdate update(prefs(), prefs::kAccountInfo);
-  ASSERT_FALSE(update->GetList().empty());
-  base::Value& dict = update->GetList()[0];
+  ASSERT_FALSE(update->GetListDeprecated().empty());
+  base::Value& dict = update->GetListDeprecated()[0];
   ASSERT_TRUE(dict.is_dict());
   const char kDeprecatedChildKey[] = "is_child_account";
   const char kNewChildKey[] = "is_supervised_child";
diff --git a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
index 3b12872..5e193416 100644
--- a/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
+++ b/components/signin/internal/identity_manager/gaia_cookie_manager_service.cc
@@ -275,14 +275,14 @@
   }
 
   // If there is nothing to check, terminate immediately.
-  if (value->GetList().size() == 0) {
+  if (value->GetListDeprecated().size() == 0) {
     CleanupTransientState();
     GetCheckConnectionInfoCompleted(true);
     return;
   }
 
   // Start a fetcher for each connection URL that needs to be checked.
-  for (const base::Value& elem : value->GetList()) {
+  for (const base::Value& elem : value->GetListDeprecated()) {
     if (!elem.is_dict())
       continue;
 
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java
index acadc91..d5f00b6 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/identitymanager/ProfileOAuth2TokenServiceDelegateTest.java
@@ -34,6 +34,7 @@
 import org.chromium.components.signin.AccessTokenData;
 import org.chromium.components.signin.AccountManagerFacadeProvider;
 import org.chromium.components.signin.AccountUtils;
+import org.chromium.components.signin.AuthException;
 import org.chromium.components.signin.test.util.FakeAccountManagerFacade;
 
 import java.util.List;
@@ -110,7 +111,7 @@
 
     @Test
     @SmallTest
-    public void testGetOAuth2AccessTokenOnSuccess() {
+    public void testGetOAuth2AccessTokenOnSuccess() throws AuthException {
         final String scope = "oauth2:http://example.com/scope";
         mAccountManagerFacade.addAccount(ACCOUNT);
         final AccessTokenData expectedToken = mAccountManagerFacade.getAccessToken(ACCOUNT, scope);
@@ -122,7 +123,7 @@
 
     @Test
     @SmallTest
-    public void testGetOAuth2AccessTokenOnFailure() {
+    public void testGetOAuth2AccessTokenOnFailure() throws AuthException {
         final String scope = "oauth2:http://example.com/scope";
         mAccountManagerFacade.addAccount(ACCOUNT);
         doReturn(null).when(mAccountManagerFacade).getAccessToken(any(Account.class), anyString());
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
index 87d94547..47183bc2 100644
--- a/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
+++ b/components/signin/public/android/java/src/org/chromium/components/signin/test/util/FakeAccountManagerFacade.java
@@ -20,6 +20,7 @@
 import org.chromium.components.signin.AccessTokenData;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountsChangeObserver;
+import org.chromium.components.signin.AuthException;
 import org.chromium.components.signin.ChildAccountStatus;
 
 import java.util.ArrayList;
@@ -80,7 +81,7 @@
     }
 
     @Override
-    public AccessTokenData getAccessToken(Account account, String scope) {
+    public AccessTokenData getAccessToken(Account account, String scope) throws AuthException {
         synchronized (mLock) {
             AccountHolder accountHolder = getAccountHolder(account);
             if (accountHolder.getAuthToken(scope) == null) {
@@ -172,13 +173,19 @@
     }
 
     @GuardedBy("mLock")
-    private AccountHolder getAccountHolder(Account account) {
+    private AccountHolder getAccountHolder(Account account) throws AuthException {
         for (AccountHolder accountHolder : mAccountHolders) {
             if (accountHolder.getAccount().equals(account)) {
                 return accountHolder;
             }
         }
-        throw new IllegalArgumentException("Cannot find account:" + account);
+        // Since token requests are asynchronous, sometimes they arrive after the account has been
+        // removed. Thus, throwing an unchecked exception here would cause test failures (see
+        // https://crbug.com/1205346 for details). On the other hand, AuthException thrown here
+        // will be caught by ProfileOAuth2TokenServiceDelegate and reported as a token request
+        // failure (which matches the behavior of the production code in the situation when a token
+        // is requested for an account that doesn't exist or has been removed).
+        throw new AuthException(/* isTransientError = */ false, "Cannot find account:" + account);
     }
 
     @MainThread
diff --git a/components/site_isolation/site_isolation_policy.cc b/components/site_isolation/site_isolation_policy.cc
index f76776d1..0099721c 100644
--- a/components/site_isolation/site_isolation_policy.cc
+++ b/components/site_isolation/site_isolation_policy.cc
@@ -182,7 +182,7 @@
                         site_isolation::prefs::kUserTriggeredIsolatedOrigins);
   base::Value* list = update.Get();
   base::Value value(origin.Serialize());
-  if (!base::Contains(list->GetList(), value))
+  if (!base::Contains(list->GetListDeprecated(), value))
     list->Append(std::move(value));
 }
 
@@ -235,7 +235,7 @@
     std::vector<url::Origin> origins;
     for (const auto& value : user_prefs::UserPrefs::Get(browser_context)
                                  ->GetList(prefs::kUserTriggeredIsolatedOrigins)
-                                 ->GetList()) {
+                                 ->GetListDeprecated()) {
       origins.push_back(url::Origin::Create(GURL(value.GetString())));
     }
 
diff --git a/components/soda/soda_installer.cc b/components/soda/soda_installer.cc
index 07bebcf..37658048 100644
--- a/components/soda/soda_installer.cc
+++ b/components/soda/soda_installer.cc
@@ -96,7 +96,7 @@
     SodaInstaller::GetInstance()->InstallSoda(global_prefs);
 
     if (global_prefs->GetList(prefs::kSodaRegisteredLanguagePacks)
-            ->GetList()
+            ->GetListDeprecated()
             .empty()) {
       // TODO(crbug.com/1200667): Register the default language used by
       // Dictation on ChromeOS.
@@ -111,7 +111,7 @@
 
     for (const auto& language :
          global_prefs->GetList(prefs::kSodaRegisteredLanguagePacks)
-             ->GetList()) {
+             ->GetListDeprecated()) {
       SodaInstaller::GetInstance()->InstallLanguage(language.GetString(),
                                                     global_prefs);
     }
@@ -262,7 +262,7 @@
 void SodaInstaller::RegisterLanguage(const std::string& language,
                                      PrefService* global_prefs) {
   ListPrefUpdate update(global_prefs, prefs::kSodaRegisteredLanguagePacks);
-  if (!base::Contains(update->GetList(), base::Value(language))) {
+  if (!base::Contains(update->GetListDeprecated(), base::Value(language))) {
     update->Append(language);
   }
 }
diff --git a/components/spellcheck/browser/spelling_service_client.cc b/components/spellcheck/browser/spelling_service_client.cc
index d49d96d..6877a46 100644
--- a/components/spellcheck/browser/spelling_service_client.cc
+++ b/components/spellcheck/browser/spelling_service_client.cc
@@ -74,7 +74,7 @@
   const base::Value* dicts_list =
       pref->GetList(spellcheck::prefs::kSpellCheckDictionaries);
   DCHECK(dicts_list->is_list());
-  base::Value::ConstListView dicts_lists_view = dicts_list->GetList();
+  base::Value::ConstListView dicts_lists_view = dicts_list->GetListDeprecated();
   if (0u < dicts_lists_view.size() && dicts_lists_view[0].is_string())
     dictionary = dicts_lists_view[0].GetString();
 
@@ -183,7 +183,7 @@
   const base::Value* dicts_list =
       pref->GetList(spellcheck::prefs::kSpellCheckDictionaries);
   DCHECK(dicts_list->is_list());
-  base::Value::ConstListView dicts_lists_view = dicts_list->GetList();
+  base::Value::ConstListView dicts_lists_view = dicts_list->GetListDeprecated();
   if (0u < dicts_lists_view.size() && dicts_lists_view[0].is_string())
     locale = dicts_lists_view[0].GetString();
 
@@ -270,7 +270,7 @@
   if (!misspellings)
     return true;
 
-  for (const base::Value& misspelling : misspellings->GetList()) {
+  for (const base::Value& misspelling : misspellings->GetListDeprecated()) {
     // Retrieve the i-th misspelling region and put it to the given vector. When
     // the Spelling service sends two or more suggestions, we read only the
     // first one because SpellCheckResult can store only one suggestion.
@@ -284,7 +284,7 @@
       return false;
     }
 
-    const base::Value& suggestion = suggestions->GetList()[0];
+    const base::Value& suggestion = suggestions->GetListDeprecated()[0];
     if (!suggestion.is_dict())
       return false;
 
diff --git a/components/sync/base/model_type_unittest.cc b/components/sync/base/model_type_unittest.cc
index 8a3d58a..93f127d 100644
--- a/components/sync/base/model_type_unittest.cc
+++ b/components/sync/base/model_type_unittest.cc
@@ -31,7 +31,7 @@
 
   std::unique_ptr<base::ListValue> value(ModelTypeSetToValue(model_types));
   ASSERT_TRUE(value->is_list());
-  base::Value::ConstListView value_list = value->GetList();
+  base::Value::ConstListView value_list = value->GetListDeprecated();
   ASSERT_EQ(2u, value_list.size());
   ASSERT_TRUE(value_list[0].is_string());
   EXPECT_EQ("Bookmarks", value_list[0].GetString());
diff --git a/components/sync/driver/sync_policy_handler.cc b/components/sync/driver/sync_policy_handler.cc
index d3aab528..367563b 100644
--- a/components/sync/driver/sync_policy_handler.cc
+++ b/components/sync/driver/sync_policy_handler.cc
@@ -67,7 +67,8 @@
       policies.GetValue(policy::key::kSyncTypesListDisabled);
 
   if (disabled_sync_types_value && disabled_sync_types_value->is_list()) {
-    base::Value::ConstListView list = disabled_sync_types_value->GetList();
+    base::Value::ConstListView list =
+        disabled_sync_types_value->GetListDeprecated();
     for (const base::Value& type_name : list) {
       if (!type_name.is_string())
         continue;
diff --git a/components/sync/protocol/proto_value_conversions_unittest.cc b/components/sync/protocol/proto_value_conversions_unittest.cc
index d19405b..9c384a0b3 100644
--- a/components/sync/protocol/proto_value_conversions_unittest.cc
+++ b/components/sync/protocol/proto_value_conversions_unittest.cc
@@ -169,19 +169,19 @@
   EXPECT_EQ(icon_url, encoded_icon_url);
   base::ListValue* meta_info_list;
   ASSERT_TRUE(value->GetList("meta_info", &meta_info_list));
-  EXPECT_EQ(2u, meta_info_list->GetList().size());
+  EXPECT_EQ(2u, meta_info_list->GetListDeprecated().size());
   const base::Value* meta_info_value;
   const base::DictionaryValue* meta_info;
   std::string meta_key;
   std::string meta_value;
-  meta_info_value = &meta_info_list->GetList()[0];
+  meta_info_value = &meta_info_list->GetListDeprecated()[0];
   ASSERT_TRUE(meta_info_value->is_dict());
   meta_info = &base::Value::AsDictionaryValue(*meta_info_value);
   EXPECT_TRUE(meta_info->GetString("key", &meta_key));
   EXPECT_TRUE(meta_info->GetString("value", &meta_value));
   EXPECT_EQ("key1", meta_key);
   EXPECT_EQ("value1", meta_value);
-  meta_info_value = &meta_info_list->GetList()[1];
+  meta_info_value = &meta_info_list->GetListDeprecated()[1];
   ASSERT_TRUE(meta_info_value->is_dict());
   meta_info = &base::Value::AsDictionaryValue(*meta_info_value);
   EXPECT_TRUE(meta_info->GetString("key", &meta_key));
@@ -225,7 +225,8 @@
   if (!value.GetList(path, &entities_list))
     return false;
 
-  const base::Value& entry_dictionary_value = entities_list->GetList()[0];
+  const base::Value& entry_dictionary_value =
+      entities_list->GetListDeprecated()[0];
   if (!entry_dictionary_value.is_dict())
     return false;
 
diff --git a/components/sync/test/fake_server/fake_server_verifier.cc b/components/sync/test/fake_server/fake_server_verifier.cc
index 24cf320..a088d1a 100644
--- a/components/sync/test/fake_server/fake_server_verifier.cc
+++ b/components/sync/test/fake_server/fake_server_verifier.cc
@@ -80,9 +80,9 @@
   base::ListValue* entity_list = nullptr;
   if (!entities->GetList(model_type_string, &entity_list)) {
     return UnknownTypeAssertionFailure(model_type_string);
-  } else if (expected_count != entity_list->GetList().size()) {
-    return VerificationCountAssertionFailure(entity_list->GetList().size(),
-                                             expected_count)
+  } else if (expected_count != entity_list->GetListDeprecated().size()) {
+    return VerificationCountAssertionFailure(
+               entity_list->GetListDeprecated().size(), expected_count)
            << "\n\n"
            << ConvertFakeServerContentsToString(*entities);
   }
@@ -105,7 +105,7 @@
   size_t actual_count = 0;
   if (entities->GetList(model_type_string, &entity_list)) {
     base::Value name_value(name);
-    for (const base::Value& entity : entity_list->GetList()) {
+    for (const base::Value& entity : entity_list->GetListDeprecated()) {
       if (name_value == entity)
         actual_count++;
     }
diff --git a/components/sync_device_info/device_info_prefs.cc b/components/sync_device_info/device_info_prefs.cc
index b1b8f5a..3194c04 100644
--- a/components/sync_device_info/device_info_prefs.cc
+++ b/components/sync_device_info/device_info_prefs.cc
@@ -62,7 +62,8 @@
 bool DeviceInfoPrefs::IsRecentLocalCacheGuid(
     const std::string& cache_guid) const {
   base::Value::ConstListView recent_local_cache_guids =
-      pref_service_->GetList(kDeviceInfoRecentGUIDsWithTimestamps)->GetList();
+      pref_service_->GetList(kDeviceInfoRecentGUIDsWithTimestamps)
+          ->GetListDeprecated();
 
   for (const auto& v : recent_local_cache_guids) {
     if (MatchesGuidInDictionary(v, cache_guid)) {
@@ -77,8 +78,8 @@
   ListPrefUpdate update_cache_guids(pref_service_,
                                     kDeviceInfoRecentGUIDsWithTimestamps);
 
-  for (auto it = update_cache_guids->GetList().begin();
-       it != update_cache_guids->GetList().end(); it++) {
+  for (auto it = update_cache_guids->GetListDeprecated().begin();
+       it != update_cache_guids->GetListDeprecated().end(); it++) {
     if (MatchesGuidInDictionary(*it, cache_guid)) {
       // Remove it from the list, to be reinserted below, in the first
       // position.
@@ -93,11 +94,13 @@
       kTimestampKey,
       base::Value(clock_->Now().ToDeltaSinceWindowsEpoch().InDays()));
 
-  update_cache_guids->Insert(update_cache_guids->GetList().begin(),
+  update_cache_guids->Insert(update_cache_guids->GetListDeprecated().begin(),
                              std::move(new_entry));
 
-  while (update_cache_guids->GetList().size() > kMaxLocalCacheGuidsStored) {
-    update_cache_guids->EraseListIter(update_cache_guids->GetList().end() - 1);
+  while (update_cache_guids->GetListDeprecated().size() >
+         kMaxLocalCacheGuidsStored) {
+    update_cache_guids->EraseListIter(
+        update_cache_guids->GetListDeprecated().end() - 1);
   }
 }
 
diff --git a/components/sync_device_info/device_info_prefs_unittest.cc b/components/sync_device_info/device_info_prefs_unittest.cc
index 7221ed1..94495b2a 100644
--- a/components/sync_device_info/device_info_prefs_unittest.cc
+++ b/components/sync_device_info/device_info_prefs_unittest.cc
@@ -58,17 +58,17 @@
   // which is a string instead of a dictionary.
   ListPrefUpdate cache_guids_update(&pref_service_,
                                     kDeviceInfoRecentGUIDsWithTimestamps);
-  cache_guids_update->Insert(cache_guids_update->GetList().begin(),
+  cache_guids_update->Insert(cache_guids_update->GetListDeprecated().begin(),
                              base::Value("corrupt_string_entry"));
 
   // Add another corrupt entry: in this case the entry is a dictionary, but it
   // contains no timestamp.
-  cache_guids_update->Insert(cache_guids_update->GetList().begin(),
+  cache_guids_update->Insert(cache_guids_update->GetListDeprecated().begin(),
                              base::Value(base::Value::Type::DICTIONARY));
 
   // The end result is the list contains three entries among which one is valid.
   ASSERT_EQ(3u, pref_service_.GetList(kDeviceInfoRecentGUIDsWithTimestamps)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
   ASSERT_TRUE(device_info_prefs_.IsRecentLocalCacheGuid("guid1"));
 
@@ -78,7 +78,7 @@
 
   // |guid1| should be the only entry in the list.
   EXPECT_EQ(1u, pref_service_.GetList(kDeviceInfoRecentGUIDsWithTimestamps)
-                    ->GetList()
+                    ->GetListDeprecated()
                     .size());
 }
 
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc
index 94f35c0..7fd52c4 100644
--- a/components/translate/core/browser/translate_prefs.cc
+++ b/components/translate/core/browser/translate_prefs.cc
@@ -121,7 +121,7 @@
     // languages, it probably means that this source language was set to never
     // be translated after the old pref was deprecated, so avoid this conflict.
     const auto& never_translate_languages =
-        prefs->GetList(prefs::kBlockedLanguages)->GetList();
+        prefs->GetList(prefs::kBlockedLanguages)->GetListDeprecated();
     if (std::any_of(
             never_translate_languages.begin(), never_translate_languages.end(),
             [&old_language_pair](const base::Value& never_translate_language) {
@@ -299,7 +299,7 @@
   language::ToTranslateLanguageSynonym(&canonical_lang);
   const base::Value* blocked =
       prefs_->GetList(translate::prefs::kBlockedLanguages);
-  return base::Contains(blocked->GetList(),
+  return base::Contains(blocked->GetListDeprecated(),
                         base::Value(std::move(canonical_lang)));
 }
 
@@ -345,7 +345,7 @@
   }
 
   std::vector<std::string> languages;
-  for (const auto& language : fluent_languages_value->GetList()) {
+  for (const auto& language : fluent_languages_value->GetListDeprecated()) {
     std::string chrome_language(language.GetString());
     language::ToChromeLanguageSynonym(&chrome_language);
     languages.push_back(chrome_language);
@@ -1026,7 +1026,7 @@
     ListPrefUpdate deprecated_prompt_list_update(
         prefs_, kPrefNeverPromptSitesDeprecated);
     base::Value* deprecated_list = deprecated_prompt_list_update.Get();
-    for (auto& site : deprecated_list->GetList()) {
+    for (auto& site : deprecated_list->GetListDeprecated()) {
       if (!never_prompt_list->FindKey(site.GetString()) ||
           !base::ValueToTime(never_prompt_list->FindKey(site.GetString()))) {
         never_prompt_list->SetKey(site.GetString(),
@@ -1060,7 +1060,8 @@
   const base::Value* never_prompt_list = prefs_->GetList(pref_id);
   if (!never_prompt_list)
     return false;
-  for (const base::Value& value_in_list : never_prompt_list->GetList()) {
+  for (const base::Value& value_in_list :
+       never_prompt_list->GetListDeprecated()) {
     if (value_in_list.is_string() && value_in_list.GetString() == value)
       return true;
   }
@@ -1091,7 +1092,7 @@
     return;
   }
 
-  auto list_view = never_prompt_list->GetList();
+  auto list_view = never_prompt_list->GetListDeprecated();
   never_prompt_list->EraseListIter(std::find_if(
       list_view.begin(), list_view.end(),
       [value](const base::Value& value_in_list) {
@@ -1101,7 +1102,9 @@
 
 size_t TranslatePrefs::GetListSize(const char* pref_id) const {
   const base::Value* never_prompt_list = prefs_->GetList(pref_id);
-  return never_prompt_list == nullptr ? 0 : never_prompt_list->GetList().size();
+  return never_prompt_list == nullptr
+             ? 0
+             : never_prompt_list->GetListDeprecated().size();
 }
 
 bool TranslatePrefs::IsDictionaryEmpty(const char* pref_id) const {
diff --git a/components/translate/core/browser/translate_prefs_unittest.cc b/components/translate/core/browser/translate_prefs_unittest.cc
index f2a22a4a..40a85136 100644
--- a/components/translate/core/browser/translate_prefs_unittest.cc
+++ b/components/translate/core/browser/translate_prefs_unittest.cc
@@ -940,7 +940,7 @@
   translate_prefs_->AddValueToNeverPromptList(
       TranslatePrefs::kPrefNeverPromptSitesDeprecated, "migratedWrong.com");
   EXPECT_EQ(prefs_.Get(TranslatePrefs::kPrefNeverPromptSitesDeprecated)
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             2u);
   // Also put one of those sites on the new pref but migrated incorrectly.
@@ -955,7 +955,7 @@
                   base::Time::Now() - base::Days(1), base::Time::Max()),
               ElementsAre("migratedWrong.com", "unmigrated.com"));
   EXPECT_EQ(prefs_.Get(TranslatePrefs::kPrefNeverPromptSitesDeprecated)
-                ->GetList()
+                ->GetListDeprecated()
                 .size(),
             0u);
 }
diff --git a/components/translate/translate_internals/translate_internals_handler.cc b/components/translate/translate_internals/translate_internals_handler.cc
index 9b7602f..1c47977e 100644
--- a/components/translate/translate_internals/translate_internals_handler.cc
+++ b/components/translate/translate_internals/translate_internals_handler.cc
@@ -164,27 +164,27 @@
   std::unique_ptr<translate::TranslatePrefs> translate_prefs =
       GetTranslateClient()->GetTranslatePrefs();
 
-  if (!args->GetList()[0].is_string())
+  if (!args->GetListDeprecated()[0].is_string())
     return;
 
-  const std::string& pref_name = args->GetList()[0].GetString();
+  const std::string& pref_name = args->GetListDeprecated()[0].GetString();
   if (pref_name == "blocked_languages") {
-    if (!args->GetList()[1].is_string())
+    if (!args->GetListDeprecated()[1].is_string())
       return;
-    const std::string& language = args->GetList()[1].GetString();
+    const std::string& language = args->GetListDeprecated()[1].GetString();
     translate_prefs->UnblockLanguage(language);
   } else if (pref_name == "site_blocklist") {
-    if (!args->GetList()[1].is_string())
+    if (!args->GetListDeprecated()[1].is_string())
       return;
-    const std::string& site = args->GetList()[1].GetString();
+    const std::string& site = args->GetListDeprecated()[1].GetString();
     translate_prefs->RemoveSiteFromNeverPromptList(site);
   } else if (pref_name == "allowlists") {
-    if (!args->GetList()[1].is_string())
+    if (!args->GetListDeprecated()[1].is_string())
       return;
-    if (!args->GetList()[2].is_string())
+    if (!args->GetListDeprecated()[2].is_string())
       return;
-    const std::string& from = args->GetList()[1].GetString();
-    const std::string& to = args->GetList()[2].GetString();
+    const std::string& from = args->GetListDeprecated()[1].GetString();
+    const std::string& to = args->GetListDeprecated()[2].GetString();
     translate_prefs->RemoveLanguagePairFromAlwaysTranslateList(from, to);
   } else {
     return;
@@ -198,18 +198,18 @@
   std::unique_ptr<translate::TranslatePrefs> translate_prefs =
       GetTranslateClient()->GetTranslatePrefs();
 
-  if (!args->GetList()[0].is_string())
+  if (!args->GetListDeprecated()[0].is_string())
     return;
 
-  const std::string& new_value = args->GetList()[0].GetString();
+  const std::string& new_value = args->GetListDeprecated()[0].GetString();
   translate_prefs->SetRecentTargetLanguage(new_value);
 
   SendPrefsToJs();
 }
 
 void TranslateInternalsHandler::OnOverrideCountry(const base::ListValue* args) {
-  if (args->GetList()[0].is_string()) {
-    const std::string& country = args->GetList()[0].GetString();
+  if (args->GetListDeprecated()[0].is_string()) {
+    const std::string& country = args->GetListDeprecated()[0].GetString();
     variations::VariationsService* variations_service = GetVariationsService();
     SendCountryToJs(
         variations_service->OverrideStoredPermanentCountry(country));
diff --git a/components/ukm/ukm_service_unittest.cc b/components/ukm/ukm_service_unittest.cc
index d85ac37..b95fcec 100644
--- a/components/ukm/ukm_service_unittest.cc
+++ b/components/ukm/ukm_service_unittest.cc
@@ -161,7 +161,7 @@
 
   int GetPersistedLogCount() {
     const base::Value* list_value = prefs_.GetList(prefs::kUkmUnsentLogStore);
-    return list_value->GetList().size();
+    return list_value->GetListDeprecated().size();
   }
 
   Report GetPersistedReport() {
diff --git a/components/update_client/BUILD.gn b/components/update_client/BUILD.gn
index 2be2468..b334c4c 100644
--- a/components/update_client/BUILD.gn
+++ b/components/update_client/BUILD.gn
@@ -142,8 +142,6 @@
     "update_query_params.h",
     "update_query_params_delegate.cc",
     "update_query_params_delegate.h",
-    "updater_state.cc",
-    "updater_state.h",
     "url_fetcher_downloader.cc",
     "url_fetcher_downloader.h",
     "utils.cc",
@@ -167,13 +165,8 @@
     sources += [
       "background_downloader_win.cc",
       "background_downloader_win.h",
-      "updater_state_win.cc",
     ]
   }
-
-  if (is_mac) {
-    sources += [ "updater_state_mac.mm" ]
-  }
 }
 
 static_library("test_support") {
@@ -255,7 +248,6 @@
     "update_checker_unittest.cc",
     "update_client_unittest.cc",
     "update_query_params_unittest.cc",
-    "updater_state_unittest.cc",
     "utils_unittest.cc",
   ]
 
diff --git a/components/update_client/component_patcher.cc b/components/update_client/component_patcher.cc
index de1106a..fc58e4f 100644
--- a/components/update_client/component_patcher.cc
+++ b/components/update_client/component_patcher.cc
@@ -66,13 +66,13 @@
   if (!commands_) {
     DonePatching(UnpackerError::kDeltaBadCommands, 0);
   } else {
-    next_command_ = commands_->GetList().begin();
+    next_command_ = commands_->GetListDeprecated().begin();
     PatchNextFile();
   }
 }
 
 void ComponentPatcher::PatchNextFile() {
-  if (next_command_ == commands_->GetList().end()) {
+  if (next_command_ == commands_->GetListDeprecated().end()) {
     DonePatching(UnpackerError::kNone, 0);
     return;
   }
diff --git a/components/update_client/configurator.h b/components/update_client/configurator.h
index 2f7d326..657b9e3 100644
--- a/components/update_client/configurator.h
+++ b/components/update_client/configurator.h
@@ -31,9 +31,9 @@
 class ProtocolHandlerFactory;
 class UnzipperFactory;
 
+using UpdaterStateAttributes = base::flat_map<std::string, std::string>;
 using UpdaterStateProvider =
-    base::RepeatingCallback<base::flat_map<std::string, std::string>(
-        bool is_machine)>;
+    base::RepeatingCallback<UpdaterStateAttributes(bool is_machine)>;
 
 // Controls the component updater behavior.
 // TODO(sorin): this class will be split soon in two. One class controls
diff --git a/components/update_client/ping_manager.cc b/components/update_client/ping_manager.cc
index 170ac8e..ab46b49 100644
--- a/components/update_client/ping_manager.cc
+++ b/components/update_client/ping_manager.cc
@@ -119,7 +119,7 @@
               config_->GetLang(), config_->GetChannel(),
               config_->GetOSLongName(), config_->GetDownloadPreference(),
               config_->IsMachineExternallyManaged(),
-              config_->ExtraRequestParams(), nullptr, std::move(apps))),
+              config_->ExtraRequestParams(), {}, std::move(apps))),
       false, base::BindOnce(&PingSender::SendPingComplete, this));
 }
 
diff --git a/components/update_client/ping_manager_unittest.cc b/components/update_client/ping_manager_unittest.cc
index 07d321c..14ee2510 100644
--- a/components/update_client/ping_manager_unittest.cc
+++ b/components/update_client/ping_manager_unittest.cc
@@ -180,7 +180,7 @@
               request->FindPath({"os", "platform"})->GetString());
     EXPECT_TRUE(request->FindPath({"os", "version"})->is_string());
 
-    const auto& app = request->FindKey("app")->GetList()[0];
+    const auto& app = request->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ("abc", app.FindKey("appid")->GetString());
     EXPECT_EQ("ap1", app.FindKey("ap")->GetString());
     EXPECT_EQ("BRND", app.FindKey("brand")->GetString());
@@ -188,7 +188,7 @@
     EXPECT_EQ("c1", app.FindKey("cohort")->GetString());
     EXPECT_EQ("cn1", app.FindKey("cohortname")->GetString());
     EXPECT_EQ("ch1", app.FindKey("cohorthint")->GetString());
-    const auto& event = app.FindKey("event")->GetList()[0];
+    const auto& event = app.FindKey("event")->GetListDeprecated()[0];
     EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
     EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
     EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
@@ -222,10 +222,10 @@
       const auto root = base::JSONReader::Read(msg);
       ASSERT_TRUE(root);
       const auto* request = root->FindKey("request");
-      const auto& app = request->FindKey("app")->GetList()[0];
+      const auto& app = request->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ("abc", app.FindKey("appid")->GetString());
       EXPECT_EQ("1.0", app.FindKey("version")->GetString());
-      const auto& event = app.FindKey("event")->GetList()[0];
+      const auto& event = app.FindKey("event")->GetListDeprecated()[0];
       EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
       EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
       EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
@@ -262,10 +262,10 @@
       const auto root = base::JSONReader::Read(msg);
       ASSERT_TRUE(root);
       const auto* request = root->FindKey("request");
-      const auto& app = request->FindKey("app")->GetList()[0];
+      const auto& app = request->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ("abc", app.FindKey("appid")->GetString());
       EXPECT_EQ("1.0", app.FindKey("version")->GetString());
-      const auto& event = app.FindKey("event")->GetList()[0];
+      const auto& event = app.FindKey("event")->GetListDeprecated()[0];
       EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
       EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
       EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
@@ -302,10 +302,10 @@
       const auto root = base::JSONReader::Read(msg);
       ASSERT_TRUE(root);
       const auto* request = root->FindKey("request");
-      const auto& app = request->FindKey("app")->GetList()[0];
+      const auto& app = request->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ("abc", app.FindKey("appid")->GetString());
       EXPECT_EQ("1.0", app.FindKey("version")->GetString());
-      const auto& event = app.FindKey("event")->GetList()[0];
+      const auto& event = app.FindKey("event")->GetListDeprecated()[0];
       EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
       EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
       EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
@@ -330,10 +330,10 @@
       const auto root = base::JSONReader::Read(msg);
       ASSERT_TRUE(root);
       const auto* request = root->FindKey("request");
-      const auto& app = request->FindKey("app")->GetList()[0];
+      const auto& app = request->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ("abc", app.FindKey("appid")->GetString());
       EXPECT_EQ("1.2.3.4", app.FindKey("version")->GetString());
-      const auto& event = app.FindKey("event")->GetList()[0];
+      const auto& event = app.FindKey("event")->GetListDeprecated()[0];
       EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
       EXPECT_EQ(4, event.FindKey("eventtype")->GetInt());
       EXPECT_EQ("1.2.3.4", event.FindKey("previousversion")->GetString());
@@ -359,10 +359,10 @@
     const auto root = base::JSONReader::Read(msg);
     ASSERT_TRUE(root);
     const auto* request = root->FindKey("request");
-    const auto& app = request->FindKey("app")->GetList()[0];
+    const auto& app = request->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ("abc", app.FindKey("appid")->GetString());
     EXPECT_EQ("1.2.3.4", app.FindKey("version")->GetString());
-    const auto& event = app.FindKey("event")->GetList()[0];
+    const auto& event = app.FindKey("event")->GetListDeprecated()[0];
     EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
     EXPECT_EQ(2, event.FindKey("eventtype")->GetInt());
     EXPECT_EQ("1.2.3.4", event.FindKey("nextversion")->GetString());
@@ -415,19 +415,19 @@
       const auto root = base::JSONReader::Read(msg);
       ASSERT_TRUE(root);
       const auto* request = root->FindKey("request");
-      const auto& app = request->FindKey("app")->GetList()[0];
+      const auto& app = request->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ("abc", app.FindKey("appid")->GetString());
       EXPECT_EQ("1.0", app.FindKey("version")->GetString());
-      EXPECT_EQ(4u, app.FindKey("event")->GetList().size());
+      EXPECT_EQ(4u, app.FindKey("event")->GetListDeprecated().size());
       {
-        const auto& event = app.FindKey("event")->GetList()[0];
+        const auto& event = app.FindKey("event")->GetListDeprecated()[0];
         EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
         EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
         EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
         EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
       }
       {
-        const auto& event = app.FindKey("event")->GetList()[1];
+        const auto& event = app.FindKey("event")->GetListDeprecated()[1];
         EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
         EXPECT_EQ(14, event.FindKey("eventtype")->GetInt());
         EXPECT_EQ(987, event.FindKey("download_time_ms")->GetDouble());
@@ -440,7 +440,7 @@
         EXPECT_EQ("http://host1/path1", event.FindKey("url")->GetString());
       }
       {
-        const auto& event = app.FindKey("event")->GetList()[2];
+        const auto& event = app.FindKey("event")->GetListDeprecated()[2];
         EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
         EXPECT_EQ(14, event.FindKey("eventtype")->GetInt());
         EXPECT_EQ(9870, event.FindKey("download_time_ms")->GetDouble());
@@ -452,7 +452,7 @@
         EXPECT_EQ("http://host2/path2", event.FindKey("url")->GetString());
       }
       {
-        const auto& event = app.FindKey("event")->GetList()[3];
+        const auto& event = app.FindKey("event")->GetListDeprecated()[3];
         EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
         EXPECT_EQ(14, event.FindKey("eventtype")->GetInt());
         EXPECT_EQ(9007199254740990,
diff --git a/components/update_client/protocol_parser_json.cc b/components/update_client/protocol_parser_json.cc
index d4756ca..028ca0f 100644
--- a/components/update_client/protocol_parser_json.cc
+++ b/components/update_client/protocol_parser_json.cc
@@ -66,7 +66,7 @@
     return false;
   }
 
-  for (const auto& package : package_node->GetList()) {
+  for (const auto& package : package_node->GetListDeprecated()) {
     if (!package.is_dict()) {
       *error = "'package' is not a dictionary.";
       return false;
@@ -113,7 +113,7 @@
   if (!action_node || !action_node->is_list())
     return;
 
-  const auto& action_list = action_node->GetList();
+  const auto& action_list = action_node->GetListDeprecated();
   if (action_list.empty() || !action_list[0].is_dict())
     return;
 
@@ -133,7 +133,7 @@
     return false;
   }
 
-  for (const auto& url : url_node->GetList()) {
+  for (const auto& url : url_node->GetListDeprecated()) {
     if (!url.is_dict())
       continue;
     const auto* codebase = url.FindKey("codebase");
@@ -323,7 +323,7 @@
 
   const auto* app_node = response_node->FindKey("app");
   if (app_node && app_node->is_list()) {
-    for (const auto& app : app_node->GetList()) {
+    for (const auto& app : app_node->GetListDeprecated()) {
       Result result;
       std::string error;
       if (ParseApp(app, &result, &error))
diff --git a/components/update_client/protocol_serializer.cc b/components/update_client/protocol_serializer.cc
index 5be553c..dc9bba9 100644
--- a/components/update_client/protocol_serializer.cc
+++ b/components/update_client/protocol_serializer.cc
@@ -23,7 +23,6 @@
 #include "components/update_client/activity_data_service.h"
 #include "components/update_client/persisted_data.h"
 #include "components/update_client/update_query_params.h"
-#include "components/update_client/updater_state.h"
 #include "components/update_client/utils.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -108,7 +107,7 @@
     const std::string& download_preference,
     absl::optional<bool> domain_joined,
     const base::flat_map<std::string, std::string>& additional_attributes,
-    const std::map<std::string, std::string>* updater_state_attributes,
+    const base::flat_map<std::string, std::string>& updater_state_attributes,
     std::vector<protocol_request::App> apps) {
   protocol_request::Request request;
   request.protocol_version = kProtocolVersion;
@@ -156,38 +155,38 @@
   request.os.service_pack = GetServicePack();
   request.os.arch = base::SysInfo().OperatingSystemArchitecture();
 
-  if (updater_state_attributes) {
+  if (!updater_state_attributes.empty()) {
     request.updater = absl::make_optional<protocol_request::Updater>();
-    auto it = updater_state_attributes->find("name");
-    if (it != updater_state_attributes->end())
+    auto it = updater_state_attributes.find("name");
+    if (it != updater_state_attributes.end())
       request.updater->name = it->second;
-    it = updater_state_attributes->find("version");
-    if (it != updater_state_attributes->end())
+    it = updater_state_attributes.find("version");
+    if (it != updater_state_attributes.end())
       request.updater->version = it->second;
-    it = updater_state_attributes->find("ismachine");
-    if (it != updater_state_attributes->end()) {
+    it = updater_state_attributes.find("ismachine");
+    if (it != updater_state_attributes.end()) {
       DCHECK(it->second == "0" || it->second == "1");
       request.updater->is_machine = it->second != "0";
     }
-    it = updater_state_attributes->find("autoupdatecheckenabled");
-    if (it != updater_state_attributes->end()) {
+    it = updater_state_attributes.find("autoupdatecheckenabled");
+    if (it != updater_state_attributes.end()) {
       DCHECK(it->second == "0" || it->second == "1");
       request.updater->autoupdate_check_enabled = it->second != "0";
     }
-    it = updater_state_attributes->find("laststarted");
-    if (it != updater_state_attributes->end()) {
+    it = updater_state_attributes.find("laststarted");
+    if (it != updater_state_attributes.end()) {
       int last_started = 0;
       if (base::StringToInt(it->second, &last_started))
         request.updater->last_started = last_started;
     }
-    it = updater_state_attributes->find("lastchecked");
-    if (it != updater_state_attributes->end()) {
+    it = updater_state_attributes.find("lastchecked");
+    if (it != updater_state_attributes.end()) {
       int last_checked = 0;
       if (base::StringToInt(it->second, &last_checked))
         request.updater->last_checked = last_checked;
     }
-    it = updater_state_attributes->find("updatepolicy");
-    if (it != updater_state_attributes->end()) {
+    it = updater_state_attributes.find("updatepolicy");
+    if (it != updater_state_attributes.end()) {
       int update_policy = 0;
       if (base::StringToInt(it->second, &update_policy))
         request.updater->update_policy = update_policy;
diff --git a/components/update_client/protocol_serializer.h b/components/update_client/protocol_serializer.h
index 7892ab3..89f8766 100644
--- a/components/update_client/protocol_serializer.h
+++ b/components/update_client/protocol_serializer.h
@@ -44,7 +44,7 @@
     const std::string& download_preference,
     absl::optional<bool> domain_joined,
     const base::flat_map<std::string, std::string>& additional_attributes,
-    const std::map<std::string, std::string>* updater_state_attributes,
+    const base::flat_map<std::string, std::string>& updater_state_attributes,
     std::vector<protocol_request::App> apps);
 
 protocol_request::App MakeProtocolApp(
diff --git a/components/update_client/protocol_serializer_fuzzer.cc b/components/update_client/protocol_serializer_fuzzer.cc
index 7276bff..bfca2b6ec 100644
--- a/components/update_client/protocol_serializer_fuzzer.cc
+++ b/components/update_client/protocol_serializer_fuzzer.cc
@@ -31,7 +31,6 @@
 
   // Independently, try serializing a Request.
   base::flat_map<std::string, std::string> additional_attributes;
-  std::map<std::string, std::string> updater_state_attributes;
   std::vector<protocol_request::App> apps;
 
   // Share |data| between |MakeProtocolRequest| args
@@ -49,7 +48,7 @@
       GetUtf8String() /* os_long_name */,
       GetUtf8String() /* download_preference */,
       absl::nullopt /* domain_joined */, additional_attributes,
-      &updater_state_attributes, std::move(apps));
+      {} /*updater_state_attributes*/, std::move(apps));
 
   update_client::ProtocolHandlerFactoryJSON factory;
   std::unique_ptr<ProtocolSerializer> serializer = factory.CreateSerializer();
diff --git a/components/update_client/protocol_serializer_json.cc b/components/update_client/protocol_serializer_json.cc
index 1977820..38a6a8d 100644
--- a/components/update_client/protocol_serializer_json.cc
+++ b/components/update_client/protocol_serializer_json.cc
@@ -12,7 +12,6 @@
 #include "base/values.h"
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
-#include "components/update_client/updater_state.h"
 
 namespace update_client {
 
diff --git a/components/update_client/protocol_serializer_json_unittest.cc b/components/update_client/protocol_serializer_json_unittest.cc
index 27c46d0a..1f57477 100644
--- a/components/update_client/protocol_serializer_json_unittest.cc
+++ b/components/update_client/protocol_serializer_json_unittest.cc
@@ -18,7 +18,6 @@
 #include "components/update_client/protocol_definition.h"
 #include "components/update_client/protocol_serializer.h"
 #include "components/update_client/test_activity_data_service.h"
-#include "components/update_client/updater_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/re2/src/re2/re2.h"
@@ -59,7 +58,7 @@
         MakeProtocolRequest(false, "{15160585-8ADE-4D3C-839B-1281A6035D1F}",
                             "prod_id", "1.0", "lang", "channel", "OS",
                             "cacheable", absl::nullopt, {{"extra", "params"}},
-                            nullptr, std::move(apps)));
+                            {}, std::move(apps)));
     constexpr char regex[] =
         R"({"request":{"@os":"\w+","@updater":"prod_id",)"
         R"("acceptformat":"crx3",)"
@@ -97,7 +96,7 @@
 
     const auto request = std::make_unique<ProtocolSerializerJSON>()->Serialize(
         MakeProtocolRequest(false, "{15160585-8ADE-4D3C-839B-1281A6035D1F}", "",
-                            "", "", "", "", "", absl::nullopt, {}, nullptr,
+                            "", "", "", "", "", absl::nullopt, {}, {},
                             std::move(apps)));
 
     constexpr char regex[] =
@@ -114,13 +113,13 @@
   const auto serializer = std::make_unique<ProtocolSerializerJSON>();
   auto request = serializer->Serialize(
       MakeProtocolRequest(false, "{15160585-8ADE-4D3C-839B-1281A6035D1F}", "",
-                          "", "", "", "", "", absl::nullopt, {}, nullptr, {}));
+                          "", "", "", "", "", absl::nullopt, {}, {}, {}));
   EXPECT_FALSE(RE2::PartialMatch(request, R"("dlpref":)")) << request;
 
   // Verifies that |download_preference| is serialized.
   request = serializer->Serialize(MakeProtocolRequest(
       false, "{15160585-8ADE-4D3C-839B-1281A6035D1F}", "", "", "", "", "",
-      "cacheable", absl::nullopt, {}, nullptr, {}));
+      "cacheable", absl::nullopt, {}, {}, {}));
   EXPECT_TRUE(RE2::PartialMatch(request, R"("dlpref":"cacheable")")) << request;
 }
 
@@ -129,17 +128,17 @@
 TEST(SerializeRequestJSON, UpdaterStateAttributes) {
   base::test::TaskEnvironment env;
   const auto serializer = std::make_unique<ProtocolSerializerJSON>();
-  UpdaterState::Attributes attributes;
-  attributes["ismachine"] = "1";
-  attributes["name"] = "Omaha";
-  attributes["version"] = "1.2.3.4";
-  attributes["laststarted"] = "1";
-  attributes["lastchecked"] = "2";
-  attributes["autoupdatecheckenabled"] = "0";
-  attributes["updatepolicy"] = "-1";
+
   const auto request = serializer->Serialize(MakeProtocolRequest(
       true, "{15160585-8ADE-4D3C-839B-1281A6035D1F}", "prod_id", "1.0", "lang",
-      "channel", "OS", "cacheable", true, {{"extra", "params"}}, &attributes,
+      "channel", "OS", "cacheable", true, {{"extra", "params"}},
+      {{"ismachine", "1"},
+       {"name", "Omaha"},
+       {"version", "1.2.3.4"},
+       {"laststarted", "1"},
+       {"lastchecked", "2"},
+       {"autoupdatecheckenabled", "0"},
+       {"updatepolicy", "-1"}},
       {}));
   constexpr char regex[] =
       R"({"request":{"@os":"\w+","@updater":"prod_id",)"
@@ -169,17 +168,17 @@
   const auto serializer = std::make_unique<ProtocolSerializerJSON>();
   std::string request = serializer->Serialize(
       MakeProtocolRequest(false, "{15160585-8ADE-4D3C-839B-1281A6035D1F}", "",
-                          "", "", "", "", "", absl::nullopt, {}, nullptr, {}));
+                          "", "", "", "", "", absl::nullopt, {}, {}, {}));
   EXPECT_FALSE(RE2::PartialMatch(request, R"("domainjoined")")) << request;
 
   request = serializer->Serialize(
       MakeProtocolRequest(false, "{15160585-8ADE-4D3C-839B-1281A6035D1F}", "",
-                          "", "", "", "", "", true, {}, nullptr, {}));
+                          "", "", "", "", "", true, {}, {}, {}));
   EXPECT_TRUE(RE2::PartialMatch(request, R"("domainjoined":true)")) << request;
 
   request = serializer->Serialize(
       MakeProtocolRequest(false, "{15160585-8ADE-4D3C-839B-1281A6035D1F}", "",
-                          "", "", "", "", "", false, {}, nullptr, {}));
+                          "", "", "", "", "", false, {}, {}, {}));
   EXPECT_TRUE(RE2::PartialMatch(request, R"("domainjoined":false)")) << request;
 }
 
diff --git a/components/update_client/test_configurator.cc b/components/update_client/test_configurator.cc
index 6faec66..dfddc4c 100644
--- a/components/update_client/test_configurator.cc
+++ b/components/update_client/test_configurator.cc
@@ -52,7 +52,9 @@
       network_fetcher_factory_(
           base::MakeRefCounted<NetworkFetcherChromiumFactory>(
               test_shared_loader_factory_,
-              base::BindRepeating([](const GURL& url) { return false; }))) {}
+              base::BindRepeating([](const GURL& url) { return false; }))),
+      updater_state_provider_(base::BindRepeating(
+          [](bool /*is_machine*/) { return UpdaterStateAttributes(); })) {}
 
 TestConfigurator::~TestConfigurator() = default;
 
@@ -168,9 +170,7 @@
 }
 
 UpdaterStateProvider TestConfigurator::GetUpdaterStateProvider() const {
-  return base::BindRepeating([](bool /*is_machine*/) {
-    return base::flat_map<std::string, std::string>();
-  });
+  return updater_state_provider_;
 }
 
 void TestConfigurator::SetOnDemandTime(int seconds) {
@@ -208,4 +208,9 @@
   is_machine_externally_managed_ = is_machine_externally_managed;
 }
 
+void TestConfigurator::SetUpdaterStateProvider(
+    UpdaterStateProvider update_state_provider) {
+  updater_state_provider_ = update_state_provider;
+}
+
 }  // namespace update_client
diff --git a/components/update_client/test_configurator.h b/components/update_client/test_configurator.h
index 1ff2b85a..d19fa702 100644
--- a/components/update_client/test_configurator.h
+++ b/components/update_client/test_configurator.h
@@ -114,6 +114,7 @@
       scoped_refptr<CrxDownloaderFactory> crx_downloader_factory);
   void SetIsMachineExternallyManaged(
       absl::optional<bool> is_machine_externally_managed);
+  void SetUpdaterStateProvider(UpdaterStateProvider update_state_provider);
   network::TestURLLoaderFactory* test_url_loader_factory() {
     return &test_url_loader_factory_;
   }
@@ -139,6 +140,7 @@
   network::TestURLLoaderFactory test_url_loader_factory_;
   scoped_refptr<NetworkFetcherFactory> network_fetcher_factory_;
   scoped_refptr<CrxDownloaderFactory> crx_downloader_factory_;
+  UpdaterStateProvider updater_state_provider_;
 
   absl::optional<bool> is_machine_externally_managed_;
 };
diff --git a/components/update_client/update_checker.cc b/components/update_client/update_checker.cc
index c675a8a..6cd9f5c7 100644
--- a/components/update_client/update_checker.cc
+++ b/components/update_client/update_checker.cc
@@ -15,6 +15,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/containers/flat_map.h"
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
@@ -32,7 +33,6 @@
 #include "components/update_client/request_sender.h"
 #include "components/update_client/task_traits.h"
 #include "components/update_client/update_client.h"
-#include "components/update_client/updater_state.h"
 #include "components/update_client/utils.h"
 #include "url/gurl.h"
 
@@ -70,12 +70,12 @@
       UpdateCheckCallback update_check_callback) override;
 
  private:
-  std::unique_ptr<UpdaterState::Attributes> ReadUpdaterStateAttributes() const;
+  UpdaterStateAttributes ReadUpdaterStateAttributes() const;
   void CheckForUpdatesHelper(
       const std::string& session_id,
       const IdToComponentPtrMap& components,
       const base::flat_map<std::string, std::string>& additional_attributes,
-      std::unique_ptr<UpdaterState::Attributes> updater_state_attributes,
+      const UpdaterStateAttributes& updater_state_attributes,
       const std::set<std::string>& active_ids);
   void OnRequestSenderComplete(int error,
                                const std::string& response,
@@ -123,30 +123,28 @@
       base::BindOnce(&UpdateCheckerImpl::ReadUpdaterStateAttributes,
                      base::Unretained(this)),
       base::BindOnce(
-          [](base::OnceCallback<void(std::unique_ptr<UpdaterState::Attributes>,
+          [](base::OnceCallback<void(const UpdaterStateAttributes&,
                                      const std::set<std::string>&)>
                  check_for_updates_invoker,
              PersistedData* metadata, std::vector<std::string> ids,
-             std::unique_ptr<UpdaterState::Attributes>
-                 updater_state_attributes) {
+             const UpdaterStateAttributes& updater_state_attributes) {
             metadata->GetActiveBits(
                 ids, base::BindOnce(std::move(check_for_updates_invoker),
-                                    std::move(updater_state_attributes)));
+                                    updater_state_attributes));
           },
           std::move(check_for_updates_invoker), base::Unretained(metadata_),
           ids_checked));
 }
 
 // This function runs on the blocking pool task runner.
-std::unique_ptr<UpdaterState::Attributes>
-UpdateCheckerImpl::ReadUpdaterStateAttributes() const {
+UpdaterStateAttributes UpdateCheckerImpl::ReadUpdaterStateAttributes() const {
 #if BUILDFLAG(IS_WIN)
   // On Windows, the Chrome and the updater install modes are matched by design.
-  return UpdaterState::GetState(!config_->IsPerUserInstall());
+  return config_->GetUpdaterStateProvider().Run(!config_->IsPerUserInstall());
 #elif BUILDFLAG(IS_MAC)
-  return UpdaterState::GetState(false);
+  return config_->GetUpdaterStateProvider().Run(false);
 #else
-  return nullptr;
+  return {};
 #endif  // BUILDFLAG(IS_WIN)
 }
 
@@ -154,7 +152,7 @@
     const std::string& session_id,
     const IdToComponentPtrMap& components,
     const base::flat_map<std::string, std::string>& additional_attributes,
-    std::unique_ptr<UpdaterState::Attributes> updater_state_attributes,
+    const UpdaterStateAttributes& updater_state_attributes,
     const std::set<std::string>& active_ids) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
@@ -208,7 +206,7 @@
       config_->GetBrowserVersion().GetString(), config_->GetLang(),
       config_->GetChannel(), config_->GetOSLongName(),
       config_->GetDownloadPreference(), config_->IsMachineExternallyManaged(),
-      additional_attributes, updater_state_attributes.get(), std::move(apps));
+      additional_attributes, updater_state_attributes, std::move(apps));
 
   request_sender_ = std::make_unique<RequestSender>(config_);
   request_sender_->Send(
diff --git a/components/update_client/update_checker_unittest.cc b/components/update_client/update_checker_unittest.cc
index 3638990..8e7d4bb8 100644
--- a/components/update_client/update_checker_unittest.cc
+++ b/components/update_client/update_checker_unittest.cc
@@ -213,6 +213,13 @@
       test_file("updatecheck_reply_1.json")));
 
   config_->SetIsMachineExternallyManaged(true);
+  config_->SetUpdaterStateProvider(base::BindRepeating([](bool /*is_machine*/) {
+    return UpdaterStateAttributes{{"name", "Omaha"},
+                                  {"ismachine", "1"},
+                                  {"autoupdatecheckenabled", "1"},
+                                  {"updatepolicy", "1"}};
+  }));
+
   update_checker_ = UpdateChecker::Create(config_, metadata_.get());
 
   IdToComponentPtrMap components;
@@ -268,7 +275,7 @@
             request->FindPath({"os", "platform"})->GetString());
   EXPECT_TRUE(request->FindPath({"os", "version"})->is_string());
 
-  const auto& app = request->FindKey("app")->GetList()[0];
+  const auto& app = request->FindKey("app")->GetListDeprecated()[0];
   EXPECT_EQ(kUpdateItemId, app.FindKey("appid")->GetString());
   EXPECT_EQ("0.9", app.FindKey("version")->GetString());
   EXPECT_EQ("TEST", app.FindKey("brand")->GetString());
@@ -280,7 +287,7 @@
   EXPECT_TRUE(app.FindKey("ping"));
   EXPECT_EQ(-2, app.FindPath({"ping", "r"})->GetInt());
   EXPECT_EQ("fp1", app.FindPath({"packages", "package"})
-                       ->GetList()[0]
+                       ->GetListDeprecated()[0]
                        .FindKey("fp")
                        ->GetString());
 #if BUILDFLAG(IS_WIN)
@@ -348,7 +355,8 @@
   const auto request = post_interceptor_->GetRequestBody(0);
     const auto root = base::JSONReader::Read(request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(kUpdateItemId, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.9", app.FindKey("version")->GetString());
     EXPECT_EQ("TEST", app.FindKey("brand")->GetString());
@@ -360,7 +368,7 @@
     EXPECT_TRUE(app.FindKey("ping"));
     EXPECT_EQ(-2, app.FindPath({"ping", "r"})->GetInt());
     EXPECT_EQ("fp1", app.FindPath({"packages", "package"})
-                         ->GetList()[0]
+                         ->GetListDeprecated()[0]
                          .FindKey("fp")
                          ->GetString());
 }
@@ -386,7 +394,8 @@
 
     const auto root = base::JSONReader::Read(request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(kUpdateItemId, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.9", app.FindKey("version")->GetString());
     EXPECT_FALSE(app.FindKey("brand"));
@@ -397,7 +406,7 @@
     EXPECT_TRUE(app.FindKey("ping"));
     EXPECT_EQ(-2, app.FindPath({"ping", "r"})->GetInt());
     EXPECT_EQ("fp1", app.FindPath({"packages", "package"})
-                         ->GetList()[0]
+                         ->GetListDeprecated()[0]
                          .FindKey("fp")
                          ->GetString());
 }
@@ -485,7 +494,8 @@
   const auto& request = post_interceptor_->GetRequestBody(0);
   const auto root = base::JSONReader::Read(request);
   ASSERT_TRUE(root);
-  const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+  const auto& app =
+      root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
   EXPECT_EQ(kUpdateItemId, app.FindKey("appid")->GetString());
   EXPECT_EQ("0.9", app.FindKey("version")->GetString());
   EXPECT_EQ("TEST", app.FindKey("brand")->GetString());
@@ -496,7 +506,7 @@
   EXPECT_TRUE(app.FindKey("ping"));
   EXPECT_EQ(-2, app.FindPath({"ping", "r"})->GetInt());
   EXPECT_EQ("fp1", app.FindPath({"packages", "package"})
-                       ->GetList()[0]
+                       ->GetListDeprecated()[0]
                        .FindKey("fp")
                        ->GetString());
 
@@ -569,12 +579,14 @@
     const auto root1 =
         base::JSONReader::Read(post_interceptor_->GetRequestBody(0));
     ASSERT_TRUE(root1);
-    const auto& app1 = root1->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app1 =
+        root1->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(5, app1.FindPath({"ping", "r"})->GetInt());
     const auto root2 =
         base::JSONReader::Read(post_interceptor_->GetRequestBody(1));
     ASSERT_TRUE(root2);
-    const auto& app2 = root2->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app2 =
+        root2->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(3383, app2.FindPath({"ping", "rd"})->GetInt());
     EXPECT_TRUE(app2.FindPath({"ping", "ping_freshness"})->is_string());
 }
@@ -636,7 +648,8 @@
       const auto root =
           base::JSONReader::Read(post_interceptor_->GetRequestBody(0));
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(10, app.FindPath({"ping", "a"})->GetInt());
       EXPECT_EQ(-2, app.FindPath({"ping", "r"})->GetInt());
     }
@@ -644,7 +657,8 @@
       const auto root =
           base::JSONReader::Read(post_interceptor_->GetRequestBody(1));
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(3383, app.FindPath({"ping", "ad"})->GetInt());
       EXPECT_EQ(3383, app.FindPath({"ping", "rd"})->GetInt());
       EXPECT_TRUE(app.FindPath({"ping", "ping_freshness"})->is_string());
@@ -653,7 +667,8 @@
       const auto root =
           base::JSONReader::Read(post_interceptor_->GetRequestBody(2));
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(3383, app.FindPath({"ping", "rd"})->GetInt());
       EXPECT_TRUE(app.FindPath({"ping", "ping_freshness"})->is_string());
     }
@@ -684,7 +699,7 @@
         const auto root = base::JSONReader::Read(request);
         ASSERT_TRUE(root);
         const auto& app =
-            root->FindKey("request")->FindKey("app")->GetList()[0];
+            root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
         EXPECT_EQ("ondemand", app.FindKey("installsource")->GetString());
         EXPECT_FALSE(app.FindKey("installedby"));
     }
@@ -706,7 +721,7 @@
         const auto root = base::JSONReader::Read(request);
         ASSERT_TRUE(root);
         const auto& app =
-            root->FindKey("request")->FindKey("app")->GetList()[0];
+            root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
         EXPECT_EQ("sideload", app.FindKey("installsource")->GetString());
         EXPECT_EQ("policy", app.FindKey("installedby")->GetString());
     }
@@ -728,7 +743,8 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_FALSE(app.FindKey("installsource"));
   }
   {
@@ -748,7 +764,8 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ("webstore", app.FindKey("installsource")->GetString());
       EXPECT_EQ("external", app.FindKey("installedby")->GetString());
   }
@@ -777,7 +794,8 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(true, app.FindKey("enabled")->GetBool());
       EXPECT_FALSE(app.FindKey("disabled"));
   }
@@ -798,7 +816,8 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(true, app.FindKey("enabled")->GetBool());
       EXPECT_FALSE(app.FindKey("disabled"));
   }
@@ -819,9 +838,10 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(false, app.FindKey("enabled")->GetBool());
-      const auto& disabled = app.FindKey("disabled")->GetList();
+      const auto& disabled = app.FindKey("disabled")->GetListDeprecated();
       EXPECT_EQ(1u, disabled.size());
       EXPECT_EQ(0, disabled[0].FindKey("reason")->GetInt());
   }
@@ -841,9 +861,10 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(false, app.FindKey("enabled")->GetBool());
-      const auto& disabled = app.FindKey("disabled")->GetList();
+      const auto& disabled = app.FindKey("disabled")->GetListDeprecated();
       EXPECT_EQ(1u, disabled.size());
       EXPECT_EQ(1, disabled[0].FindKey("reason")->GetInt());
   }
@@ -864,9 +885,10 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(false, app.FindKey("enabled")->GetBool());
-      const auto& disabled = app.FindKey("disabled")->GetList();
+      const auto& disabled = app.FindKey("disabled")->GetListDeprecated();
       EXPECT_EQ(3u, disabled.size());
       EXPECT_EQ(4, disabled[0].FindKey("reason")->GetInt());
       EXPECT_EQ(8, disabled[1].FindKey("reason")->GetInt());
@@ -889,9 +911,10 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(false, app.FindKey("enabled")->GetBool());
-      const auto& disabled = app.FindKey("disabled")->GetList();
+      const auto& disabled = app.FindKey("disabled")->GetListDeprecated();
       EXPECT_EQ(4u, disabled.size());
       EXPECT_EQ(0, disabled[0].FindKey("reason")->GetInt());
       EXPECT_EQ(4, disabled[1].FindKey("reason")->GetInt());
@@ -929,7 +952,8 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(kUpdateItemId, app.FindKey("appid")->GetString());
       EXPECT_EQ("0.9", app.FindKey("version")->GetString());
       EXPECT_EQ(true, app.FindKey("enabled")->GetBool());
@@ -954,7 +978,8 @@
     const auto& request = post_interceptor->GetRequestBody(0);
       const auto root = base::JSONReader::Read(request);
       ASSERT_TRUE(root);
-      const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+      const auto& app =
+          root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
       EXPECT_EQ(kUpdateItemId, app.FindKey("appid")->GetString());
       EXPECT_EQ("0.9", app.FindKey("version")->GetString());
       EXPECT_EQ(true, app.FindKey("enabled")->GetBool());
@@ -987,7 +1012,7 @@
     const auto& request = post_interceptor->GetRequestBody(0);
     const auto root = base::JSONReader::Read(request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindPath("request.app")->GetList()[0];
+    const auto& app = root->FindPath("request.app")->GetListDeprecated()[0];
     EXPECT_STREQ(kUpdateItemId, app.FindStringPath("appid")->c_str());
     EXPECT_TRUE(app.FindDictKey("updatecheck"));
     EXPECT_FALSE(app.FindPath("updatecheck.sameversionupdate"));
@@ -1010,7 +1035,7 @@
     const auto& request = post_interceptor->GetRequestBody(0);
     const auto root = base::JSONReader::Read(request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindPath("request.app")->GetList()[0];
+    const auto& app = root->FindPath("request.app")->GetListDeprecated()[0];
     EXPECT_STREQ(kUpdateItemId, app.FindStringPath("appid")->c_str());
     EXPECT_EQ(app.FindBoolPath("updatecheck.sameversionupdate").value(), true);
   }
@@ -1075,7 +1100,8 @@
   const auto& request = post_interceptor_->GetRequestBody(0);
     const auto root = base::JSONReader::Read(request);
     ASSERT_TRUE(root);
-    const auto& app = root->FindKey("request")->FindKey("app")->GetList()[0];
+    const auto& app =
+        root->FindKey("request")->FindKey("app")->GetListDeprecated()[0];
     EXPECT_EQ(kUpdateItemId, app.FindKey("appid")->GetString());
     EXPECT_EQ("0.9", app.FindKey("version")->GetString());
     EXPECT_EQ("TEST", app.FindKey("brand")->GetString());
@@ -1084,7 +1110,7 @@
     EXPECT_EQ(-2, app.FindPath({"ping", "r"})->GetInt());
     EXPECT_EQ("fp1", app.FindKey("packages")
                          ->FindKey("package")
-                         ->GetList()[0]
+                         ->GetListDeprecated()[0]
                          .FindKey("fp")
                          ->GetString());
 }
diff --git a/components/update_client/utils_unittest.cc b/components/update_client/utils_unittest.cc
index d71e1ab3..fde5c18 100644
--- a/components/update_client/utils_unittest.cc
+++ b/components/update_client/utils_unittest.cc
@@ -8,7 +8,6 @@
 
 #include "base/files/file_path.h"
 #include "base/path_service.h"
-#include "components/update_client/updater_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
diff --git a/components/url_matcher/url_matcher_factory.cc b/components/url_matcher/url_matcher_factory.cc
index cf00364..f9235f8 100644
--- a/components/url_matcher/url_matcher_factory.cc
+++ b/components/url_matcher/url_matcher_factory.cc
@@ -247,7 +247,7 @@
     *error = kInvalidPortRanges;
     return nullptr;
   }
-  base::Value::ConstListView value_list = value->GetList();
+  base::Value::ConstListView value_list = value->GetListDeprecated();
 
   for (const auto& entry : value_list) {
     if (entry.is_int()) {
diff --git a/components/url_matcher/url_util.cc b/components/url_matcher/url_util.cc
index 8347a09..af3a52a 100644
--- a/components/url_matcher/url_util.cc
+++ b/components/url_matcher/url_util.cc
@@ -220,7 +220,7 @@
   if (!value->is_list())
     return false;
 
-  for (const base::Value& item : value->GetList()) {
+  for (const base::Value& item : value->GetListDeprecated()) {
     if (!item.is_string())
       return false;
 
@@ -415,7 +415,7 @@
                 std::map<url_matcher::URLMatcherConditionSet::ID,
                          url_matcher::util::FilterComponents>* filters) {
   URLMatcherConditionSet::Vector all_conditions;
-  base::Value::ConstListView patterns_list = patterns->GetList();
+  base::Value::ConstListView patterns_list = patterns->GetListDeprecated();
   size_t size = std::min(kMaxFiltersAllowed, patterns_list.size());
   scoped_refptr<URLMatcherConditionSet> condition_set;
   for (size_t i = 0; i < size; ++i) {
diff --git a/components/user_manager/known_user.cc b/components/user_manager/known_user.cc
index f126c1d..8ca3d38c 100644
--- a/components/user_manager/known_user.cc
+++ b/components/user_manager/known_user.cc
@@ -226,7 +226,7 @@
     return nullptr;
 
   const base::Value* known_users = local_state_->GetList(kKnownUsers);
-  for (const base::Value& element_value : known_users->GetList()) {
+  for (const base::Value& element_value : known_users->GetListDeprecated()) {
     if (element_value.is_dict()) {
       if (UserMatches(account_id, element_value)) {
         return &element_value;
@@ -250,7 +250,7 @@
     return;
 
   ListPrefUpdate update(local_state_, kKnownUsers);
-  for (base::Value& element_value : update->GetList()) {
+  for (base::Value& element_value : update->GetListDeprecated()) {
     if (element_value.is_dict()) {
       if (UserMatches(account_id, element_value)) {
         if (opt_value.has_value())
@@ -441,7 +441,7 @@
   std::vector<AccountId> result;
 
   const base::Value* known_users = local_state_->GetList(kKnownUsers);
-  for (const base::Value& element_value : known_users->GetList()) {
+  for (const base::Value& element_value : known_users->GetListDeprecated()) {
     if (element_value.is_dict()) {
       const std::string* email = element_value.FindStringKey(kCanonicalEmail);
       const std::string* gaia_id = element_value.FindStringKey(kGAIAIdKey);
@@ -759,7 +759,7 @@
     return;
 
   ListPrefUpdate update(local_state_, kKnownUsers);
-  base::Value::ListView update_view = update->GetList();
+  base::Value::ListView update_view = update->GetListDeprecated();
   for (auto it = update_view.begin(); it != update_view.end(); ++it) {
     if (UserMatches(account_id, *it)) {
       update->EraseListIter(it);
@@ -781,7 +781,7 @@
 
 void KnownUser::CleanObsoletePrefs() {
   ListPrefUpdate update(local_state_, kKnownUsers);
-  for (base::Value& user_entry : update.Get()->GetList()) {
+  for (base::Value& user_entry : update.Get()->GetListDeprecated()) {
     if (!user_entry.is_dict())
       continue;
     for (const std::string& key : kObsoleteKeys)
diff --git a/components/user_manager/user_manager_base.cc b/components/user_manager/user_manager_base.cc
index c9b8c21..529a967 100644
--- a/components/user_manager/user_manager_base.cc
+++ b/components/user_manager/user_manager_base.cc
@@ -820,8 +820,8 @@
   // Load regular users and supervised users.
   std::vector<AccountId> regular_users;
   std::set<AccountId> regular_users_set;
-  ParseUserList(prefs_regular_users->GetList(), device_local_accounts_set,
-                &regular_users, &regular_users_set);
+  ParseUserList(prefs_regular_users->GetListDeprecated(),
+                device_local_accounts_set, &regular_users, &regular_users_set);
   for (std::vector<AccountId>::const_iterator it = regular_users.begin();
        it != regular_users.end(); ++it) {
     if (IsDeprecatedSupervisedAccountId(*it)) {
@@ -881,7 +881,7 @@
 
 bool UserManagerBase::UserExistsInList(const AccountId& account_id) const {
   const base::Value* user_list = GetLocalState()->GetList(kRegularUsersPref);
-  for (const base::Value& i : user_list->GetList()) {
+  for (const base::Value& i : user_list->GetListDeprecated()) {
     const std::string* email = i.GetIfString();
     if (email && (account_id.GetUserEmail() == *email))
       return true;
@@ -906,7 +906,7 @@
 void UserManagerBase::AddUserRecord(User* user) {
   // Add the user to the front of the user list.
   ListPrefUpdate prefs_users_update(GetLocalState(), kRegularUsersPref);
-  prefs_users_update->Insert(prefs_users_update->GetList().begin(),
+  prefs_users_update->Insert(prefs_users_update->GetListDeprecated().begin(),
                              base::Value(user->GetAccountId().GetUserEmail()));
   users_.insert(users_.begin(), user);
 }
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc
index 57d5de1..058ff19 100644
--- a/components/variations/service/variations_field_trial_creator.cc
+++ b/components/variations/service/variations_field_trial_creator.cc
@@ -349,11 +349,12 @@
   const std::string* stored_country = nullptr;
 
   // Determine if the saved pref value is present and valid.
-  const bool is_pref_empty = list_value->GetList().empty();
+  const bool is_pref_empty = list_value->GetListDeprecated().empty();
   const bool is_pref_valid =
-      list_value->GetList().size() == 2 &&
-      (stored_version_string = list_value->GetList()[0].GetIfString()) &&
-      (stored_country = list_value->GetList()[1].GetIfString()) &&
+      list_value->GetListDeprecated().size() == 2 &&
+      (stored_version_string =
+           list_value->GetListDeprecated()[0].GetIfString()) &&
+      (stored_country = list_value->GetListDeprecated()[1].GetIfString()) &&
       base::Version(*stored_version_string).IsValid();
 
   // Determine if the version from the saved pref matches |version|.
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc
index f9fc38e..066a9631 100644
--- a/components/variations/service/variations_service.cc
+++ b/components/variations/service/variations_service.cc
@@ -994,7 +994,7 @@
       local_state_->GetList(prefs::kVariationsPermanentConsistencyCountry);
   std::string stored_country;
 
-  base::Value::ConstListView list_view = list_value->GetList();
+  base::Value::ConstListView list_view = list_value->GetListDeprecated();
   if (list_view.size() == 2 && list_view[1].is_string()) {
     stored_country = list_view[1].GetString();
   }
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn
index 53f0d81..6713367 100644
--- a/components/vector_icons/BUILD.gn
+++ b/components/vector_icons/BUILD.gn
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/config/chromeos/ui_mode.gni")
 import("//components/vector_icons/vector_icons.gni")
 
 aggregate_vector_icons("components_vector_icons") {
@@ -116,6 +117,10 @@
     "warning.icon",
     "wifi_add.icon",
   ]
+
+  if (is_chromeos_ash) {
+    sources += [ "videogame_asset_outline.icon" ]
+  }
 }
 
 static_library("vector_icons") {
diff --git a/components/vector_icons/videogame_asset_outline.icon b/components/vector_icons/videogame_asset_outline.icon
new file mode 100644
index 0000000..417ed6d
--- /dev/null
+++ b/components/vector_icons/videogame_asset_outline.icon
@@ -0,0 +1,63 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 24,
+MOVE_TO, 4, 18,
+CUBIC_TO, 3.45f, 18, 2.98f, 17.8f, 2.59f, 17.41f,
+CUBIC_TO, 2.2f, 17.02f, 2, 16.55f, 2, 16,
+V_LINE_TO, 8,
+CUBIC_TO, 2, 7.45f, 2.2f, 6.98f, 2.59f, 6.59f,
+CUBIC_TO, 2.98f, 6.2f, 3.45f, 6, 4, 6,
+H_LINE_TO, 20,
+CUBIC_TO, 20.55f, 6, 21.02f, 6.2f, 21.41f, 6.59f,
+CUBIC_TO, 21.8f, 6.98f, 22, 7.45f, 22, 8,
+V_LINE_TO, 16,
+CUBIC_TO, 22, 16.55f, 21.8f, 17.02f, 21.41f, 17.41f,
+CUBIC_TO, 21.02f, 17.8f, 20.55f, 18, 20, 18,
+H_LINE_TO, 4,
+CLOSE,
+MOVE_TO, 4, 16,
+H_LINE_TO, 20,
+V_LINE_TO, 8,
+H_LINE_TO, 4,
+V_LINE_TO, 16,
+CLOSE,
+MOVE_TO, 7, 15,
+H_LINE_TO, 9,
+V_LINE_TO, 13,
+H_LINE_TO, 11,
+V_LINE_TO, 11,
+H_LINE_TO, 9,
+V_LINE_TO, 9,
+H_LINE_TO, 7,
+V_LINE_TO, 11,
+H_LINE_TO, 5,
+V_LINE_TO, 13,
+H_LINE_TO, 7,
+V_LINE_TO, 15,
+CLOSE,
+MOVE_TO, 14.5f, 15,
+CUBIC_TO, 14.92f, 15, 15.27f, 14.85f, 15.56f, 14.56f,
+CUBIC_TO, 15.85f, 14.27f, 16, 13.92f, 16, 13.5f,
+CUBIC_TO, 16, 13.08f, 15.85f, 12.73f, 15.56f, 12.44f,
+CUBIC_TO, 15.27f, 12.15f, 14.92f, 12, 14.5f, 12,
+CUBIC_TO, 14.08f, 12, 13.73f, 12.15f, 13.44f, 12.44f,
+CUBIC_TO, 13.15f, 12.73f, 13, 13.08f, 13, 13.5f,
+CUBIC_TO, 13, 13.92f, 13.15f, 14.27f, 13.44f, 14.56f,
+CUBIC_TO, 13.73f, 14.85f, 14.08f, 15, 14.5f, 15,
+CLOSE,
+MOVE_TO, 17.5f, 12,
+CUBIC_TO, 17.92f, 12, 18.27f, 11.85f, 18.56f, 11.56f,
+CUBIC_TO, 18.85f, 11.27f, 19, 10.92f, 19, 10.5f,
+CUBIC_TO, 19, 10.08f, 18.85f, 9.73f, 18.56f, 9.44f,
+CUBIC_TO, 18.27f, 9.15f, 17.92f, 9, 17.5f, 9,
+CUBIC_TO, 17.08f, 9, 16.73f, 9.15f, 16.44f, 9.44f,
+CUBIC_TO, 16.15f, 9.73f, 16, 10.08f, 16, 10.5f,
+CUBIC_TO, 16, 10.92f, 16.15f, 11.27f, 16.44f, 11.56f,
+CUBIC_TO, 16.73f, 11.85f, 17.08f, 12, 17.5f, 12,
+CLOSE,
+MOVE_TO, 4, 16,
+V_LINE_TO, 8,
+V_LINE_TO, 16,
+CLOSE
diff --git a/components/viz/common/quads/render_pass_io.cc b/components/viz/common/quads/render_pass_io.cc
index 5e565833..124bdc8 100644
--- a/components/viz/common/quads/render_pass_io.cc
+++ b/components/viz/common/quads/render_pass_io.cc
@@ -2123,9 +2123,9 @@
   const base::Value* list = dict.FindListKey("render_pass_list");
   if (!list || !list->is_list())
     return false;
-  for (size_t ii = 0; ii < list->GetList().size(); ++ii) {
+  for (size_t ii = 0; ii < list->GetListDeprecated().size(); ++ii) {
     render_pass_list->push_back(
-        CompositorRenderPassFromDict(list->GetList()[ii]));
+        CompositorRenderPassFromDict(list->GetListDeprecated()[ii]));
     if (!(*render_pass_list)[ii].get()) {
       render_pass_list->clear();
       return false;
@@ -2177,7 +2177,8 @@
   if (!referenced_surfaces || !referenced_surfaces->is_list()) {
     return false;
   }
-  for (auto& referenced_surface_dict : referenced_surfaces->GetList()) {
+  for (auto& referenced_surface_dict :
+       referenced_surfaces->GetListDeprecated()) {
     auto referenced_surface = SurfaceRangeFromDict(referenced_surface_dict);
     if (!referenced_surface) {
       return false;
diff --git a/components/viz/common/quads/render_pass_io_unittest.cc b/components/viz/common/quads/render_pass_io_unittest.cc
index 3677c19..2bf17a3 100644
--- a/components/viz/common/quads/render_pass_io_unittest.cc
+++ b/components/viz/common/quads/render_pass_io_unittest.cc
@@ -346,15 +346,17 @@
   // 'intersects_damage_under' in its CompositorRenderPassDrawQuad, I'm
   // removing the field on dict1 for the exact comparison to work.
   base::Value* list = dict1.FindListKey("render_pass_list");
-  for (size_t i = 0; i < list->GetList().size(); ++i) {
-    base::Value* quad_list = list->GetList()[i].FindListKey("quad_list");
+  for (size_t i = 0; i < list->GetListDeprecated().size(); ++i) {
+    base::Value* quad_list =
+        list->GetListDeprecated()[i].FindListKey("quad_list");
 
-    for (size_t ii = 0; ii < quad_list->GetList().size(); ++ii) {
+    for (size_t ii = 0; ii < quad_list->GetListDeprecated().size(); ++ii) {
       if (const base::Value* extra_value =
-              quad_list->GetList()[ii].FindKey("intersects_damage_under")) {
+              quad_list->GetListDeprecated()[ii].FindKey(
+                  "intersects_damage_under")) {
         EXPECT_FALSE(extra_value->GetBool());
-        ASSERT_TRUE(
-            quad_list->GetList()[ii].RemoveKey("intersects_damage_under"));
+        ASSERT_TRUE(quad_list->GetListDeprecated()[ii].RemoveKey(
+            "intersects_damage_under"));
       }
     }
   }
diff --git a/components/viz/common/surfaces/region_capture_bounds.cc b/components/viz/common/surfaces/region_capture_bounds.cc
index 451cec83..36d9fb4 100644
--- a/components/viz/common/surfaces/region_capture_bounds.cc
+++ b/components/viz/common/surfaces/region_capture_bounds.cc
@@ -34,6 +34,10 @@
   bounds_.insert_or_assign(crop_id, region);
 }
 
+void RegionCaptureBounds::Reset() {
+  bounds_.clear();
+}
+
 bool RegionCaptureBounds::operator==(const RegionCaptureBounds& rhs) const {
   return bounds_ == rhs.bounds_;
 }
diff --git a/components/viz/common/surfaces/region_capture_bounds.h b/components/viz/common/surfaces/region_capture_bounds.h
index f73a7e7..27bfc80d 100644
--- a/components/viz/common/surfaces/region_capture_bounds.h
+++ b/components/viz/common/surfaces/region_capture_bounds.h
@@ -44,6 +44,9 @@
 
   bool IsEmpty() const { return bounds_.empty(); }
 
+  // Sets the bounds to empty.
+  void Reset();
+
   const base::flat_map<RegionCaptureCropId, gfx::Rect>& bounds() const {
     return bounds_;
   }
diff --git a/components/viz/common/yuv_readback_unittest.cc b/components/viz/common/yuv_readback_unittest.cc
index b899862..5cf43adb 100644
--- a/components/viz/common/yuv_readback_unittest.cc
+++ b/components/viz/common/yuv_readback_unittest.cc
@@ -113,7 +113,7 @@
         << json_data;
 
     CHECK(parsed_json.value->is_list());
-    for (const base::Value& dict : parsed_json.value->GetList()) {
+    for (const base::Value& dict : parsed_json.value->GetListDeprecated()) {
       CHECK(dict.is_dict());
       const std::string* name = dict.FindStringPath("name");
       CHECK(name);
diff --git a/components/viz/service/debugger/viz_debugger.cc b/components/viz/service/debugger/viz_debugger.cc
index e695a5b..54fd4bc 100644
--- a/components/viz/service/debugger/viz_debugger.cc
+++ b/components/viz/service/debugger/viz_debugger.cc
@@ -287,7 +287,7 @@
 
   new_filters_.clear();
 
-  for (const auto& filter : filterlist->GetList()) {
+  for (const auto& filter : filterlist->GetListDeprecated()) {
     const base::Value* file = filter.FindPath("selector.file");
     const base::Value* func = filter.FindPath("selector.func");
     const base::Value* anno = filter.FindPath("selector.anno");
diff --git a/components/viz/service/debugger/viz_debugger_unittest.cc b/components/viz/service/debugger/viz_debugger_unittest.cc
index c870b4e..557efde 100644
--- a/components/viz/service/debugger/viz_debugger_unittest.cc
+++ b/components/viz/service/debugger/viz_debugger_unittest.cc
@@ -137,8 +137,8 @@
     base::Value* list_source = global_dict->FindListKey("new_sources");
     EXPECT_TRUE(list_source->is_list());
 
-    for (size_t i = 0; i < list_source->GetList().size(); i++) {
-      auto&& local_dict = list_source->GetList()[i];
+    for (size_t i = 0; i < list_source->GetListDeprecated().size(); i++) {
+      auto&& local_dict = list_source->GetListDeprecated()[i];
       StaticSource ss;
       ss.file = local_dict.FindKey("file")->GetString();
       ss.func = local_dict.FindKey("func")->GetString();
@@ -172,8 +172,8 @@
           option_dict->FindKey("alpha")->GetIfInt().value_or(kNoVal));
     };
 
-    for (size_t i = 0; i < draw_call_list->GetList().size(); i++) {
-      const base::Value& local_dict = draw_call_list->GetList()[i];
+    for (size_t i = 0; i < draw_call_list->GetListDeprecated().size(); i++) {
+      const base::Value& local_dict = draw_call_list->GetListDeprecated()[i];
       int draw_index;
       int source_index;
       VizDebugger::DrawOption option;
@@ -181,13 +181,17 @@
 
       const base::Value* list_size = local_dict.FindListKey("size");
       EXPECT_TRUE(list_size->is_list());
-      int size_x = list_size->GetList()[0].GetIfInt().value_or(kNoVal);
-      int size_y = list_size->GetList()[1].GetIfInt().value_or(kNoVal);
+      int size_x =
+          list_size->GetListDeprecated()[0].GetIfInt().value_or(kNoVal);
+      int size_y =
+          list_size->GetListDeprecated()[1].GetIfInt().value_or(kNoVal);
 
       const base::Value* list_pos = local_dict.FindListKey("pos");
       EXPECT_TRUE(list_pos->is_list());
-      float pos_x = list_pos->GetList()[0].GetIfDouble().value_or(kNoVal);
-      float pos_y = list_pos->GetList()[1].GetIfDouble().value_or(kNoVal);
+      float pos_x =
+          list_pos->GetListDeprecated()[0].GetIfDouble().value_or(kNoVal);
+      float pos_y =
+          list_pos->GetListDeprecated()[1].GetIfDouble().value_or(kNoVal);
 
       VizDebuggerInternal::DrawCall draw_call(draw_index, source_index, option,
                                               gfx::Size(size_x, size_y),
@@ -199,8 +203,8 @@
     base::Value* text_call_list = global_dict->FindListKey("text");
     EXPECT_TRUE(text_call_list->is_list());
 
-    for (size_t i = 0; i < text_call_list->GetList().size(); i++) {
-      const base::Value& local_dict = text_call_list->GetList()[i];
+    for (size_t i = 0; i < text_call_list->GetListDeprecated().size(); i++) {
+      const base::Value& local_dict = text_call_list->GetListDeprecated()[i];
       int draw_index;
       int source_index;
       VizDebugger::DrawOption option;
@@ -209,8 +213,10 @@
 
       const base::Value* list_pos = local_dict.FindListKey("pos");
       EXPECT_TRUE(list_pos->is_list());
-      float pos_x = list_pos->GetList()[0].GetIfDouble().value_or(kNoVal);
-      float pos_y = list_pos->GetList()[1].GetIfDouble().value_or(kNoVal);
+      float pos_x =
+          list_pos->GetListDeprecated()[0].GetIfDouble().value_or(kNoVal);
+      float pos_y =
+          list_pos->GetListDeprecated()[1].GetIfDouble().value_or(kNoVal);
 
       VizDebuggerInternal::DrawTextCall text_call(
           draw_index, source_index, option, gfx::Vector2dF(pos_x, pos_y),
@@ -222,8 +228,8 @@
     base::Value* log_call_list = global_dict->FindListKey("logs");
     EXPECT_TRUE(log_call_list->is_list());
 
-    for (size_t i = 0; i < log_call_list->GetList().size(); i++) {
-      const base::Value& local_dict = log_call_list->GetList()[i];
+    for (size_t i = 0; i < log_call_list->GetListDeprecated().size(); i++) {
+      const base::Value& local_dict = log_call_list->GetListDeprecated()[i];
       int draw_index;
       int source_index;
       VizDebugger::DrawOption option;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index 26606fbc4..eb35a45 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -9,6 +9,7 @@
 #include "base/atomic_sequence_num.h"
 #include "base/bind.h"
 #include "base/callback_helpers.h"
+#include "base/debug/crash_logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/task/bind_post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -116,6 +117,13 @@
                              callback);
 }
 
+void FailedSkiaFlush(base::StringPiece msg) {
+  static auto* kCrashKey = base::debug::AllocateCrashKeyString(
+      "sk_flush_failed", base::debug::CrashKeySize::Size64);
+  base::debug::SetCrashKeyString(kCrashKey, msg);
+  LOG(ERROR) << msg;
+}
+
 #if BUILDFLAG(ENABLE_VULKAN)
 // Returns whether SkiaOutputDeviceX11 can be instantiated on this platform.
 bool MayFallBackToSkiaOutputDeviceX11() {
@@ -464,7 +472,7 @@
     if (result != GrSemaphoresSubmitted::kYes &&
         !(begin_semaphores.empty() && end_semaphores_empty)) {
       // TODO(penghuang): handle vulkan device lost.
-      DLOG(ERROR) << "output_sk_surface()->flush() failed.";
+      FailedSkiaFlush("output_sk_surface()->flush() failed.");
       return;
     }
   }
@@ -585,7 +593,7 @@
     if (result != GrSemaphoresSubmitted::kYes &&
         !(begin_semaphores.empty() && end_semaphores.empty())) {
       // TODO(penghuang): handle vulkan device lost.
-      DLOG(ERROR) << "offscreen.surface()->flush() failed.";
+      FailedSkiaFlush("offscreen.surface()->flush() failed.");
       return;
     }
     bool sync_cpu =
@@ -768,7 +776,7 @@
   if (flush_result != GrSemaphoresSubmitted::kYes &&
       !(begin_semaphores.empty() && end_semaphores.empty())) {
     // TODO(penghuang): handle vulkan device lost.
-    DLOG(ERROR) << "dest_surface->flush() failed.";
+    FailedSkiaFlush("dest_surface->flush() failed.");
     return false;
   }
 
@@ -1023,7 +1031,7 @@
     if (flush_result != GrSemaphoresSubmitted::kYes &&
         !(begin_semaphores.empty() && end_semaphores.empty())) {
       // TODO(penghuang): handle vulkan device lost.
-      DLOG(ERROR) << "plane_surfaces[i]->flush() failed for i=" << i;
+      FailedSkiaFlush("plane_surfaces[i]->flush()");
       return;
     }
   }
@@ -1252,7 +1260,7 @@
     if (flush_result != GrSemaphoresSubmitted::kYes &&
         !(begin_semaphores.empty() && end_semaphores.empty())) {
       // TODO(penghuang): handle vulkan device lost.
-      DLOG(ERROR) << "surface->flush() failed.";
+      FailedSkiaFlush("surface->flush() failed.");
       return;
     }
   }
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
index 3a15976..bfdb1d9 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -295,6 +295,7 @@
                                     damage_rect, expected_display_time);
   }
 
+  current_capture_bounds_ = frame.metadata.capture_bounds;
   for (CapturableFrameSink::Client* client : capture_clients_) {
     client->OnFrameDamaged(frame_size_in_pixels, damage_rect,
                            expected_display_time, frame.metadata);
@@ -960,10 +961,19 @@
 
 gfx::Rect CompositorFrameSinkSupport::GetCopyOutputRequestRegion(
     const VideoCaptureSubTarget& sub_target) const {
-  if (!last_activated_surface_id_.is_valid()) {
+  // We will either have a subtree ID or a region capture crop_id, but not both.
+  if (absl::holds_alternative<RegionCaptureCropId>(sub_target)) {
+    const auto it = current_capture_bounds_.bounds().find(
+        absl::get<RegionCaptureCropId>(sub_target));
+    if (it != current_capture_bounds_.bounds().end()) {
+      return it->second;
+    }
     return {};
   }
 
+  if (!last_activated_surface_id_.is_valid())
+    return {};
+
   Surface* current_surface =
       surface_manager_->GetSurfaceForId(last_activated_surface_id_);
   DCHECK(current_surface);
@@ -971,11 +981,6 @@
     return {};
   }
 
-  // We will either have a subtree ID or a region capture crop_id, but not both.
-  if (absl::holds_alternative<RegionCaptureCropId>(sub_target)) {
-    return GetCaptureBounds(absl::get<RegionCaptureCropId>(sub_target));
-  }
-
   // We can exit early if there is no subtree, otherwise we need to
   // intersect the bounds.
   const CompositorFrame& frame = current_surface->GetActiveFrame();
@@ -1056,27 +1061,6 @@
   return (client << 48) | (sink << 32) | trace_sequence_;
 }
 
-gfx::Rect CompositorFrameSinkSupport::GetCaptureBounds(
-    const RegionCaptureCropId& crop_id) const {
-  DCHECK(!crop_id.is_zero());
-  // We don't know what frame contains the bounds associated with |crop_id|,
-  // so we do have to iterate through each surface.
-  for (const SurfaceId& id : surface_manager_->GetCreatedSurfaceIds()) {
-    Surface* surface = surface_manager_->GetSurfaceForId(id);
-    if (!surface->HasActiveFrame()) {
-      continue;
-    }
-
-    const RegionCaptureBounds& bounds =
-        surface->GetActiveFrameMetadata().capture_bounds;
-    const auto it = bounds.bounds().find(crop_id);
-    if (it != bounds.bounds().end()) {
-      return it->second;
-    }
-  }
-  return {};
-}
-
 bool CompositorFrameSinkSupport::ShouldSendBeginFrame(
     base::TimeTicks frame_time) {
   // We should throttle OnBeginFrame() if it has been less than
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.h b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
index 3239dd3..9dc79a4b3 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.h
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.h
@@ -205,7 +205,7 @@
   void AttachCaptureClient(CapturableFrameSink::Client* client) override;
   void DetachCaptureClient(CapturableFrameSink::Client* client) override;
   gfx::Rect GetCopyOutputRequestRegion(
-      const VideoCaptureSubTarget& specifier) const override;
+      const VideoCaptureSubTarget& sub_target) const override;
   void OnClientCaptureStarted() override;
   void OnClientCaptureStopped() override;
   void RequestCopyOfOutput(
@@ -237,6 +237,10 @@
 
   SurfaceAnimationManager* GetSurfaceAnimationManagerForTesting();
 
+  const RegionCaptureBounds& current_capture_bounds() const {
+    return current_capture_bounds_;
+  }
+
  private:
   friend class CompositorFrameSinkSupportTest;
   friend class DisplayTest;
@@ -274,12 +278,6 @@
 
   int64_t ComputeTraceId();
 
-  // Internal logic for determining what region capture bounds are
-  // associated with a given |crop_id|. This assumes that we are capturing
-  // with |crop_id|, and so a return value of gfx::Rect{} indicates that
-  // we shouldn't capture any of the surface.
-  gfx::Rect GetCaptureBounds(const RegionCaptureCropId& crop_id) const;
-
   void MaybeEvictSurfaces();
   void EvictLastActiveSurface();
   bool ShouldSendBeginFrame(base::TimeTicks timestamp);
@@ -426,6 +424,9 @@
   // Number of clients that have started video capturing.
   uint32_t number_clients_capturing_ = 0;
 
+  // Region capture bounds associated with the last surface that was aggregated.
+  RegionCaptureBounds current_capture_bounds_;
+
   base::WeakPtrFactory<CompositorFrameSinkSupport> weak_factory_{this};
 };
 
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
index 3d77ec0a0..4e86f15 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support_unittest.cc
@@ -1703,8 +1703,11 @@
       gfx::Rect{0, 0, 20, 20};
   frame_with_crop_id_and_bounds.metadata.capture_bounds =
       RegionCaptureBounds{{{crop_id, gfx::Rect{0, 0, 13, 13}}}};
-  support_->SubmitCompositorFrame(local_surface_id_,
-                                  std::move(frame_with_crop_id_and_bounds));
+
+  // mark the surface as damaged to update the capture bounds.
+  support_->OnSurfaceAggregatedDamage(
+      /*surface*/ nullptr, local_surface_id_, frame_with_crop_id_and_bounds,
+      gfx::Rect{0, 0, 20, 20}, base::TimeTicks::Now());
 
   EXPECT_EQ((gfx::Rect{0, 0, 13, 13}),
             support_->GetCopyOutputRequestRegion(crop_id));
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
index af66991..632a807 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -17,6 +17,7 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "components/viz/common/surfaces/subtree_capture_id.h"
+#include "components/viz/common/surfaces/video_capture_target.h"
 #include "components/viz/service/display/shared_bitmap_manager.h"
 #include "components/viz/service/display_embedder/output_surface_provider.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
@@ -25,6 +26,7 @@
 #include "components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.h"
 #include "components/viz/service/performance_hint/utils.h"
 #include "components/viz/service/surfaces/pending_copy_output_request.h"
+#include "components/viz/service/surfaces/surface.h"
 
 namespace viz {
 
@@ -506,10 +508,31 @@
 }
 
 CapturableFrameSink* FrameSinkManagerImpl::FindCapturableFrameSink(
-    const FrameSinkId& frame_sink_id) {
+    const VideoCaptureTarget& target) {
+  // Search the known CompositorFrameSinkSupport objects for region capture
+  // bounds matching the crop ID specified by |target| (if one was set), and
+  // return the corresponding frame sink.
+  if (absl::holds_alternative<RegionCaptureCropId>(target.sub_target)) {
+    const auto crop_id = absl::get<RegionCaptureCropId>(target.sub_target);
+    for (const auto& id_and_sink : support_map_) {
+      const RegionCaptureBounds& bounds =
+          id_and_sink.second->current_capture_bounds();
+      auto match = bounds.bounds().find(crop_id);
+      if (match != bounds.bounds().end()) {
+        return id_and_sink.second;
+      }
+    }
+    return nullptr;
+  }
+
+  FrameSinkId frame_sink_id = target.frame_sink_id;
+  if (!frame_sink_id.is_valid())
+    return nullptr;
+
   const auto it = support_map_.find(frame_sink_id);
   if (it == support_map_.end())
     return nullptr;
+
   return it->second;
 }
 
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
index 502d236..8d4bd49 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h
+++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -50,10 +50,11 @@
 class CapturableFrameSink;
 class CompositorFrameSinkSupport;
 class FrameSinkBundleImpl;
+class GmbVideoFramePoolContextProvider;
 class HintSessionFactory;
 class OutputSurfaceProvider;
 class SharedBitmapManager;
-class GmbVideoFramePoolContextProvider;
+struct VideoCaptureTarget;
 
 // FrameSinkManagerImpl manages BeginFrame hierarchy. This is the implementation
 // detail for FrameSinkManagerImpl.
@@ -300,7 +301,7 @@
 
   // FrameSinkVideoCapturerManager implementation:
   CapturableFrameSink* FindCapturableFrameSink(
-      const FrameSinkId& frame_sink_id) override;
+      const VideoCaptureTarget& target) override;
   void OnCapturerConnectionLost(FrameSinkVideoCapturerImpl* capturer) override;
 
   // Returns true if |child framesink| is or has |search_frame_sink_id| as a
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc b/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc
index e66873a..c49494e9 100644
--- a/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc
+++ b/components/viz/service/frame_sinks/frame_sink_manager_unittest.cc
@@ -94,7 +94,7 @@
   }
 
   CapturableFrameSink* FindCapturableFrameSink(const FrameSinkId& id) {
-    return manager_.FindCapturableFrameSink(id);
+    return manager_.FindCapturableFrameSink(VideoCaptureTarget(id));
   }
 
   // Verifies the frame sinks with provided id in |ids| are throttled at
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
index e7316d26..48a97cf 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl.cc
@@ -306,7 +306,20 @@
   CapturableFrameSink* resolved_target = nullptr;
   if (target_) {
     resolved_target =
-        frame_sink_manager_->FindCapturableFrameSink(target_->frame_sink_id);
+        frame_sink_manager_->FindCapturableFrameSink(target_.value());
+
+    // The frame sink identifier may have changed due to crop target
+    // dereferencing.
+    const FrameSinkId resolved_id =
+        resolved_target ? resolved_target->GetFrameSinkId() : FrameSinkId{};
+    if (resolved_id.is_valid() && resolved_id != target_->frame_sink_id) {
+      TRACE_EVENT_INSTANT2(
+          "gpu.capture", "ChangeTargetCropIdDereference",
+          TRACE_EVENT_SCOPE_THREAD, "from",
+          target_ ? target_->frame_sink_id.ToString().c_str() : "None", "to",
+          resolved_id.ToString());
+      target_->frame_sink_id = resolved_id;
+    }
   }
   SetResolvedTarget(resolved_target);
 }
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
index 9c085a4..b4c66b3 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_impl_unittest.cc
@@ -77,7 +77,7 @@
 }
 
 // Dummy frame sink ID.
-constexpr FrameSinkId kFrameSinkId = FrameSinkId(1, 1);
+const VideoCaptureTarget kVideoCaptureTarget(FrameSinkId(1, 1));
 
 // The compositor frame interval.
 constexpr auto kVsyncInterval = base::Seconds(1) / 60;
@@ -120,7 +120,7 @@
 class MockFrameSinkManager : public FrameSinkVideoCapturerManager {
  public:
   MOCK_METHOD1(FindCapturableFrameSink,
-               CapturableFrameSink*(const FrameSinkId& frame_sink_id));
+               CapturableFrameSink*(const VideoCaptureTarget& target));
   MOCK_METHOD1(OnCapturerConnectionLost,
                void(FrameSinkVideoCapturerImpl* capturer));
 };
@@ -255,7 +255,9 @@
 
   Client* attached_client() const { return client_; }
 
-  const FrameSinkId& GetFrameSinkId() const override { return kFrameSinkId; }
+  const FrameSinkId& GetFrameSinkId() const override {
+    return kVideoCaptureTarget.frame_sink_id;
+  }
 
   void AttachCaptureClient(Client* client) override {
     ASSERT_FALSE(client_);
@@ -595,24 +597,26 @@
 // Tests that the capturer attaches to a frame sink immediately, in the case
 // where the frame sink was already known by the manager.
 TEST_F(FrameSinkVideoCapturerTest, ResolvesTargetImmediately) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
   EXPECT_FALSE(capturer_->target());
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
-  EXPECT_EQ(kFrameSinkId, capturer_->target()->frame_sink_id);
+  capturer_->ChangeTarget(kVideoCaptureTarget);
+  EXPECT_EQ(kVideoCaptureTarget.frame_sink_id,
+            capturer_->target()->frame_sink_id);
   EXPECT_EQ(capturer_.get(), frame_sink_.attached_client());
 }
 
 // Tests that the capturer attaches to a frame sink later, in the case where the
 // frame sink becomes known to the manager at some later point.
 TEST_F(FrameSinkVideoCapturerTest, ResolvesTargetLater) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(nullptr));
 
   EXPECT_FALSE(capturer_->target());
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
-  EXPECT_EQ(kFrameSinkId, capturer_->target()->frame_sink_id);
+  capturer_->ChangeTarget(kVideoCaptureTarget);
+  EXPECT_EQ(kVideoCaptureTarget.frame_sink_id,
+            capturer_->target()->frame_sink_id);
   EXPECT_EQ(nullptr, frame_sink_.attached_client());
 
   capturer_->SetResolvedTarget(&frame_sink_);
@@ -622,7 +626,7 @@
 // Tests that no initial frame is sent after Start() is called until after the
 // target has been resolved.
 TEST_F(FrameSinkVideoCapturerTest, PostponesCaptureWithoutATarget) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
   MockConsumer consumer;
@@ -646,7 +650,7 @@
 
   // Now, set the target. As it resolves, the capturer will immediately attempt
   // a refresh capture, which will cancel the timer and trigger a copy request.
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
   EXPECT_EQ(1, frame_sink_.num_copy_results());
   EXPECT_FALSE(IsRefreshRetryTimerRunning());
 
@@ -659,10 +663,10 @@
 // consumer.
 TEST_F(FrameSinkVideoCapturerTest, CapturesCompositedFrames) {
   frame_sink_.SetCopyOutputColor(YUVColor{0x80, 0x80, 0x80});
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
   EXPECT_FALSE(IsRefreshRetryTimerRunning());
 
   MockConsumer consumer;
@@ -754,10 +758,10 @@
 // that is because there are too many copy requests in-flight or because the
 // consumer has not finished consuming frames fast enough.
 TEST_F(FrameSinkVideoCapturerTest, HaltsWhenPoolIsFull) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   NiceMock<MockConsumer> consumer;
   StartCapture(&consumer);
@@ -874,10 +878,10 @@
   std::vector<YUVColor> colors;
   colors.push_back(YUVColor{0x00, 0x80, 0x80});
   frame_sink_.SetCopyOutputColor(colors.back());
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   NiceMock<MockConsumer> consumer;
   StartCapture(&consumer);
@@ -931,10 +935,10 @@
 TEST_F(FrameSinkVideoCapturerTest, CancelsInFlightCapturesOnStop) {
   const YUVColor color1 = {0xaa, 0xbb, 0xcc};
   frame_sink_.SetCopyOutputColor(color1);
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   // Start capturing to the first consumer.
   MockConsumer consumer;
@@ -1018,10 +1022,10 @@
 // the consumer.
 TEST_F(FrameSinkVideoCapturerTest, EventuallySendsARefreshFrame) {
   frame_sink_.SetCopyOutputColor(YUVColor{0x80, 0x80, 0x80});
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   MockConsumer consumer;
   const int num_refresh_frames = 2;  // Initial, plus later refresh.
@@ -1074,10 +1078,10 @@
 TEST_F(FrameSinkVideoCapturerTest,
        RessurectsFramesForChangingCaptureResolution) {
   frame_sink_.SetCopyOutputColor(YUVColor{0x80, 0x80, 0x80});
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   MockConsumer consumer;
   constexpr int num_refresh_frames = 3;  // Initial, plus two refreshes after
@@ -1172,9 +1176,9 @@
 // and refreshes cause variables of the cached CompositorFrameMetadata
 // (|last_frame_metadata|) to be used.
 TEST_F(FrameSinkVideoCapturerTest, CompositorFrameMetadataReachesConsumer) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   MockConsumer consumer;
   // Initial refresh frame for starting capture, plus later refresh.
@@ -1232,9 +1236,9 @@
 // Tests that frame metadata CAPTURE_COUNTER and CAPTURE_UPDATE_RECT are sent to
 // the consumer as part of each frame delivery.
 TEST_F(FrameSinkVideoCapturerTest, DeliversUpdateRectAndCaptureCounter) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   MockConsumer consumer;
   StartCapture(&consumer);
@@ -1347,9 +1351,9 @@
 // CAPTURE_COUNTER metadata value sent to the consumer reflects the frame drops
 // indicating that CAPTURE_UPDATE_RECT must be ignored.
 TEST_F(FrameSinkVideoCapturerTest, CaptureCounterSkipsWhenFramesAreDropped) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
 
   MockConsumer consumer;
   StartCapture(&consumer);
@@ -1398,10 +1402,10 @@
 }
 
 TEST_F(FrameSinkVideoCapturerTest, ClientCaptureStartsAndStops) {
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
   EXPECT_EQ(frame_sink_.number_clients_capturing(), 0);
 
   // Start capturing. frame_sink_ should now have one client capturing.
@@ -1416,15 +1420,19 @@
 
 TEST_F(FrameSinkVideoCapturerTest, RegionCaptureCropId) {
   SwitchToSizeSet(kSizeSets[4]);
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(kVideoCaptureTarget);
   EXPECT_EQ(frame_sink_.number_clients_capturing(), 0);
 
   static const auto kCropId = RegionCaptureCropId::CreateRandom();
   static const gfx::Rect kCropBounds{1, 2, 640, 478};
+
+  VideoCaptureTarget target(kVideoCaptureTarget.frame_sink_id, kCropId);
   frame_sink_.set_crop_bounds(kCropBounds);
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId, kCropId));
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(target))
+      .WillRepeatedly(Return(&frame_sink_));
+  capturer_->ChangeTarget(std::move(target));
 
   // Start capturing. frame_sink_ should now have one client capturing.
   NiceMock<MockConsumer> consumer;
@@ -1437,13 +1445,14 @@
 
 TEST_F(FrameSinkVideoCapturerTest, HandlesSubtreeCaptureId) {
   SwitchToSizeSet(kSizeSets[4]);
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
-      .WillRepeatedly(Return(&frame_sink_));
-
   static const gfx::Rect kCaptureBounds{1, 2, 1024, 768};
   static const SubtreeCaptureId kCaptureId{1234567u};
+
+  VideoCaptureTarget target(kVideoCaptureTarget.frame_sink_id, kCaptureId);
   frame_sink_.set_capture_bounds(kCaptureBounds);
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId, kCaptureId));
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(target))
+      .WillRepeatedly(Return(&frame_sink_));
+  capturer_->ChangeTarget(std::move(target));
 
   // Start capturing. frame_sink_ should now have one client capturing.
   NiceMock<MockConsumer> consumer;
@@ -1457,13 +1466,13 @@
 
 TEST_F(FrameSinkVideoCapturerTest, HandlesNullSubTargetPtrCorrectly) {
   SwitchToSizeSet(kSizeSets[4]);
-  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kFrameSinkId))
+  EXPECT_CALL(frame_sink_manager_, FindCapturableFrameSink(kVideoCaptureTarget))
       .WillRepeatedly(Return(&frame_sink_));
 
   // The default cause is a target with no sub target, passed as nullptr. Since
   // the SubTarget is a mojom variant, the default SubTarget::New() is actually
   // a zero value subtree capture identifier.
-  capturer_->ChangeTarget(VideoCaptureTarget(kFrameSinkId));
+  capturer_->ChangeTarget(VideoCaptureTarget(kVideoCaptureTarget));
   EXPECT_EQ(frame_sink_.number_clients_capturing(), 0);
 
   // Start capturing. frame_sink_ should now have one client capturing.
diff --git a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_manager.h b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_manager.h
index 15a682a..7fa2787d 100644
--- a/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_manager.h
+++ b/components/viz/service/frame_sinks/video_capture/frame_sink_video_capturer_manager.h
@@ -8,7 +8,7 @@
 namespace viz {
 
 class CapturableFrameSink;
-class FrameSinkId;
+struct VideoCaptureTarget;
 class FrameSinkVideoCapturerImpl;
 
 // Interface implemented by the owner/manager of FrameSinkVideoCapturerImpl
@@ -17,9 +17,9 @@
 class FrameSinkVideoCapturerManager {
  public:
   // Returns the CapturableFrameSink implementation associated with the given
-  // |frame_sink_id|, or nullptr if unknown.
+  // |target|, or nullptr if unknown.
   virtual CapturableFrameSink* FindCapturableFrameSink(
-      const FrameSinkId& frame_sink_id) = 0;
+      const VideoCaptureTarget& target) = 0;
 
   // Called once, when the mojo binding for the given |capturer| has been
   // closed. At this point, the capturer is a zombie waiting to be destroyed.
diff --git a/components/viz/test/data/oop_draw_image.png b/components/viz/test/data/oop_draw_image.png
index df9bfaf..cf6fb31 100644
--- a/components/viz/test/data/oop_draw_image.png
+++ b/components/viz/test/data/oop_draw_image.png
Binary files differ
diff --git a/components/viz/test/data/oop_draw_image_both_color_space.png b/components/viz/test/data/oop_draw_image_both_color_space.png
new file mode 100644
index 0000000..53605eb
--- /dev/null
+++ b/components/viz/test/data/oop_draw_image_both_color_space.png
Binary files differ
diff --git a/components/viz/test/data/oop_draw_image_matrix.png b/components/viz/test/data/oop_draw_image_matrix.png
new file mode 100644
index 0000000..79673fd
--- /dev/null
+++ b/components/viz/test/data/oop_draw_image_matrix.png
Binary files differ
diff --git a/components/viz/test/data/oop_draw_image_scaled.png b/components/viz/test/data/oop_draw_image_scaled.png
new file mode 100644
index 0000000..79673fd
--- /dev/null
+++ b/components/viz/test/data/oop_draw_image_scaled.png
Binary files differ
diff --git a/components/viz/test/data/oop_draw_image_shader_scaled.png b/components/viz/test/data/oop_draw_image_shader_scaled.png
new file mode 100644
index 0000000..79673fd
--- /dev/null
+++ b/components/viz/test/data/oop_draw_image_shader_scaled.png
Binary files differ
diff --git a/components/viz/test/data/oop_draw_image_source_color_space.png b/components/viz/test/data/oop_draw_image_source_color_space.png
new file mode 100644
index 0000000..9aa3ca8
--- /dev/null
+++ b/components/viz/test/data/oop_draw_image_source_color_space.png
Binary files differ
diff --git a/components/viz/test/data/oop_draw_record_shader.png b/components/viz/test/data/oop_draw_record_shader.png
new file mode 100644
index 0000000..79673fd
--- /dev/null
+++ b/components/viz/test/data/oop_draw_record_shader.png
Binary files differ
diff --git a/components/viz/test/data/oop_draw_record_shader_tiled.png b/components/viz/test/data/oop_draw_record_shader_tiled.png
new file mode 100644
index 0000000..55f8406
--- /dev/null
+++ b/components/viz/test/data/oop_draw_record_shader_tiled.png
Binary files differ
diff --git a/components/viz/test/data/oop_image_target_color_space.png b/components/viz/test/data/oop_image_target_color_space.png
new file mode 100644
index 0000000..53da23e
--- /dev/null
+++ b/components/viz/test/data/oop_image_target_color_space.png
Binary files differ
diff --git a/components/web_app_resources/web_app_default_offline.css b/components/web_app_resources/web_app_default_offline.css
new file mode 100644
index 0000000..7729554f
--- /dev/null
+++ b/components/web_app_resources/web_app_default_offline.css
@@ -0,0 +1,16 @@
+/* Copyright 2022 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+ body {
+    background-color: var(--customized-background-color);
+  }
+  h2 {
+    color: var(--theme-color);
+    height: 200px;
+    left: 50%;
+    margin-inline-start: -200px;
+    margin-top: -100px;
+    position: fixed;
+    top: 50%;
+    width: 400px;
+  }
\ No newline at end of file
diff --git a/components/web_app_resources/web_app_default_offline.html b/components/web_app_resources/web_app_default_offline.html
new file mode 100644
index 0000000..2659984
--- /dev/null
+++ b/components/web_app_resources/web_app_default_offline.html
@@ -0,0 +1,21 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<head>
+  <meta charset="utf-8">
+  <title>$i18n{title}</title>
+  <link rel="stylesheet" href="../security_interstitials/core/common/resources/interstitial_core.css">
+  <link rel="stylesheet" href="../security_interstitials/core/common/resources/interstitial_common.css">
+  <link rel="stylesheet" href="web_app_default_offline.css">
+  <style>
+    :root {
+      --customized-background-color: $i18n{customized_background_color};
+      --theme-color: $i18n{theme_color};
+    }
+  </style>
+</head>
+  <body style="font-family: $i18n{fontfamily};font-size:$i18n{fontsize}">
+    <h1>$i18n{app_short_name}</h1>
+    <h2  id="default-web-app-msg">$i18n{web_app_default_offline_message}</h2>
+    <!-- TODO(crbug.com/1285723): Add web app icon. -->
+  </body>
+</html>
\ No newline at end of file
diff --git a/components/webapps/services/web_app_origin_association/web_app_origin_association_parser.cc b/components/webapps/services/web_app_origin_association/web_app_origin_association_parser.cc
index 1bd0c32..5e231cd 100644
--- a/components/webapps/services/web_app_origin_association/web_app_origin_association_parser.cc
+++ b/components/webapps/services/web_app_origin_association/web_app_origin_association_parser.cc
@@ -83,7 +83,7 @@
     return result;
   }
 
-  for (const auto& app_item : apps_value->GetList()) {
+  for (const auto& app_item : apps_value->GetListDeprecated()) {
     if (!app_item.is_dict()) {
       AddErrorInfo("Associated app ignored, type object expected.");
       continue;
@@ -169,7 +169,7 @@
   }
 
   std::vector<std::string> paths;
-  for (const auto& path_item : paths_value->GetList()) {
+  for (const auto& path_item : paths_value->GetListDeprecated()) {
     if (!path_item.is_string()) {
       AddErrorInfo(key + " entry ignored, type string expected.");
       continue;
diff --git a/components/webcrypto/algorithms/rsa_pss_unittest.cc b/components/webcrypto/algorithms/rsa_pss_unittest.cc
index 0160c776..f0cf03a 100644
--- a/components/webcrypto/algorithms/rsa_pss_unittest.cc
+++ b/components/webcrypto/algorithms/rsa_pss_unittest.cc
@@ -176,11 +176,11 @@
   const base::Value* tests = test_data.FindListKey("tests");
   ASSERT_TRUE(tests);
 
-  for (size_t test_index = 0; test_index < tests->GetList().size();
+  for (size_t test_index = 0; test_index < tests->GetListDeprecated().size();
        ++test_index) {
     SCOPED_TRACE(test_index);
 
-    const base::Value& test_value = tests->GetList()[test_index];
+    const base::Value& test_value = tests->GetListDeprecated()[test_index];
     ASSERT_TRUE(test_value.is_dict());
     const base::DictionaryValue* test =
         &base::Value::AsDictionaryValue(test_value);
diff --git a/components/webcrypto/jwk.cc b/components/webcrypto/jwk.cc
index 14d535e5..8578653 100644
--- a/components/webcrypto/jwk.cc
+++ b/components/webcrypto/jwk.cc
@@ -114,7 +114,7 @@
   std::set<std::string> unrecognized_usages;
 
   *usages = 0;
-  base::Value::ConstListView key_ops_list = key_ops->GetList();
+  base::Value::ConstListView key_ops_list = key_ops->GetListDeprecated();
   for (size_t i = 0; i < key_ops_list.size(); ++i) {
     const base::Value& key_op_value = key_ops_list[i];
     if (!key_op_value.is_string()) {
diff --git a/components/wifi/wifi_service_win.cc b/components/wifi/wifi_service_win.cc
index 349215e7..776d399c1 100644
--- a/components/wifi/wifi_service_win.cc
+++ b/components/wifi/wifi_service_win.cc
@@ -26,6 +26,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/time/time.h"
 #include "base/values.h"
 #include "base/win/registry.h"
 #include "base/win/win_util.h"
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 3750bf5..0afe852d 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -2111,8 +2111,6 @@
       "../app_shim_remote_cocoa/web_drag_source_mac.mm",
       "accessibility/accessibility_event_recorder_mac.h",
       "accessibility/accessibility_event_recorder_mac.mm",
-      "accessibility/accessibility_tree_formatter_mac.h",
-      "accessibility/accessibility_tree_formatter_mac.mm",
       "accessibility/browser_accessibility_cocoa.h",
       "accessibility/browser_accessibility_cocoa.mm",
       "accessibility/browser_accessibility_mac.h",
diff --git a/content/browser/accessibility/accessibility_event_recorder_mac.mm b/content/browser/accessibility/accessibility_event_recorder_mac.mm
index c686411..da1ba0b 100644
--- a/content/browser/accessibility/accessibility_event_recorder_mac.mm
+++ b/content/browser/accessibility/accessibility_event_recorder_mac.mm
@@ -14,10 +14,10 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
-#include "content/browser/accessibility/accessibility_tree_formatter_mac.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "ui/accessibility/platform/ax_private_webkit_constants_mac.h"
 #include "ui/accessibility/platform/inspect/ax_inspect_utils_mac.h"
+#include "ui/accessibility/platform/inspect/ax_tree_formatter_mac.h"
 
 namespace content {
 
@@ -131,7 +131,7 @@
                                                   CFDictionaryRef user_info) {
   std::string notification_str = base::SysCFStringRefToUTF8(notification);
 
-  auto formatter = AccessibilityTreeFormatterMac();
+  auto formatter = ui::AXTreeFormatterMac();
   formatter.SetPropertyFilters(property_filters_,
                                ui::AXTreeFormatter::kFiltersDefaultSet);
 
diff --git a/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc b/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc
index 3f61100..e20f1532 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc
@@ -678,7 +678,7 @@
 
   const base::ListValue* states_value;
   if (node.GetList("states", &states_value)) {
-    for (const auto& entry : states_value->GetList()) {
+    for (const auto& entry : states_value->GetListDeprecated()) {
       const std::string* state_value = entry.GetIfString();
       if (state_value)
         WriteAttribute(false, *state_value, &line);
@@ -688,7 +688,7 @@
   const base::ListValue* action_names_list;
   std::vector<std::string> action_names;
   if (node.GetList("actions", &action_names_list)) {
-    for (const auto& entry : action_names_list->GetList()) {
+    for (const auto& entry : action_names_list->GetListDeprecated()) {
       const std::string* action_name = entry.GetIfString();
       if (action_name)
         action_names.push_back(*action_name);
@@ -703,7 +703,7 @@
 
   const base::ListValue* relations_value;
   if (node.GetList("relations", &relations_value)) {
-    for (const auto& entry : relations_value->GetList()) {
+    for (const auto& entry : relations_value->GetListDeprecated()) {
       const std::string* relation_value = entry.GetIfString();
       if (relation_value) {
         // By default, exclude embedded-by because that should appear on every
@@ -730,7 +730,7 @@
 
   const base::ListValue* value_info;
   if (node.GetList("value", &value_info)) {
-    for (const auto& entry : value_info->GetList()) {
+    for (const auto& entry : value_info->GetListDeprecated()) {
       const std::string* value_property = entry.GetIfString();
       if (value_property)
         WriteAttribute(true, *value_property, &line);
@@ -739,7 +739,7 @@
 
   const base::ListValue* table_info;
   if (node.GetList("table", &table_info)) {
-    for (const auto& entry : table_info->GetList()) {
+    for (const auto& entry : table_info->GetListDeprecated()) {
       const std::string* table_property = entry.GetIfString();
       if (table_property)
         WriteAttribute(true, *table_property, &line);
@@ -748,7 +748,7 @@
 
   const base::ListValue* cell_info;
   if (node.GetList("cell", &cell_info)) {
-    for (const auto& entry : cell_info->GetList()) {
+    for (const auto& entry : cell_info->GetListDeprecated()) {
       const std::string* cell_property = entry.GetIfString();
       if (cell_property)
         WriteAttribute(true, *cell_property, &line);
@@ -757,7 +757,7 @@
 
   const base::ListValue* text_info;
   if (node.GetList("text", &text_info)) {
-    for (const auto& entry : text_info->GetList()) {
+    for (const auto& entry : text_info->GetListDeprecated()) {
       const std::string* text_property = entry.GetIfString();
       if (text_property)
         WriteAttribute(false, *text_property, &line);
@@ -766,7 +766,7 @@
 
   const base::ListValue* hypertext_info;
   if (node.GetList("hypertext", &hypertext_info)) {
-    for (const auto& entry : hypertext_info->GetList()) {
+    for (const auto& entry : hypertext_info->GetListDeprecated()) {
       const std::string* hypertext_property = entry.GetIfString();
       if (hypertext_property)
         WriteAttribute(false, *hypertext_property, &line);
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
index 54429673..80f6e1a 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -738,7 +738,7 @@
     const base::Value* value = dict.FindListPath(ui::ToString(attr));
     if (!value || !value->is_list())
       continue;
-    base::Value::ConstListView list = value->GetList();
+    base::Value::ConstListView list = value->GetListDeprecated();
     std::string attr_string(ui::ToString(attr));
     attr_string.push_back('=');
     for (size_t i = 0; i < list.size(); ++i) {
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.h b/content/browser/accessibility/accessibility_tree_formatter_mac.h
deleted file mode 100644
index fa130df..0000000
--- a/content/browser/accessibility/accessibility_tree_formatter_mac.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_MAC_H_
-#define CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_MAC_H_
-
-#include "content/common/content_export.h"
-#include "ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h"
-#include "ui/accessibility/platform/inspect/ax_tree_formatter_base.h"
-
-@class BrowserAccessibilityCocoa;
-
-namespace content {
-
-class CONTENT_EXPORT AccessibilityTreeFormatterMac
-    : public ui::AXTreeFormatterBase {
- public:
-  AccessibilityTreeFormatterMac();
-  ~AccessibilityTreeFormatterMac() override;
-
-  // AXTreeFormatter
-  base::Value BuildTree(ui::AXPlatformNodeDelegate* root) const override;
-  base::Value BuildTreeForSelector(
-      const AXTreeSelector& selector) const override;
-
-  base::Value BuildNode(ui::AXPlatformNodeDelegate* node) const override;
-
-  std::string EvaluateScript(
-      const AXTreeSelector& selector,
-      const ui::AXInspectScenario& scenario) const override;
-  std::string EvaluateScript(
-      ui::AXPlatformNodeDelegate* root,
-      const std::vector<ui::AXScriptInstruction>& instructions,
-      size_t start_index,
-      size_t end_index) const override;
-  std::string EvaluateScript(
-      id platform_root,
-      const std::vector<ui::AXScriptInstruction>& instructions,
-      size_t start_index,
-      size_t end_index) const;
-
-  // AccessibilityTreeFormatterMac
-  base::Value BuildNode(const id node) const;
-
- protected:
-  void AddDefaultFilters(
-      std::vector<ui::AXPropertyFilter>* property_filters) override;
-
- private:
-  base::Value BuildTree(const id root) const;
-  base::Value BuildTreeForAXUIElement(AXUIElementRef node) const;
-
-  void RecursiveBuildTree(const id node,
-                          const NSRect& root_rect,
-                          const ui::AXTreeIndexerMac* indexer,
-                          base::Value* dict) const;
-
-  void AddProperties(const id node,
-                     const NSRect& root_rect,
-                     const ui::AXTreeIndexerMac* indexer,
-                     base::Value* dict) const;
-
-  // Invokes an attributes by a property node.
-  ui::AXOptionalNSObject InvokeAttributeFor(
-      const BrowserAccessibilityCocoa* cocoa_node,
-      const ui::AXPropertyNode& property_node,
-      const ui::AXTreeIndexerMac* indexer) const;
-
-  base::Value PopulateLocalPosition(const id node,
-                                    const NSRect& root_rect) const;
-
-  std::string ProcessTreeForOutput(
-      const base::DictionaryValue& node) const override;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_ACCESSIBILITY_ACCESSIBILITY_TREE_FORMATTER_MAC_H_
diff --git a/content/browser/accessibility/accessibility_tree_formatter_win.cc b/content/browser/accessibility/accessibility_tree_formatter_win.cc
index ee5b175..580046f 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_win.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_win.cc
@@ -841,7 +841,7 @@
         // attribute names.
         std::unique_ptr<base::ListValue> filtered_list(new base::ListValue());
 
-        for (const auto& entry : value->GetList()) {
+        for (const auto& entry : value->GetListDeprecated()) {
           std::string string_value;
           if (entry.is_string()) {
             if (WriteAttribute(false, entry.GetString(), &line))
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm b/content/browser/accessibility/ax_tree_formatter_mac_browsertest.mm
similarity index 81%
rename from content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm
rename to content/browser/accessibility/ax_tree_formatter_mac_browsertest.mm
index 6f610fb8..12abb22a 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm
+++ b/content/browser/accessibility/ax_tree_formatter_mac_browsertest.mm
@@ -26,10 +26,15 @@
 const ui::AXPropertyFilter::Type ALLOW_EMPTY =
     ui::AXPropertyFilter::ALLOW_EMPTY;
 
-class AccessibilityTreeFormatterMacBrowserTest : public ContentBrowserTest {
+// ui::AXTreeFormatterMac browser tests.
+//
+// Run:
+//   out_dir/content_browsertests
+//     --gtest_filter="AXTreeFormatterMacBrowserTest.*"
+class AXTreeFormatterMacBrowserTest : public ContentBrowserTest {
  public:
-  AccessibilityTreeFormatterMacBrowserTest() {}
-  ~AccessibilityTreeFormatterMacBrowserTest() override {}
+  AXTreeFormatterMacBrowserTest() = default;
+  ~AXTreeFormatterMacBrowserTest() override = default;
 
   // Checks the formatted accessible tree for the given data URL.
   void TestFormat(const char* url,
@@ -59,7 +64,7 @@
   }
 };
 
-void AccessibilityTreeFormatterMacBrowserTest::TestFormat(
+void AXTreeFormatterMacBrowserTest::TestFormat(
     const char* url,
     const std::vector<ui::AXPropertyFilter>& property_filters,
     const std::vector<ui::AXNodeFilter>& node_filters,
@@ -86,7 +91,7 @@
   EXPECT_EQ(actual, expected);
 }
 
-void AccessibilityTreeFormatterMacBrowserTest::TestFormat(
+void AXTreeFormatterMacBrowserTest::TestFormat(
     const char* url,
     const std::vector<const char*>& filters,
     const char* expected) const {
@@ -97,7 +102,7 @@
   TestFormat(url, property_filters, {}, expected);
 }
 
-void AccessibilityTreeFormatterMacBrowserTest::TestScript(
+void AXTreeFormatterMacBrowserTest::TestScript(
     const char* url,
     const std::vector<const char*>& scripts,
     const char* expected) const {
@@ -125,7 +130,7 @@
   EXPECT_EQ(actual, expected);
 }
 
-void AccessibilityTreeFormatterMacBrowserTest::TestWrongParameters(
+void AXTreeFormatterMacBrowserTest::TestWrongParameters(
     const char* url,
     const std::vector<const char*>& parameters,
     const char* filter_pattern,
@@ -150,8 +155,7 @@
 
 }  // namespace
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       DefaultAttributes) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, DefaultAttributes) {
   TestFormat(R"~~(data:text/html,
                     <input aria-label='input'>)~~",
              {},
@@ -161,7 +165,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Filters_NoWildcardProperty) {
   TestFormat(R"~~(data:text/html,
                     <input class='classolasso'>)~~",
@@ -172,8 +176,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Filters_LineIndex) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Filters_LineIndex) {
   TestFormat(R"~~(data:text/html,
                     <input class='input_at_3rd_line'>
                     <input class='input_at_4th_line'>
@@ -186,8 +189,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Serialize_AXTextMarker) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Serialize_AXTextMarker) {
   TestFormat(R"~~(data:text/html,
                     <p>Paragraph</p>)~~",
              {":3;AXStartTextMarker=*"}, R"~~(AXWebArea
@@ -196,7 +198,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Serialize_AXTextMarkerRange) {
   TestFormat(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>
@@ -209,8 +211,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Serialize_NSRange) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Serialize_NSRange) {
   TestFormat(R"~~(data:text/html,<input id='input' value='alphabet'>
                     <script>
                       let input = document.getElementById('input');
@@ -222,7 +223,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_Int) {
   TestFormat(R"~~(data:text/html,
                     <p contentEditable='true'>Text</p>)~~",
@@ -232,7 +233,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_Int_WrongParameters) {
   TestWrongParameters(R"~~(data:text/html,
                            <p contentEditable='true'>Text</p>)~~",
@@ -243,7 +244,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_IntArray) {
   TestFormat(R"~~(data:text/html,
                     <table role="grid"><tr><td>CELL</td></tr></table>)~~",
@@ -259,7 +260,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_IntArray_NilValue) {
   TestFormat(R"~~(data:text/html,
                     <table role="grid"></table>)~~",
@@ -269,7 +270,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_IntArray_WrongParameters) {
   TestWrongParameters(R"~~(data:text/html,
                            <table role="grid"><tr><td>CELL</td></tr></table>)~~",
@@ -286,7 +287,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_TextMarkerArray) {
   TestScript(
       R"~~(data:text/html,
@@ -299,7 +300,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_NSRange) {
   TestFormat(R"~~(data:text/html,
                     <p contentEditable='true'>Text</p>)~~",
@@ -309,7 +310,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_NSRange_WrongParameters) {
   TestWrongParameters(R"~~(data:text/html,
                            <p contentEditable='true'>Text</p>)~~",
@@ -321,7 +322,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_UIElement) {
   TestFormat(R"~~(data:text/html,
                     <p contentEditable='true'>Text</p>)~~",
@@ -331,7 +332,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_UIElement_WrongParameters) {
   TestWrongParameters(R"~~(data:text/html,
                            <p contentEditable='true'>Text</p>)~~",
@@ -343,7 +344,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_TextMarker) {
   TestFormat(R"~~(data:text/html,
                     <p>Text</p>)~~",
@@ -354,7 +355,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_TextMarker_WrongParameters) {
   TestWrongParameters(
       R"~~(data:text/html,
@@ -367,7 +368,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        ParameterizedAttributes_TextMarkerRange) {
   TestFormat(R"~~(data:text/html,
                     <p>Text</p>)~~",
@@ -380,7 +381,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(
-    AccessibilityTreeFormatterMacBrowserTest,
+    AXTreeFormatterMacBrowserTest,
     ParameterizedAttributes_TextMarkerRange_WrongParameters) {
   TestWrongParameters(
       R"~~(data:text/html,
@@ -394,7 +395,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest, NestedCalls) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, NestedCalls) {
   TestFormat(R"~~(data:text/html,
                     <p>Text</p>)~~",
              {":1;AXIndexForTextMarker(AXTextMarkerForIndex(0))"},
@@ -404,7 +405,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest, Script) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script) {
   TestScript(R"~~(data:text/html,
                     <input aria-label='input'>)~~",
              {":3.AXRole"},
@@ -412,8 +413,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_Document) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Document) {
   TestScript(R"~~(data:text/html,
                     <input id='textbox' aria-label='input'>)~~",
              {"document.AXRole"},
@@ -421,8 +421,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_ByDOMId) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_ByDOMId) {
   TestScript(R"~~(data:text/html,
                     <input id='textbox' aria-label='input'>)~~",
              {"textbox.AXRole"},
@@ -430,7 +429,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_ByDOMId_WrongDOMId) {
   TestScript(R"~~(data:text/html,
                     <input id='textbox' aria-label='input'>)~~",
@@ -439,7 +438,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_UnrecognizedAttribute) {
   TestScript(R"~~(data:text/html,
                     <input id='textbox' aria-label='input'>)~~",
@@ -448,7 +447,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_NotApplicableAttribute) {
   TestScript(R"~~(data:text/html,
                     <input id='textbox'>)~~",
@@ -457,8 +456,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_NullValue) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_NullValue) {
   TestScript(R"~~(data:text/html,
                     <input id='input'>)~~",
              {"input.AXTitleUIElement"},
@@ -466,8 +464,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_Comment) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Comment) {
   TestScript(R"~~(data:text/html,
                     <input id='textbox' aria-label='input'>)~~",
              {"// textbox.AXRolio"},
@@ -475,21 +472,19 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_Object_IntArray) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Object_IntArray) {
   TestScript("data:text/html,", {"var:= [3, 4]"},
              R"~~(var=[3, 4]
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_Object_NSRange) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Object_NSRange) {
   TestScript("data:text/html,", {"var:= {loc: 3, len: 2}"},
              R"~~(var={loc: 3, len: 2}
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Object_TextMarker) {
   TestScript(R"~~(data:text/html,
                     <textarea id="textarea">Text</textarea>)~~",
@@ -498,7 +493,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Object_TextMarkerArray) {
   TestScript(R"~~(data:text/html,
                     <textarea id="textarea">Text</textarea>)~~",
@@ -507,7 +502,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Object_TextMarkerRange) {
   TestScript(R"~~(data:text/html,
                     <textarea id="textarea">Text</textarea>)~~",
@@ -516,7 +511,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest, Script_Chain) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Chain) {
   TestScript(R"~~(data:text/html,
                     <input id='input' aria-label='input'>)~~",
              {"input.AXFocusableAncestor.AXRole"},
@@ -524,8 +519,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_Chain_Array) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Chain_Array) {
   TestScript(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>)~~",
              {"p.AXChildren[0].AXRole"},
@@ -533,7 +527,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Chain_Array_OutOfRange) {
   TestScript(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>)~~",
@@ -542,7 +536,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Chain_Array_Count) {
   TestScript(R"~~(data:text/html,
                     <p id='p'><span>1</span><span>2</span><span>3</span></p>)~~",
@@ -551,8 +545,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_Chain_Array_Has) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Chain_Array_Has) {
   TestScript(R"~~(data:text/html,
                     <button id='b'></button>)~~",
              {"b.accessibilityAttributeNames.has(AXRole)"},
@@ -560,7 +553,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Chain_Array_Has_No) {
   TestScript(R"~~(data:text/html,
                     <button id='b'></button>)~~",
@@ -569,7 +562,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Chain_TextRange_Anchor) {
   TestScript(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>)~~",
@@ -578,7 +571,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Chain_TextRange_Focus) {
   TestScript(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>)~~",
@@ -587,7 +580,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Chain_TextRange_Error) {
   TestScript(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>)~~",
@@ -596,7 +589,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Variables_AXElement) {
   TestScript(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>)~~",
@@ -606,8 +599,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_Variables_Null) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_Variables_Null) {
   TestScript(R"~~(data:text/html,
                     <p id='p'>Paragraph</p>)~~",
              {"var:= p.AXTitleUIElement", "var"},
@@ -616,8 +608,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_ActionNames) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_ActionNames) {
   TestScript(
       R"~~(data:text/html,
                     <button id='button'>Press me</button>)~~",
@@ -626,15 +617,13 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_PerformAction) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_PerformAction) {
   TestScript(R"~~(data:text/html,
                     <button id='button'>Press me</button>)~~",
              {"button.AXPerformAction(AXPress)"}, R"~~()~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
-                       Script_SetAttribute) {
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest, Script_SetAttribute) {
   TestScript(
       R"~~(data:text/html,
                     <textarea id="textarea">Text</textarea>)~~",
@@ -644,7 +633,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Accessibility_API) {
   TestScript(R"~~(data:text/html,
                     <button id='b'></button>)~~",
@@ -653,7 +642,7 @@
 )~~");
 }
 
-IN_PROC_BROWSER_TEST_F(AccessibilityTreeFormatterMacBrowserTest,
+IN_PROC_BROWSER_TEST_F(AXTreeFormatterMacBrowserTest,
                        Script_Accessibility_API_With_Argument) {
   TestScript(R"~~(data:text/html,
                     <button id='b'></button>)~~",
diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm
index 23787ef..e53f02c 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa.mm
@@ -733,7 +733,7 @@
     _children.reset([[NSMutableArray alloc] initWithCapacity:childCount]);
     for (auto it = _owner->PlatformChildrenBegin();
          it != _owner->PlatformChildrenEnd(); ++it) {
-      BrowserAccessibilityCocoa* child = ToBrowserAccessibilityCocoa(it.get());
+      BrowserAccessibilityCocoa* child = it->GetNativeViewAccessible();
       if ([child isIgnored])
         [_children addObjectsFromArray:[child children]];
       else
@@ -749,11 +749,8 @@
 
       // This only became necessary as a result of crbug.com/93095. It should be
       // a DCHECK in the future.
-      if (child) {
-        BrowserAccessibilityCocoa* child_cocoa =
-            ToBrowserAccessibilityCocoa(child);
-        [_children addObject:child_cocoa];
-      }
+      if (child)
+        [_children addObject:child->GetNativeViewAccessible()];
     }
     _needsToUpdateChildren = false;
   }
@@ -770,7 +767,7 @@
   if ([self isIgnored]) {
     BrowserAccessibility* parent = _owner->PlatformGetParent();
     if (parent)
-      [ToBrowserAccessibilityCocoa(parent) childrenChanged];
+      [parent->GetNativeViewAccessible() childrenChanged];
   }
 }
 
@@ -936,11 +933,10 @@
 - (id)editableAncestor {
   if (![self instanceActive])
     return nil;
-  const BrowserAccessibility* text_field_ancestor =
-      _owner->PlatformGetTextFieldAncestor();
-  if (text_field_ancestor)
-    return ToBrowserAccessibilityCocoa(text_field_ancestor);
-  return nil;
+  auto* text_field_ancestor =
+      const_cast<BrowserAccessibility*>(_owner->PlatformGetTextFieldAncestor());
+  return text_field_ancestor ? text_field_ancestor->GetNativeViewAccessible()
+                             : nil;
 }
 
 - (NSNumber*)enabled {
@@ -987,7 +983,7 @@
     if (childCount > 0) {
       BrowserAccessibility* tableHeader = _owner->PlatformGetLastChild();
       if (tableHeader->GetRole() == ax::mojom::Role::kTableHeaderContainer)
-        return ToBrowserAccessibilityCocoa(tableHeader);
+        return tableHeader->GetNativeViewAccessible();
     }
   } else if ([self internalRole] == ax::mojom::Role::kColumn) {
     _owner->GetIntAttribute(ax::mojom::IntAttribute::kTableColumnHeaderId,
@@ -1001,7 +997,7 @@
     BrowserAccessibility* headerObject =
         _owner->manager()->GetFromID(headerElementId);
     if (headerObject)
-      return ToBrowserAccessibilityCocoa(headerObject);
+      return headerObject->GetNativeViewAccessible();
   }
   return nil;
 }
@@ -1072,7 +1068,7 @@
     return nil;
 
   const BrowserAccessibilityCocoa* cocoaContainer =
-      ToBrowserAccessibilityCocoa(container);
+      container->GetNativeViewAccessible();
   int currentIndex = 0;
   if ([cocoaContainer findRowIndex:self withCurrentIndex:&currentIndex]) {
     return @(currentIndex);
@@ -1161,7 +1157,7 @@
     BrowserAccessibility* element =
         _owner->manager()->GetFromID(attributeValues[i]);
     if (element)
-      [outArray addObject:ToBrowserAccessibilityCocoa(element)];
+      [outArray addObject:element->GetNativeViewAccessible()];
   }
 }
 
@@ -1180,7 +1176,7 @@
     BrowserAccessibility* target =
         _owner->manager()->GetFromID(static_cast<int32_t>(target_id));
     if (target)
-      [ret addObject:ToBrowserAccessibilityCocoa(target)];
+      [ret addObject:target->GetNativeViewAccessible()];
   }
 
   [self addLinkedUIElementsFromAttribute:ax::mojom::IntListAttribute::
@@ -1263,7 +1259,7 @@
     return nil;
 
   NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease];
-  [ret addObject:ToBrowserAccessibilityCocoa(container)];
+  [ret addObject:container->GetNativeViewAccessible()];
   return ret;
 }
 
@@ -1293,7 +1289,7 @@
   // A nil parent means we're the root.
   if (_owner->PlatformGetParent()) {
     return NSAccessibilityUnignoredAncestor(
-        ToBrowserAccessibilityCocoa(_owner->PlatformGetParent()));
+        _owner->PlatformGetParent()->GetNativeViewAccessible());
   } else {
     // Hook back up to RenderWidgetHostViewCocoa.
     BrowserAccessibilityManagerMac* manager =
@@ -1543,14 +1539,14 @@
     for (int32_t id : headerIds) {
       BrowserAccessibility* cell = _owner->manager()->GetFromID(id);
       if (cell)
-        [ret addObject:ToBrowserAccessibilityCocoa(cell)];
+        [ret addObject:cell->GetNativeViewAccessible()];
     }
   } else {
     // Otherwise this is a cell, return the row headers for this cell.
     for (int32_t id : _owner->node()->GetTableCellRowHeaderNodeIds()) {
       BrowserAccessibility* cell = _owner->manager()->GetFromID(id);
       if (cell)
-        [ret addObject:ToBrowserAccessibilityCocoa(cell)];
+        [ret addObject:cell->GetNativeViewAccessible()];
     }
   }
 
@@ -1587,7 +1583,7 @@
   for (int32_t node_id : node_id_list) {
     BrowserAccessibility* rowElement = _owner->manager()->GetFromID(node_id);
     if (rowElement)
-      [ret addObject:ToBrowserAccessibilityCocoa(rowElement)];
+      [ret addObject:rowElement->GetNativeViewAccessible()];
   }
 
   return ret;
@@ -1615,7 +1611,7 @@
     // selection is tethered to the focus.
     if (!GetState(_owner, ax::mojom::State::kMultiselectable) &&
         focusedChild->GetBoolAttribute(ax::mojom::BoolAttribute::kSelected)) {
-      [ret addObject:ToBrowserAccessibilityCocoa(focusedChild)];
+      [ret addObject:focusedChild->GetNativeViewAccessible()];
       return ret;
     }
 
@@ -1624,7 +1620,7 @@
     // this is how VoiceOver determines where to draw the focus ring around the
     // active item.
     if (focusedChild->GetBoolAttribute(ax::mojom::BoolAttribute::kSelected))
-      [ret addObject:ToBrowserAccessibilityCocoa(focusedChild)];
+      [ret addObject:focusedChild->GetNativeViewAccessible()];
   }
 
   // If this container is multi-selectable, we need to return any additional
@@ -1636,7 +1632,7 @@
     BrowserAccessibility* child = it.get();
     if (child->GetBoolAttribute(ax::mojom::BoolAttribute::kSelected) &&
         child != focusedChild) {
-      [ret addObject:ToBrowserAccessibilityCocoa(child)];
+      [ret addObject:child->GetNativeViewAccessible()];
     }
   }
 
@@ -1853,7 +1849,7 @@
     BrowserAccessibility* titleElement =
         _owner->manager()->GetFromID(labelledby_ids[0]);
     if (titleElement)
-      return ToBrowserAccessibilityCocoa(titleElement);
+      return titleElement->GetNativeViewAccessible();
   }
 
   return nil;
@@ -1993,7 +1989,7 @@
   for (int32_t id : _owner->node()->GetTableUniqueCellIds()) {
     BrowserAccessibility* cell = _owner->manager()->GetFromID(id);
     if (cell)
-      [ret addObject:ToBrowserAccessibilityCocoa(cell)];
+      [ret addObject:cell->GetNativeViewAccessible()];
   }
   return ret;
 }
@@ -2037,8 +2033,7 @@
 - (void)getTreeItemDescendantNodeIds:(std::vector<int32_t>*)tree_item_ids {
   for (auto it = _owner->PlatformChildrenBegin();
        it != _owner->PlatformChildrenEnd(); ++it) {
-    const BrowserAccessibilityCocoa* child =
-        ToBrowserAccessibilityCocoa(it.get());
+    const BrowserAccessibilityCocoa* child = it->GetNativeViewAccessible();
 
     if ([child internalRole] == ax::mojom::Role::kTreeItem) {
       tree_item_ids->push_back([child hash]);
@@ -2216,7 +2211,7 @@
 
     BrowserAccessibility* cell = _owner->manager()->GetFromID(cellNode->id());
     if (cell)
-      return ToBrowserAccessibilityCocoa(cell);
+      return cell->GetNativeViewAccessible();
   }
 
   if ([attribute
@@ -2227,7 +2222,7 @@
       BrowserAccessibility* ui_element =
           _owner->manager()->GetFromAXNode(position->GetAnchor());
       if (ui_element)
-        return ToBrowserAccessibilityCocoa(ui_element);
+        return ui_element->GetNativeViewAccessible();
     }
 
     return nil;
@@ -2543,7 +2538,7 @@
       NSMutableArray* result = [NSMutableArray arrayWithCapacity:count];
       for (size_t i = 0; i < count; ++i) {
         BrowserAccessibility* match = search.GetMatchAtIndex(i);
-        [result addObject:ToBrowserAccessibilityCocoa(match)];
+        [result addObject:match->GetNativeViewAccessible()];
       }
       return result;
     }
@@ -3166,7 +3161,8 @@
   if (![self instanceActive])
     return nil;
 
-  return ToBrowserAccessibilityCocoa(_owner->manager()->GetFocus());
+  ui::AXPlatformNodeDelegate* focus_node = _owner->manager()->GetFocus();
+  return focus_node ? focus_node->GetNativeViewAccessible() : nullptr;
 }
 
 // Returns the deepest accessibility child that should not be ignored.
@@ -3210,7 +3206,7 @@
   if (!hit)
     return nil;
 
-  return NSAccessibilityUnignoredAncestor(ToBrowserAccessibilityCocoa(hit));
+  return NSAccessibilityUnignoredAncestor(hit->GetNativeViewAccessible());
 }
 
 - (BOOL)isEqual:(id)object {
diff --git a/content/browser/accessibility/browser_accessibility_cocoa_browsertest.mm b/content/browser/accessibility/browser_accessibility_cocoa_browsertest.mm
index 050c797a..05cfc8e5 100644
--- a/content/browser/accessibility/browser_accessibility_cocoa_browsertest.mm
+++ b/content/browser/accessibility/browser_accessibility_cocoa_browsertest.mm
@@ -118,7 +118,7 @@
                    ui::DomCode::US_B, ui::VKEY_B, false, false, false, false);
 
   base::scoped_nsobject<BrowserAccessibilityCocoa> cocoa_text_field(
-      [ToBrowserAccessibilityCocoa(text_field) retain]);
+      [text_field->GetNativeViewAccessible() retain]);
   AccessibilityNotificationWaiter value_waiter(shell()->web_contents(),
                                                ui::kAXModeComplete,
                                                ax::mojom::Event::kValueChanged);
@@ -165,7 +165,7 @@
   BrowserAccessibility* table = FindNode(ax::mojom::Role::kTable);
   ASSERT_NE(nullptr, table);
   base::scoped_nsobject<BrowserAccessibilityCocoa> cocoa_table(
-      [ToBrowserAccessibilityCocoa(table) retain]);
+      [table->GetNativeViewAccessible() retain]);
 
   // Test AXCellForColumnAndRow for four coordinates
   for (unsigned col = 0; col < 2; col++) {
@@ -200,7 +200,7 @@
   BrowserAccessibility* text = FindNode(ax::mojom::Role::kStaticText);
   ASSERT_NE(nullptr, text);
 
-  BrowserAccessibilityCocoa* cocoa_text = ToBrowserAccessibilityCocoa(text);
+  BrowserAccessibilityCocoa* cocoa_text = text->GetNativeViewAccessible();
   ASSERT_NE(nil, cocoa_text);
 
   NSPoint position = [[cocoa_text position] pointValue];
@@ -400,7 +400,7 @@
     BrowserAccessibility* child =
         manager->GetRoot()->PlatformGetChild(child_index);
     base::scoped_nsobject<BrowserAccessibilityCocoa> child_obj(
-        [ToBrowserAccessibilityCocoa(child) retain]);
+        [child->GetNativeViewAccessible() retain]);
 
     EXPECT_NSEQ(base::SysUTF8ToNSString(expected_descriptions[child_index]),
                 [child_obj descriptionForAccessibility]);
@@ -487,7 +487,7 @@
 
   BrowserAccessibility* table = manager->GetRoot()->PlatformGetChild(0);
   base::scoped_nsobject<BrowserAccessibilityCocoa> table_obj(
-      [ToBrowserAccessibilityCocoa(table) retain]);
+      [table->GetNativeViewAccessible() retain]);
   NSArray* row_nodes = [table_obj rows];
 
   EXPECT_EQ(3U, [row_nodes count]);
@@ -537,7 +537,7 @@
 
   BrowserAccessibility* column = manager->GetRoot()->PlatformGetChild(0);
   base::scoped_nsobject<BrowserAccessibilityCocoa> col_obj(
-      [ToBrowserAccessibilityCocoa(column) retain]);
+      [column->GetNativeViewAccessible() retain]);
   EXPECT_NSEQ(@"AXColumn", [col_obj role]);
   EXPECT_NSEQ(@"column1", [col_obj descriptionForAccessibility]);
 
@@ -566,7 +566,7 @@
 
   BrowserAccessibility* tree = FindNode(ax::mojom::Role::kTree);
   base::scoped_nsobject<BrowserAccessibilityCocoa> cocoa_tree(
-      [ToBrowserAccessibilityCocoa(tree) retain]);
+      [tree->GetNativeViewAccessible() retain]);
 
   NSArray* tree_children = [cocoa_tree children];
   ASSERT_NSEQ(@"AXRow", [tree_children[0] role]);
@@ -638,7 +638,7 @@
 
   for (auto& test : tests) {
     base::scoped_nsobject<BrowserAccessibilityCocoa> parent(
-        [ToBrowserAccessibilityCocoa(FindNode(test.first)) retain]);
+        [FindNode(test.first)->GetNativeViewAccessible() retain]);
     BrowserAccessibilityCocoa* child = [parent children][1];
 
     EXPECT_NE(nullptr, parent.get());
@@ -691,7 +691,7 @@
 
   for (auto& test : tests) {
     base::scoped_nsobject<BrowserAccessibilityCocoa> parent(
-        [ToBrowserAccessibilityCocoa(FindNode(test.first)) retain]);
+        [FindNode(test.first)->GetNativeViewAccessible() retain]);
     BrowserAccessibilityCocoa* first_child = [parent children][0];
     BrowserAccessibilityCocoa* second_child = [parent children][1];
 
@@ -725,7 +725,7 @@
   waiter.WaitForNotification();
 
   base::scoped_nsobject<BrowserAccessibilityCocoa> content_editable(
-      [ToBrowserAccessibilityCocoa(GetManager()->GetRoot()->PlatformGetChild(0))
+      [GetManager()->GetRoot()->PlatformGetChild(0)->GetNativeViewAccessible()
           retain]);
   EXPECT_EQ([[content_editable children] count], 5ul);
 
diff --git a/content/browser/accessibility/browser_accessibility_mac.h b/content/browser/accessibility/browser_accessibility_mac.h
index 4eaa9670c..d45be12 100644
--- a/content/browser/accessibility/browser_accessibility_mac.h
+++ b/content/browser/accessibility/browser_accessibility_mac.h
@@ -19,13 +19,6 @@
 
 namespace content {
 
-#if __OBJC__
-CONTENT_EXPORT const BrowserAccessibilityCocoa* ToBrowserAccessibilityCocoa(
-    const BrowserAccessibility* obj);
-CONTENT_EXPORT BrowserAccessibilityCocoa* ToBrowserAccessibilityCocoa(
-    BrowserAccessibility* obj);
-#endif
-
 class BrowserAccessibilityMac : public BrowserAccessibility {
  public:
   ~BrowserAccessibilityMac() override;
diff --git a/content/browser/accessibility/browser_accessibility_mac.mm b/content/browser/accessibility/browser_accessibility_mac.mm
index 4d44423..c0e7763 100644
--- a/content/browser/accessibility/browser_accessibility_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_mac.mm
@@ -87,7 +87,7 @@
   BrowserAccessibilityCocoa* new_native_obj = CreateNativeWrapper();
 
   // Rebuild children to pick up a newly created cocoa object.
-  [ToBrowserAccessibilityCocoa(parent) childrenChanged];
+  [parent->GetNativeViewAccessible() childrenChanged];
 
   // If focused, fire a focus notification on the new native object.
   if (manager_->GetFocus() == this) {
@@ -218,16 +218,4 @@
   return node_cocoa;
 }
 
-const BrowserAccessibilityCocoa* ToBrowserAccessibilityCocoa(
-    const BrowserAccessibility* obj) {
-  DCHECK(obj);
-  return static_cast<const BrowserAccessibilityMac*>(obj)->GetNativeWrapper();
-}
-
-BrowserAccessibilityCocoa* ToBrowserAccessibilityCocoa(
-    BrowserAccessibility* obj) {
-  DCHECK(obj);
-  return static_cast<BrowserAccessibilityMac*>(obj)->GetNativeWrapper();
-}
-
 }  // namespace content
diff --git a/content/browser/accessibility/browser_accessibility_mac_unittest.mm b/content/browser/accessibility/browser_accessibility_mac_unittest.mm
index 6d883f8d..e42265d1 100644
--- a/content/browser/accessibility/browser_accessibility_mac_unittest.mm
+++ b/content/browser/accessibility/browser_accessibility_mac_unittest.mm
@@ -106,7 +106,7 @@
     manager_ = std::make_unique<BrowserAccessibilityManagerMac>(
         MakeAXTreeUpdate(root_, child1, child2), nullptr);
     accessibility_.reset(
-        [ToBrowserAccessibilityCocoa(manager_->GetRoot()) retain]);
+        [manager_->GetRoot()->GetNativeViewAccessible() retain]);
   }
 
   void SetRootValue(std::string value) {
@@ -180,8 +180,7 @@
   root_.role = ax::mojom::Role::kTextField;
   manager_ = std::make_unique<BrowserAccessibilityManagerMac>(
       MakeAXTreeUpdate(root_), nullptr);
-  accessibility_.reset(
-      [ToBrowserAccessibilityCocoa(manager_->GetRoot()) retain]);
+  accessibility_.reset([manager_->GetRoot()->GetNativeViewAccessible() retain]);
 
   // Insertion but no deletion.
 
@@ -266,7 +265,7 @@
   manager_ =
       std::make_unique<BrowserAccessibilityManagerMac>(initial_state, nullptr);
   base::scoped_nsobject<BrowserAccessibilityCocoa> ax_table_(
-      [ToBrowserAccessibilityCocoa(manager_->GetRoot()) retain]);
+      [manager_->GetRoot()->GetNativeViewAccessible() retain]);
   id children = [ax_table_ children];
   EXPECT_EQ(5U, [children count]);
 
diff --git a/content/browser/accessibility/browser_accessibility_manager_mac.mm b/content/browser/accessibility/browser_accessibility_manager_mac.mm
index f650124..e584bb18 100644
--- a/content/browser/accessibility/browser_accessibility_manager_mac.mm
+++ b/content/browser/accessibility/browser_accessibility_manager_mac.mm
@@ -126,7 +126,7 @@
     ui::AXEventGenerator::Event event_type,
     BrowserAccessibility* node) {
   BrowserAccessibilityManager::FireGeneratedEvent(event_type, node);
-  auto native_node = ToBrowserAccessibilityCocoa(node);
+  BrowserAccessibilityCocoa* native_node = node->GetNativeViewAccessible();
   DCHECK(native_node);
 
   // Refer to |AXObjectCache::postPlatformNotification| in WebKit source code.
@@ -189,9 +189,9 @@
         return;
 
       NSAccessibilityPostNotificationWithUserInfo(
-          ToBrowserAccessibilityCocoa(focus), mac_notification, user_info);
+          focus->GetNativeViewAccessible(), mac_notification, user_info);
       NSAccessibilityPostNotificationWithUserInfo(
-          ToBrowserAccessibilityCocoa(root), mac_notification, user_info);
+          root->GetNativeViewAccessible(), mac_notification, user_info);
       return;
     }
     case ui::AXEventGenerator::Event::EXPANDED:
@@ -355,7 +355,7 @@
         NSAccessibilityPostNotificationWithUserInfo(
             native_node, mac_notification, user_info);
         NSAccessibilityPostNotificationWithUserInfo(
-            ToBrowserAccessibilityCocoa(root), mac_notification, user_info);
+            root->GetNativeViewAccessible(), mac_notification, user_info);
         return;
       }
       break;
@@ -432,7 +432,7 @@
     NSString* mac_notification,
     BrowserAccessibility* node) {
   DCHECK(mac_notification);
-  auto native_node = ToBrowserAccessibilityCocoa(node);
+  BrowserAccessibilityCocoa* native_node = node->GetNativeViewAccessible();
   DCHECK(native_node);
   NSAccessibilityPostNotification(native_node, mac_notification);
 }
@@ -452,10 +452,10 @@
 
   std::set<const BrowserAccessibilityCocoa*> changed_editable_roots;
   for (const auto& change : changes) {
-    const BrowserAccessibility* obj = GetFromAXNode(change.node);
+    BrowserAccessibility* obj = GetFromAXNode(change.node);
     if (obj && obj->HasState(ax::mojom::State::kEditable)) {
       const BrowserAccessibilityCocoa* editable_root =
-          [ToBrowserAccessibilityCocoa(obj) editableAncestor];
+          [obj->GetNativeViewAccessible() editableAncestor];
       if (editable_root && [editable_root instanceActive])
         changed_editable_roots.insert(editable_root);
     }
@@ -499,7 +499,8 @@
   }
 
   focus_object = focus_object->PlatformGetLowestPlatformAncestor();
-  auto native_focus_object = ToBrowserAccessibilityCocoa(focus_object);
+  BrowserAccessibilityCocoa* native_focus_object =
+      focus_object->GetNativeViewAccessible();
   if (native_focus_object && [native_focus_object instanceActive]) {
     [user_info setObject:native_focus_object
                   forKey:ui::NSAccessibilityTextChangeElement];
diff --git a/content/browser/accessibility/hit_testing_mac_browsertest.mm b/content/browser/accessibility/hit_testing_mac_browsertest.mm
index 5b4c7268..f14a6595 100644
--- a/content/browser/accessibility/hit_testing_mac_browsertest.mm
+++ b/content/browser/accessibility/hit_testing_mac_browsertest.mm
@@ -22,8 +22,9 @@
     : public AccessibilityHitTestingBrowserTest {
  public:
   BrowserAccessibilityCocoa* GetWebContentRoot() {
-    return ToBrowserAccessibilityCocoa(
-        GetRootBrowserAccessibilityManager()->GetRoot());
+    return GetRootBrowserAccessibilityManager()
+        ->GetRoot()
+        ->GetNativeViewAccessible();
   }
 };
 
@@ -58,8 +59,9 @@
     gfx::Point rect_2_point(49, 20);
     BrowserAccessibilityCocoa* hit_element = [root
         accessibilityHitTest:NSMakePoint(rect_2_point.x(), rect_2_point.y())];
-    BrowserAccessibilityCocoa* expected_element = ToBrowserAccessibilityCocoa(
-        FindNode(ax::mojom::Role::kGenericContainer, "rect2"));
+    BrowserAccessibilityCocoa* expected_element =
+        FindNode(ax::mojom::Role::kGenericContainer, "rect2")
+            ->GetNativeViewAccessible();
     EXPECT_ACCESSIBILITY_MAC_HIT_TEST_RESULT(rect_2_point, expected_element,
                                              hit_element);
   }
@@ -69,8 +71,9 @@
     gfx::Point rect_b_point(79, 79);
     BrowserAccessibilityCocoa* hit_element = [root
         accessibilityHitTest:NSMakePoint(rect_b_point.x(), rect_b_point.y())];
-    BrowserAccessibilityCocoa* expected_element = ToBrowserAccessibilityCocoa(
-        FindNode(ax::mojom::Role::kGenericContainer, "rectB"));
+    BrowserAccessibilityCocoa* expected_element =
+        FindNode(ax::mojom::Role::kGenericContainer, "rectB")
+            ->GetNativeViewAccessible();
     EXPECT_ACCESSIBILITY_MAC_HIT_TEST_RESULT(rect_b_point, expected_element,
                                              hit_element);
   }
diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
index ed27e0b1..7824e43b 100644
--- a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
+++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
@@ -459,14 +459,14 @@
   }
 
   // Create the Java array.
-  jsize length = static_cast<jsize>(value->GetList().size());
+  jsize length = static_cast<jsize>(value->GetListDeprecated().size());
   jobject result = CreateJavaArray(env, target_inner_type, length);
   if (!result) {
     return NULL;
   }
 
   jsize i = 0;
-  for (const auto& value_element : value->GetList()) {
+  for (const auto& value_element : value->GetListDeprecated()) {
     jvalue element = CoerceJavaScriptValueToJavaValue(
         env, &value_element, target_inner_type, false, object_refs, error);
     SetArrayElement(env, result, target_inner_type, i++, element);
diff --git a/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.cc b/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.cc
index 5d1faf5c..39a5d8c 100644
--- a/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.cc
+++ b/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.cc
@@ -13,10 +13,15 @@
 #include "base/location.h"
 #include "base/no_destructor.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "content/browser/bluetooth/web_bluetooth_service_impl.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 
-using device::BluetoothAdapter;
-using device::BluetoothAdapterFactory;
+namespace content {
+
+namespace {
+using ::device::BluetoothAdapter;
+using ::device::BluetoothAdapterFactory;
+}  // namespace
 
 BluetoothAdapterFactoryWrapper::BluetoothAdapterFactoryWrapper() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -38,25 +43,34 @@
 
 bool BluetoothAdapterFactoryWrapper::IsLowEnergySupported() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (adapter_ != nullptr) {
+  if (adapter_ || test_adapter_)
     return true;
-  }
   return BluetoothAdapterFactory::Get()->IsLowEnergySupported();
 }
 
 void BluetoothAdapterFactoryWrapper::AcquireAdapter(
-    BluetoothAdapter::Observer* observer,
+    WebBluetoothServiceImpl* service,
     AcquireAdapterCallback callback) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  DCHECK(!GetAdapter(observer));
+  DCHECK(!GetAdapter(service));
 
-  AddAdapterObserver(observer);
+  MaybeAddAdapterObserver(service);
   if (adapter_) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE, base::BindOnce(std::move(callback), adapter_));
     return;
   }
 
+  // Simulate the normally asynchronous process of acquiring the adapter in
+  // tests.
+  if (test_adapter_) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(&BluetoothAdapterFactoryWrapper::OnGetAdapter,
+                                  weak_ptr_factory_.GetWeakPtr(),
+                                  std::move(callback), test_adapter_));
+    return;
+  }
+
   DCHECK(BluetoothAdapterFactory::Get()->IsLowEnergySupported());
   BluetoothAdapterFactory::Get()->GetAdapter(
       base::BindOnce(&BluetoothAdapterFactoryWrapper::OnGetAdapter,
@@ -64,29 +78,37 @@
 }
 
 void BluetoothAdapterFactoryWrapper::ReleaseAdapter(
-    BluetoothAdapter::Observer* observer) {
+    WebBluetoothServiceImpl* service) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (!HasAdapter(observer)) {
+  if (!HasAdapter(service)) {
     return;
   }
-  RemoveAdapterObserver(observer);
+  RemoveAdapterObserver(service);
   if (adapter_observers_.empty())
     set_adapter(nullptr);
 }
 
 BluetoothAdapter* BluetoothAdapterFactoryWrapper::GetAdapter(
-    BluetoothAdapter::Observer* observer) {
+    WebBluetoothServiceImpl* service) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  if (HasAdapter(observer)) {
+  if (HasAdapter(service)) {
     return adapter_.get();
   }
   return nullptr;
 }
 
 void BluetoothAdapterFactoryWrapper::SetBluetoothAdapterForTesting(
-    scoped_refptr<BluetoothAdapter> mock_adapter) {
+    scoped_refptr<BluetoothAdapter> test_adapter) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  set_adapter(std::move(mock_adapter));
+
+  // If an adapter has already been acquired allow the adapter to be swapped out
+  // synchronously.
+  if (adapter_) {
+    set_adapter(std::move(test_adapter));
+    return;
+  }
+
+  test_adapter_ = std::move(test_adapter);
 }
 
 void BluetoothAdapterFactoryWrapper::OnGetAdapter(
@@ -94,36 +116,41 @@
     scoped_refptr<BluetoothAdapter> adapter) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
+  // Clear the adapter configured for testing now that it has been acquired.
+  test_adapter_.reset();
+
   set_adapter(adapter);
   std::move(continuation).Run(adapter_);
 }
 
 bool BluetoothAdapterFactoryWrapper::HasAdapter(
-    BluetoothAdapter::Observer* observer) {
+    WebBluetoothServiceImpl* service) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  return base::Contains(adapter_observers_, observer);
+  return base::Contains(adapter_observers_, service);
 }
 
-void BluetoothAdapterFactoryWrapper::AddAdapterObserver(
-    BluetoothAdapter::Observer* observer) {
+void BluetoothAdapterFactoryWrapper::MaybeAddAdapterObserver(
+    WebBluetoothServiceImpl* service) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  auto iter = adapter_observers_.insert(observer);
-  DCHECK(iter.second);
-  if (adapter_) {
-    adapter_->AddObserver(observer);
+  // The same WebBluetoothServiceImpl might acquire the adapter multiple times
+  // if it gets multiple requests in parallel before the adapter is ready but is
+  // guaranteed to only call ReleaseAdapter() once on destruction.
+  auto [it, inserted] = adapter_observers_.insert(service);
+  if (inserted && adapter_) {
+    adapter_->AddObserver(service);
   }
 }
 
 void BluetoothAdapterFactoryWrapper::RemoveAdapterObserver(
-    BluetoothAdapter::Observer* observer) {
+    WebBluetoothServiceImpl* service) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  size_t removed = adapter_observers_.erase(observer);
+  size_t removed = adapter_observers_.erase(service);
   DCHECK(removed);
   if (adapter_) {
-    adapter_->RemoveObserver(observer);
+    adapter_->RemoveObserver(service);
   }
 }
 
@@ -131,15 +158,22 @@
     scoped_refptr<BluetoothAdapter> adapter) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
+  // There might be extra unnecessary calls to this method if multiple requests
+  // to acquire an adapter were in flight at once.
+  if (adapter.get() == adapter_.get())
+    return;
+
   if (adapter_.get()) {
-    for (BluetoothAdapter::Observer* observer : adapter_observers_) {
-      adapter_->RemoveObserver(observer);
+    for (WebBluetoothServiceImpl* service : adapter_observers_) {
+      adapter_->RemoveObserver(service);
     }
   }
-  adapter_ = adapter;
+  adapter_ = std::move(adapter);
   if (adapter_.get()) {
-    for (BluetoothAdapter::Observer* observer : adapter_observers_) {
-      adapter_->AddObserver(observer);
+    for (WebBluetoothServiceImpl* service : adapter_observers_) {
+      adapter_->AddObserver(service);
     }
   }
 }
+
+}  // namespace content
diff --git a/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h b/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h
index 94135f5..ae5cb53c 100644
--- a/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h
+++ b/content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h
@@ -11,6 +11,10 @@
 #include "content/common/content_export.h"
 #include "device/bluetooth/bluetooth_adapter.h"
 
+namespace content {
+
+class WebBluetoothServiceImpl;
+
 // Wrapper around BluetoothAdapterFactory that allows us to change
 // the underlying BluetoothAdapter object and have the observers
 // observe the new instance of the object.
@@ -35,35 +39,35 @@
   // SetBluetoothAdapterForTesting has been called.
   bool IsLowEnergySupported();
 
-  // Adds |observer| to the set of adapter observers. If another observer has
-  // acquired the adapter in the past it adds |observer| as an observer to that
-  // adapter, otherwise it gets a new adapter and adds |observer| to it. Runs
-  // |callback| with the adapter |observer| has been added to.
-  void AcquireAdapter(device::BluetoothAdapter::Observer* observer,
+  // Adds |service| to the set of adapter observers if this is the first time
+  // the service has tried to acquire the adapter. If another service has
+  // acquired the adapter in the past it adds |service| as an observer to that
+  // adapter, otherwise it gets a new adapter and adds |service| to it. Runs
+  // |callback| with the adapter |service| has been added to.
+  void AcquireAdapter(WebBluetoothServiceImpl* service,
                       AcquireAdapterCallback callback);
-  // Removes |observer| from the list of adapter observers if |observer|
+  // Removes |service| from the list of adapter observers if |service|
   // has acquired the adapter in the past. If there are no more observers
   // it deletes the reference to the adapter.
-  void ReleaseAdapter(device::BluetoothAdapter::Observer* observer);
+  void ReleaseAdapter(WebBluetoothServiceImpl* service);
 
-  // Returns an adapter if |observer| has acquired an adapter in the past and
+  // Returns an adapter if |service| has acquired an adapter in the past and
   // this instance holds a reference to an adapter. Otherwise returns nullptr.
-  device::BluetoothAdapter* GetAdapter(
-      device::BluetoothAdapter::Observer* observer);
+  device::BluetoothAdapter* GetAdapter(WebBluetoothServiceImpl* service);
 
   // Sets a new BluetoothAdapter to be returned by GetAdapter. When setting
   // a new adapter all observers from the old adapter are removed and added
-  // to |mock_adapter|.
+  // to |test_adapter|.
   void SetBluetoothAdapterForTesting(
-      scoped_refptr<device::BluetoothAdapter> mock_adapter);
+      scoped_refptr<device::BluetoothAdapter> test_adapter);
 
  private:
   void OnGetAdapter(AcquireAdapterCallback continuation,
                     scoped_refptr<device::BluetoothAdapter> adapter);
 
-  bool HasAdapter(device::BluetoothAdapter::Observer* observer);
-  void AddAdapterObserver(device::BluetoothAdapter::Observer* observer);
-  void RemoveAdapterObserver(device::BluetoothAdapter::Observer* observer);
+  bool HasAdapter(WebBluetoothServiceImpl* service);
+  void MaybeAddAdapterObserver(WebBluetoothServiceImpl* service);
+  void RemoveAdapterObserver(WebBluetoothServiceImpl* service);
 
   // Sets |adapter_| to a BluetoothAdapter instance and register observers,
   // releasing references to previous |adapter_|.
@@ -72,10 +76,14 @@
   // A BluetoothAdapter instance representing an adapter of the system.
   scoped_refptr<device::BluetoothAdapter> adapter_;
 
+  // A BluetoothAdapter instance configured for testing purposes which will be
+  // activated by the first call to AcquireAdapter().
+  scoped_refptr<device::BluetoothAdapter> test_adapter_;
+
   // We keep a list of all observers so that when the adapter gets swapped,
   // we can remove all observers from the old adapter and add them to the
   // new adapter.
-  std::unordered_set<device::BluetoothAdapter::Observer*> adapter_observers_;
+  std::unordered_set<WebBluetoothServiceImpl*> adapter_observers_;
 
   // Should only be called on the UI thread.
   THREAD_CHECKER(thread_checker_);
@@ -87,4 +95,6 @@
   base::WeakPtrFactory<BluetoothAdapterFactoryWrapper> weak_ptr_factory_{this};
 };
 
+}  // namespace content
+
 #endif  // CONTENT_BROWSER_BLUETOOTH_BLUETOOTH_ADAPTER_FACTORY_WRAPPER_H_
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
index 26d54fe..675d833 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/test/gmock_callback_support.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/test_future.h"
 #include "content/browser/bluetooth/bluetooth_adapter_factory_wrapper.h"
 #include "content/browser/bluetooth/bluetooth_allowed_devices.h"
 #include "content/browser/bluetooth/web_bluetooth_pairing_manager.h"
@@ -39,6 +40,7 @@
 
 namespace {
 
+using ::base::test::TestFuture;
 using ::blink::mojom::WebBluetoothCharacteristicClient;
 using ::blink::mojom::WebBluetoothGATTQueryQuantity;
 using ::blink::mojom::WebBluetoothRemoteGATTCharacteristicPtr;
@@ -496,11 +498,16 @@
     service_ =
         contents()->GetMainFrame()->CreateWebBluetoothServiceForTesting();
 
-    // GetAvailability connects the Web Bluetooth service to the adapter.
-    base::RunLoop run_loop;
-    service_->GetAvailability(base::BindLambdaForTesting(
-        [&run_loop](bool success) { run_loop.Quit(); }));
-    run_loop.Run();
+    // GetAvailability connects the Web Bluetooth service to the adapter. Call
+    // it twice in parallel to exercise what happens when multiple requests to
+    // acquire the BluetoothAdapter are in flight.
+    TestFuture<bool> future_1;
+    TestFuture<bool> future_2;
+    service_->GetAvailability(future_1.GetCallback());
+    service_->GetAvailability(future_2.GetCallback());
+    // Use Wait() instead of Get() because we don't care about the result.
+    EXPECT_TRUE(future_1.Wait());
+    EXPECT_TRUE(future_2.Wait());
   }
 
   void TearDown() override {
diff --git a/content/browser/child_process_launcher_helper_android.cc b/content/browser/child_process_launcher_helper_android.cc
index feb2d49..d877fcb0 100644
--- a/content/browser/child_process_launcher_helper_android.cc
+++ b/content/browser/child_process_launcher_helper_android.cc
@@ -26,6 +26,7 @@
 #include "content/public/browser/site_isolation_policy.h"
 #include "content/public/common/content_descriptors.h"
 #include "content/public/common/content_switches.h"
+#include "sandbox/policy/features.h"
 #include "sandbox/policy/switches.h"
 
 using base::android::AttachCurrentThread;
@@ -217,6 +218,15 @@
          SiteIsolationPolicy::ArePreloadedIsolatedOriginsEnabled();
 }
 
+static jboolean JNI_ChildProcessLauncherHelperImpl_IsNetworkSandboxEnabled(
+    JNIEnv* env) {
+  // We may want to call ContentBrowserClient::ShouldSandboxNetworkService,
+  // but that needs to be called on the UI thread. This function is called on
+  // the launcher thread, not UI thread. Hence we use
+  // sandbox::policy::features::IsNetworkSandboxEnabled.
+  return sandbox::policy::features::IsNetworkSandboxEnabled();
+}
+
 // static
 bool ChildProcessLauncherHelper::TerminateProcess(const base::Process& process,
                                                   int exit_code) {
diff --git a/content/browser/devtools/devtools_trust_token_browsertest.cc b/content/browser/devtools/devtools_trust_token_browsertest.cc
index 6dbd73f..2b7ad8a 100644
--- a/content/browser/devtools/devtools_trust_token_browsertest.cc
+++ b/content/browser/devtools/devtools_trust_token_browsertest.cc
@@ -36,7 +36,7 @@
     SendCommand("Storage.getTrustTokens", nullptr);
     base::Value* tokens = result_->FindPath("tokens");
     EXPECT_TRUE(tokens);
-    return tokens->GetList();
+    return tokens->GetListDeprecated();
   }
 
   // Asserts that CDP reports |count| number of tokens for |issuerOrigin|.
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 4c15051c..7816bfb 100644
--- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -1502,8 +1502,8 @@
   SendCommand("Target.getTargets", nullptr, true);
   base::ListValue* target_infos;
   EXPECT_TRUE(result_->GetList("targetInfos", &target_infos));
-  EXPECT_EQ(1u, target_infos->GetList().size());
-  const base::Value& target_info_value = target_infos->GetList()[0u];
+  EXPECT_EQ(1u, target_infos->GetListDeprecated().size());
+  const base::Value& target_info_value = target_infos->GetListDeprecated()[0u];
   EXPECT_TRUE(target_info_value.is_dict());
   const base::DictionaryValue& target_info =
       base::Value::AsDictionaryValue(target_info_value);
@@ -1925,9 +1925,9 @@
 
   const base::Value* cookies = result_->FindListKey("cookies");
   ASSERT_TRUE(cookies);
-  EXPECT_EQ(1u, cookies->GetList().size());
+  EXPECT_EQ(1u, cookies->GetListDeprecated().size());
 
-  const base::Value& cookie_value = cookies->GetList()[0];
+  const base::Value& cookie_value = cookies->GetListDeprecated()[0];
   EXPECT_TRUE(cookie_value.is_dict());
   const base::DictionaryValue& cookie =
       base::Value::AsDictionaryValue(cookie_value);
@@ -1943,11 +1943,11 @@
 
   cookies = result_->FindListKey("cookies");
   ASSERT_TRUE(cookies);
-  EXPECT_EQ(2u, cookies->GetList().size());
+  EXPECT_EQ(2u, cookies->GetListDeprecated().size());
 
   // Note: the cookies will be returned in unspecified order.
   size_t found = 0;
-  for (const base::Value& cookie_value : cookies->GetList()) {
+  for (const base::Value& cookie_value : cookies->GetListDeprecated()) {
     EXPECT_TRUE(cookie_value.is_dict());
     const base::DictionaryValue& cookie =
         base::Value::AsDictionaryValue(cookie_value);
diff --git a/content/browser/devtools/protocol/devtools_protocol_test_support.cc b/content/browser/devtools/protocol/devtools_protocol_test_support.cc
index 20ba360..a0e13d65 100644
--- a/content/browser/devtools/protocol/devtools_protocol_test_support.cc
+++ b/content/browser/devtools/protocol/devtools_protocol_test_support.cc
@@ -98,7 +98,7 @@
   if (!result_->GetList(path_to_list, &list))
     return false;
 
-  for (const base::Value& item_value : list->GetList()) {
+  for (const base::Value& item_value : list->GetListDeprecated()) {
     if (!item_value.is_dict())
       return false;
     const base::DictionaryValue& item =
diff --git a/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc b/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc
index 01dcf28..6c30f30 100644
--- a/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc
+++ b/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc
@@ -176,7 +176,7 @@
     EXPECT_TRUE(result.data.has_value());
     EXPECT_EQ(result.data->size(), expected_data_size);
     for (uint8_t current : *result.data) {
-      EXPECT_EQ(current, static_cast<uint8_t>('a'));
+      EXPECT_EQ(current, bytes_received % 256);
       ++bytes_received;
     }
   }
@@ -247,10 +247,14 @@
   // With a client socket listening in the javascript code, we can finally start
   // sending out data.
   net::IPEndPoint client_addr(net::IPAddress::IPv4Localhost(), local_port);
+  uint32_t bytesSent = 0;
   for (uint32_t i = 0; i < kRequiredDatagrams; i++) {
-    EXPECT_EQ(net::OK, server_helper.SendToSync(
-                           client_addr, std::vector<uint8_t>(
-                                            i + 1, static_cast<uint8_t>('a'))));
+    std::vector<uint8_t> message(i + 1);
+    for (uint8_t& byte : message) {
+      byte = bytesSent % 256;
+      bytesSent++;
+    }
+    EXPECT_EQ(net::OK, server_helper.SendToSync(client_addr, message));
   }
 
   // Blocks until script execution is complete and returns the resulting
diff --git a/content/browser/fenced_frame/fenced_frame.cc b/content/browser/fenced_frame/fenced_frame.cc
index ac74600..38d45d16 100644
--- a/content/browser/fenced_frame/fenced_frame.cc
+++ b/content/browser/fenced_frame/fenced_frame.cc
@@ -89,19 +89,19 @@
   // treated as downloads, and implement the correct thing.
   blink::NavigationDownloadPolicy download_policy;
 
-  // Note `initiator_frame_token` here *always* corresponds to the outer render
-  // frame host, however crbug.com/1074422 points out that it is possible that
-  // another same-origin-domain document can synchronously script the document
-  // hosted in the outer render frame host, and thus be the true initiator of
-  // the navigation even though this wouldn't be reflected here. See that bug
-  // for more discussion and plans for an eventual resolution.
-  const blink::LocalFrameToken initiator_frame_token =
-      owner_render_frame_host_->GetFrameToken();
+  // This method is only invoked in the context of the embedder navigating
+  // the embeddee via a `src` attribute modification on the fenced frame
+  // element. The `initiator_origin` is left as a new opaque origin since
+  // we do not want to leak information from the outer frame tree to the
+  // inner frame tree. Note that this will always create a "Sec-Fetch-Site" as
+  // cross-site. Since we assign an opaque initiator_origin we do not
+  // need to provide a `source_site_instance`.
+  url::Origin initiator_origin;
+
   inner_root->navigator().NavigateFromFrameProxy(
-      inner_root->current_frame_host(), url, &initiator_frame_token,
-      owner_render_frame_host_->GetProcess()->GetID(),
-      owner_render_frame_host_->GetLastCommittedOrigin(),
-      owner_render_frame_host_->GetSiteInstance(), content::Referrer(),
+      inner_root->current_frame_host(), url, /*initiator_frame_token=*/nullptr,
+      owner_render_frame_host_->GetProcess()->GetID(), initiator_origin,
+      /*source_site_instance=*/nullptr, content::Referrer(),
       ui::PAGE_TRANSITION_AUTO_SUBFRAME,
       /*should_replace_current_entry=*/true, download_policy, "GET",
       /*post_body=*/nullptr, /*extra_headers=*/"",
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc
index 1ced1b04..4956875 100644
--- a/content/browser/fenced_frame/fenced_frame_browsertest.cc
+++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -147,6 +147,40 @@
             fenced_frame_rfh->GetLastCommittedOrigin());
 }
 
+IN_PROC_BROWSER_TEST_F(FencedFrameBrowserTest, AboutBlankNavigation) {
+  const GURL main_url =
+      embedded_test_server()->GetURL("a.test", "/title1.html");
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  RenderFrameHostImpl* primary_rfh = primary_main_frame_host();
+
+  const GURL fenced_frame_url = embedded_test_server()->GetURL(
+      "fencedframe.test", "/fenced_frames/title1.html");
+  fenced_frame_test_helper().CreateFencedFrame(primary_rfh, fenced_frame_url);
+
+  std::vector<FencedFrame*> fenced_frames = primary_rfh->GetFencedFrames();
+  ASSERT_EQ(1ul, fenced_frames.size());
+  FencedFrame* fenced_frame = fenced_frames.back();
+
+  // Exepct the origin is correct.
+  EXPECT_EQ(url::Origin::Create(fenced_frame_url),
+            EvalJs(fenced_frame->GetInnerRoot(), "self.origin;"));
+
+  // Assigning the location from the parent cause the SiteInstance
+  // to be calculated incorrectly and crash. see https://crbug.com/1268238.
+  // We can't use `NavigateFrameInFencedFrameTree` because that navigates
+  // from the inner frame tree and we want the navigation to occur from
+  // the outer frame tree.
+  EXPECT_TRUE(
+      ExecJs(primary_rfh,
+             "document.querySelector('fencedframe').src = 'about:blank';"));
+
+  fenced_frame->WaitForDidStopLoadingForTesting();
+  EXPECT_TRUE(!fenced_frame->GetInnerRoot()->IsErrorDocument());
+
+  EXPECT_EQ("null", EvalJs(fenced_frame->GetInnerRoot(), "self.origin;"));
+}
+
 IN_PROC_BROWSER_TEST_F(FencedFrameBrowserTest, FrameIteration) {
   const GURL main_url =
       embedded_test_server()->GetURL("fencedframe.test", "/title1.html");
diff --git a/content/browser/find_request_manager_browsertest.cc b/content/browser/find_request_manager_browsertest.cc
index ffa7ec93..cf95cb01 100644
--- a/content/browser/find_request_manager_browsertest.cc
+++ b/content/browser/find_request_manager_browsertest.cc
@@ -1207,7 +1207,9 @@
 class FindTestWebContentsPrerenderingDelegate
     : public FindTestWebContentsDelegate {
  public:
-  bool IsPrerender2Supported() override { return true; }
+  bool IsPrerender2Supported(WebContents& web_contents) override {
+    return true;
+  }
 };
 
 class FindRequestManagerPrerenderingTest : public FindRequestManagerTest {
diff --git a/content/browser/font_unique_name_lookup/font_unique_name_browsertest.cc b/content/browser/font_unique_name_lookup/font_unique_name_browsertest.cc
index 9649edd1..6c92e27c8 100644
--- a/content/browser/font_unique_name_lookup/font_unique_name_browsertest.cc
+++ b/content/browser/font_unique_name_lookup/font_unique_name_browsertest.cc
@@ -189,7 +189,8 @@
     const base::Value* font_list = font_info->FindKey("fonts");
     ASSERT_TRUE(font_list);
     ASSERT_TRUE(font_list->is_list());
-    base::span<const base::Value> font_info_list = font_list->GetList();
+    base::span<const base::Value> font_info_list =
+        font_list->GetListDeprecated();
     ASSERT_TRUE(font_info_list.size());
     const base::Value& first_font_info = font_info_list[0];
     ASSERT_TRUE(first_font_info.is_dict());
diff --git a/content/browser/gpu/gpu_internals_ui.cc b/content/browser/gpu/gpu_internals_ui.cc
index 72ae820..68e34fd 100644
--- a/content/browser/gpu/gpu_internals_ui.cc
+++ b/content/browser/gpu/gpu_internals_ui.cc
@@ -737,7 +737,7 @@
 }
 
 void GpuMessageHandler::OnCallAsync(const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   DCHECK_GE(args_list.size(), static_cast<size_t>(2));
   // unpack args into requestId, submessage and submessageArgs
   const base::Value& requestId = args_list[0];
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc
index 2f6ebb9b..af2397d5 100644
--- a/content/browser/interest_group/ad_auction_service_impl.cc
+++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -123,7 +123,8 @@
   return true;
 }
 
-bool IsAuctionValid(const blink::mojom::AuctionAdConfig& config) {
+bool IsAuctionValid(const blink::mojom::AuctionAdConfig& config,
+                    bool is_top_level_auction) {
   // The seller origin has to be HTTPS.
   if (config.seller.scheme() != url::kHttpsScheme)
     return false;
@@ -154,6 +155,14 @@
     }
   }
 
+  for (const auto& component_auction : config.component_auctions) {
+    // Component auctions may not have their own nested component auctions.
+    if (!is_top_level_auction)
+      return false;
+    if (!IsAuctionValid(*component_auction, /*is_top_level_auction=*/false))
+      return false;
+  }
+
   return true;
 }
 
@@ -273,7 +282,7 @@
     mojo::ReportBadMessage("Unexpected request");
     return;
   }
-  if (!IsAuctionValid(*config)) {
+  if (!IsAuctionValid(*config, /*is_top_level_auction=*/true)) {
     std::move(callback).Run(absl::nullopt);
     return;
   }
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc
index 9c49b09..ba275ef 100644
--- a/content/browser/interest_group/auction_runner_unittest.cc
+++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -1590,7 +1590,7 @@
           breakpoint_hit.value.FindListPath("params.hitBreakpoints");
       ASSERT_TRUE(hit_breakpoints);
       base::Value::ConstListView hit_breakpoints_list =
-          hit_breakpoints->GetList();
+          hit_breakpoints->GetListDeprecated();
       ASSERT_EQ(1u, hit_breakpoints_list.size());
       ASSERT_TRUE(hit_breakpoints_list[0].is_string());
       EXPECT_EQ(base::StringPrintf("1:5:0:%s", debug_url.spec().c_str()),
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc
index 11d6ca12..f67e62c 100644
--- a/content/browser/interest_group/interest_group_browsertest.cc
+++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -1772,6 +1772,75 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
+                       RunAdAuctionInvalidComponentAuctionsArray) {
+  ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo")));
+
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Failed to "
+      "read the 'componentAuctions' property from 'AuctionAdConfig': The "
+      "provided value cannot be converted to a sequence.",
+      RunAuctionAndWait(R"({
+      seller: 'https://test.com',
+      decisionLogicUrl: 'https://test.com',
+      componentAuctions: ''
+  })"));
+}
+
+IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
+                       RunAdAuctionInvalidComponentAuctionsElementType) {
+  ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo")));
+
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Failed to "
+      "read the 'componentAuctions' property from 'AuctionAdConfig': "
+      "The provided value is not of type 'AuctionAdConfig'.",
+      RunAuctionAndWait(R"({
+      seller: 'https://test.com',
+      decisionLogicUrl: 'https://test.com',
+      componentAuctions: ['test']
+  })"));
+}
+
+IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
+                       RunAdAuctionInvalidComponentAuctionsAuctionConfig) {
+  ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo")));
+
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': seller "
+      "'http://test.com' for AuctionAdConfig must be a valid https origin.",
+      RunAuctionAndWait(R"({
+      seller: 'https://test.com',
+      decisionLogicUrl: 'https://test.com',
+      componentAuctions: [{
+        seller: 'http://test.com',
+        decisionLogicUrl: 'http://test.com'
+      }]
+  })"));
+}
+
+IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
+                       RunAdAuctionInvalidComponentAuctionDepth) {
+  ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo")));
+
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'runAdAuction' on 'Navigator': Auctions "
+      "listed in componentAuctions may not have their own nested "
+      "componentAuctions.",
+      RunAuctionAndWait(R"({
+      seller: 'https://test.com',
+      decisionLogicUrl: 'https://test.com',
+      componentAuctions: [{
+        seller: 'https://test2.com',
+        decisionLogicUrl: 'https://test2.com',
+        componentAuctions: [{
+          seller: 'https://test3.com',
+          decisionLogicUrl: 'https://test3.com',
+        }]
+      }]
+  })"));
+}
+
+IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest,
                        RunAdAuctionInvalidPerBuyerSignals) {
   ASSERT_TRUE(NavigateToURL(shell(), https_server_->GetURL("a.test", "/echo")));
 
@@ -3052,23 +3121,15 @@
   CheckAdComponents(/*expected_ad_component_urls=*/std::vector<GURL>{},
                     ad_frame);
 
-  // Navigate the ad component fenced frame to some of the URNs, which
-  // should navigate it to about:blank. MPArch mode currently crashes on
-  // navigations to about:blank, so skip in that case.
-  //
-  // TODO(https://crbug.com/1268238): Always do this once MPArch can handle
-  // about:blank navigations.
-  if (GetParam() != blink::features::FencedFramesImplementationType::kMPArch) {
-    absl::optional<std::vector<GURL>> all_component_urls =
-        GetAdAuctionComponentsInJS(ad_frame, blink::kMaxAdAuctionAdComponents);
-    ASSERT_TRUE(all_component_urls);
-    NavigateFencedFrameAndWait((*all_component_urls)[0],
-                               GURL(url::kAboutBlankURL),
-                               GetFencedFrameRenderFrameHost(shell()));
-    NavigateFencedFrameAndWait(
-        (*all_component_urls)[blink::kMaxAdAuctionAdComponents - 1],
-        GURL(url::kAboutBlankURL), GetFencedFrameRenderFrameHost(shell()));
-  }
+  absl::optional<std::vector<GURL>> all_component_urls =
+      GetAdAuctionComponentsInJS(ad_frame, blink::kMaxAdAuctionAdComponents);
+  ASSERT_TRUE(all_component_urls);
+  NavigateFencedFrameAndWait((*all_component_urls)[0],
+                             GURL(url::kAboutBlankURL),
+                             GetFencedFrameRenderFrameHost(shell()));
+  NavigateFencedFrameAndWait(
+      (*all_component_urls)[blink::kMaxAdAuctionAdComponents - 1],
+      GURL(url::kAboutBlankURL), GetFencedFrameRenderFrameHost(shell()));
 }
 
 // Test with an ad component. Run an auction with an ad component, load the ad
@@ -3090,23 +3151,15 @@
       /*expected_ad_component_urls=*/std::vector<GURL>{ad_component_url},
       ad_frame);
 
-  // Navigate the ad component fenced frame to some of the about:blank URNs.
-  // MPArch mode currently crashes on navigations to about:blank, so skip in
-  // that case.
-  //
-  // TODO(https://crbug.com/1268238): Always do this once MPArch can handle
-  // about:blank navigations.
-  if (GetParam() != blink::features::FencedFramesImplementationType::kMPArch) {
-    absl::optional<std::vector<GURL>> all_component_urls =
-        GetAdAuctionComponentsInJS(ad_frame, blink::kMaxAdAuctionAdComponents);
-    ASSERT_TRUE(all_component_urls);
-    NavigateFencedFrameAndWait((*all_component_urls)[1],
-                               GURL(url::kAboutBlankURL),
-                               GetFencedFrameRenderFrameHost(shell()));
-    NavigateFencedFrameAndWait(
-        (*all_component_urls)[blink::kMaxAdAuctionAdComponents - 1],
-        GURL(url::kAboutBlankURL), GetFencedFrameRenderFrameHost(shell()));
-  }
+  absl::optional<std::vector<GURL>> all_component_urls =
+      GetAdAuctionComponentsInJS(ad_frame, blink::kMaxAdAuctionAdComponents);
+  ASSERT_TRUE(all_component_urls);
+  NavigateFencedFrameAndWait((*all_component_urls)[1],
+                             GURL(url::kAboutBlankURL),
+                             GetFencedFrameRenderFrameHost(shell()));
+  NavigateFencedFrameAndWait(
+      (*all_component_urls)[blink::kMaxAdAuctionAdComponents - 1],
+      GURL(url::kAboutBlankURL), GetFencedFrameRenderFrameHost(shell()));
 }
 
 // Checked that navigator.adAuctionComponents() from an ad auction with
@@ -3338,14 +3391,8 @@
                              ad_frame);
   NavigateFencedFrameAndWait((*components)[1], ad_components[2].render_url,
                              ad_frame);
-  // MPArch currently crashes on navigations to about:blank.
-  //
-  // TODO(https://crbug.com/1268238): Always do this once MPArch can handle
-  // about:blank navigations.
-  if (GetParam() != blink::features::FencedFramesImplementationType::kMPArch) {
-    NavigateFencedFrameAndWait((*components)[2], GURL(url::kAboutBlankURL),
-                               ad_frame);
-  }
+  NavigateFencedFrameAndWait((*components)[2], GURL(url::kAboutBlankURL),
+                             ad_frame);
 }
 
 // These end-to-end tests validate that information from navigator-exposed APIs
@@ -3943,6 +3990,20 @@
     return absl::nullopt;
   }
 
+  // Creates a valid AuctionAdConfigPtr which will run an auction with the
+  // InterestGroup added in SetUpOnMainThread() participating and winning.
+  blink::mojom::AuctionAdConfigPtr CreateValidAuctionConfig() {
+    auto config = blink::mojom::AuctionAdConfig::New();
+    config->seller = test_origin_a_;
+    config->decision_logic_url =
+        https_server_->GetURL("a.test", "/interest_group/decision_logic.js");
+    config->auction_ad_config_non_shared_params =
+        blink::mojom::AuctionAdConfigNonSharedParams::New();
+    config->auction_ad_config_non_shared_params->interest_group_buyers = {
+        test_origin_a_};
+    return config;
+  }
+
   url::Origin test_origin_a_;
   GURL ad_url_;
 };
@@ -4122,6 +4183,30 @@
   EXPECT_THAT(RunAuctionBypassBlink(std::move(config)), Eq(absl::nullopt));
 }
 
+IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTestRunAdAuctionBypassBlink,
+                       InvalidComponentAuctionUrl) {
+  auto config = CreateValidAuctionConfig();
+  auto component_auction_config = CreateValidAuctionConfig();
+  // This is invalid because it's cross-origin to the seller.
+  component_auction_config->decision_logic_url =
+      https_server_->GetURL("d.test", "/interest_group/decision_logic.js");
+  config->component_auctions.emplace_back(std::move(component_auction_config));
+
+  EXPECT_THAT(RunAuctionBypassBlink(std::move(config)), Eq(absl::nullopt));
+}
+
+// Test that component auctions with their own component auctions are rejected.
+IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTestRunAdAuctionBypassBlink,
+                       InvalidComponentAuctionDepth) {
+  auto config = CreateValidAuctionConfig();
+  auto component_auction_config = CreateValidAuctionConfig();
+  component_auction_config->component_auctions.emplace_back(
+      CreateValidAuctionConfig());
+  config->component_auctions.emplace_back(std::move(component_auction_config));
+
+  EXPECT_THAT(RunAuctionBypassBlink(std::move(config)), Eq(absl::nullopt));
+}
+
 // Validate that createAdRequest is available and be successfully called as part
 // of PARAKEET.
 IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, CreateAdRequestWorks) {
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc
index 140800d..4ab52b9 100644
--- a/content/browser/interest_group/interest_group_manager_impl.cc
+++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -271,7 +271,7 @@
     return true;
   std::vector<std::string> trusted_bidding_signals_keys;
   for (const base::Value& keys_value :
-       maybe_update_trusted_bidding_signals_keys->GetList()) {
+       maybe_update_trusted_bidding_signals_keys->GetListDeprecated()) {
     const std::string* maybe_key = keys_value.GetIfString();
     if (!maybe_key)
       return false;
@@ -290,7 +290,7 @@
   if (!maybe_ads)
     return true;
   std::vector<blink::InterestGroup::Ad> ads;
-  for (const base::Value& ads_value : maybe_ads->GetList()) {
+  for (const base::Value& ads_value : maybe_ads->GetListDeprecated()) {
     if (!ads_value.is_dict())
       return false;
     const std::string* maybe_render_url = ads_value.FindStringKey("renderUrl");
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc
index 29be9303..c8f7f828 100644
--- a/content/browser/interest_group/interest_group_storage.cc
+++ b/content/browser/interest_group/interest_group_storage.cc
@@ -148,7 +148,7 @@
   if (!ads_value || !ads_value->is_list())
     return absl::nullopt;
   std::vector<blink::InterestGroup::Ad> result;
-  for (const auto& ad_value : ads_value->GetList()) {
+  for (const auto& ad_value : ads_value->GetListDeprecated()) {
     result.emplace_back(FromInterestGroupAdValue(&ad_value));
   }
   return result;
@@ -168,7 +168,7 @@
   if (!list || !list->is_list())
     return absl::nullopt;
   std::vector<std::string> result;
-  for (const auto& value : list->GetList())
+  for (const auto& value : list->GetListDeprecated())
     result.push_back(value.GetString());
   return result;
 }
diff --git a/content/browser/media/capture/frame_sink_video_capture_device.cc b/content/browser/media/capture/frame_sink_video_capture_device.cc
index 923ed80..38a992eb 100644
--- a/content/browser/media/capture/frame_sink_video_capture_device.cc
+++ b/content/browser/media/capture/frame_sink_video_capture_device.cc
@@ -6,7 +6,6 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/callback_helpers.h"
 #include "base/check_op.h"
 #include "base/location.h"
 #include "base/memory/ref_counted.h"
@@ -22,7 +21,6 @@
 #include "content/browser/compositor/surface_utils.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/device_service.h"
-#include "media/base/bind_to_current_loop.h"
 #include "media/capture/mojom/video_capture_types.mojom.h"
 #include "services/device/public/mojom/wake_lock_provider.mojom.h"
 
@@ -46,19 +44,6 @@
   return std::unique_ptr<T, BrowserThread::DeleteOnUIThread>(ptr.release());
 }
 
-// Adapter for a VideoFrameReceiver to notify once frame consumption is
-// complete. VideoFrameReceiver requires owning an object that it will destroy
-// once consumption is complete. This class adapts between that scheme and
-// running a "done callback" to notify that consumption is complete.
-class ScopedFrameDoneHelper final
-    : public base::ScopedClosureRunner,
-      public media::VideoCaptureDevice::Client::Buffer::ScopedAccessPermission {
- public:
-  explicit ScopedFrameDoneHelper(base::OnceClosure done_callback)
-      : base::ScopedClosureRunner(std::move(done_callback)) {}
-  ~ScopedFrameDoneHelper() final = default;
-};
-
 void BindWakeLockProvider(
     mojo::PendingReceiver<device::mojom::WakeLockProvider> receiver) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -271,10 +256,9 @@
   receiver_->OnFrameReadyInBuffer(
       media::ReadyFrameInBuffer(
           buffer_id, buffer_id,
-          std::make_unique<ScopedFrameDoneHelper>(
-              media::BindToCurrentLoop(base::BindOnce(
-                  &FrameSinkVideoCaptureDevice::OnFramePropagationComplete,
-                  weak_factory_.GetWeakPtr(), buffer_id))),
+          std::make_unique<media::ScopedFrameDoneHelper>(base::BindOnce(
+              &FrameSinkVideoCaptureDevice::OnFramePropagationComplete,
+              weak_factory_.GetWeakPtr(), buffer_id)),
           std::move(info)),
       {});
 }
diff --git a/content/browser/media/media_internals_audio_focus_helper.cc b/content/browser/media/media_internals_audio_focus_helper.cc
index 30ef49f..b10ed737 100644
--- a/content/browser/media/media_internals_audio_focus_helper.cc
+++ b/content/browser/media/media_internals_audio_focus_helper.cc
@@ -195,7 +195,7 @@
   DCHECK(sessions_list);
 
   bool updated = false;
-  for (auto& session : sessions_list->GetList()) {
+  for (auto& session : sessions_list->GetListDeprecated()) {
     if (session.FindKey(kAudioFocusIdKey)->GetString() != id)
       continue;
 
diff --git a/content/browser/media/media_internals_unittest.cc b/content/browser/media/media_internals_unittest.cc
index f899994..f51cff1b 100644
--- a/content/browser/media/media_internals_unittest.cc
+++ b/content/browser/media/media_internals_unittest.cc
@@ -89,12 +89,13 @@
     const base::ListValue* actual_list;
     ASSERT_TRUE(update_data_.GetList(key, &actual_list));
     const size_t expected_size = expected_list.GetList().size();
-    const size_t actual_size = actual_list->GetList().size();
+    const size_t actual_size = actual_list->GetListDeprecated().size();
     ASSERT_EQ(expected_size, actual_size);
     for (size_t i = 0; i < expected_size; ++i) {
       const std::string* expected_value =
           expected_list.GetList()[i].GetIfString();
-      const std::string* actual_value = actual_list->GetList()[i].GetIfString();
+      const std::string* actual_value =
+          actual_list->GetListDeprecated()[i].GetIfString();
       ASSERT_TRUE(expected_value);
       ASSERT_TRUE(actual_value);
       EXPECT_EQ(*expected_value, *actual_value);
diff --git a/content/browser/net/sandboxed_http_cache_browsertest.cc b/content/browser/net/sandboxed_http_cache_browsertest.cc
new file mode 100644
index 0000000..c36c457
--- /dev/null
+++ b/content/browser/net/sandboxed_http_cache_browsertest.cc
@@ -0,0 +1,79 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/feature_list.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/network_service_instance.h"
+#include "content/public/browser/page.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/content_features.h"
+#include "content/public/common/network_service_util.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/network_service_test_helper.h"
+#include "content/shell/browser/shell.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "net/base/features.h"
+#include "sandbox/policy/features.h"
+#include "services/network/public/cpp/features.h"
+#include "services/network/public/mojom/network_service_test.mojom.h"
+
+namespace content {
+namespace {
+
+class SandboxedHttpCacheBrowserTest : public ContentBrowserTest {
+ public:
+  SandboxedHttpCacheBrowserTest() {
+    std::vector<base::Feature> enabled_features = {
+      net::features::kSandboxHttpCache,
+#if !BUILDFLAG(IS_MAC) && !BUILDFLAG(IS_FUCHSIA)
+      // Network Service Sandboxing is unconditionally enabled on these platforms.
+      sandbox::policy::features::kNetworkServiceSandbox,
+#endif
+    };
+    scoped_feature_list_.InitWithFeatures(
+        enabled_features,
+        /*disabled_features=*/{features::kNetworkServiceInProcess});
+  }
+
+  void SetUp() override {
+    // These assertions need to precede ContentBrowserTest::SetUp to prevent the
+    // test body from running when one of the assertions fails.
+    ASSERT_TRUE(IsOutOfProcessNetworkService());
+    ASSERT_TRUE(sandbox::policy::features::IsNetworkSandboxEnabled());
+
+    ContentBrowserTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(SandboxedHttpCacheBrowserTest, OpeningFileIsProhibited) {
+  base::RunLoop run_loop;
+  mojo::Remote<network::mojom::NetworkServiceTest> network_service_test;
+  content::GetNetworkService()->BindTestInterface(
+      network_service_test.BindNewPipeAndPassReceiver());
+
+  absl::optional<bool> result;
+  network_service_test.set_disconnect_handler(run_loop.QuitClosure());
+  const base::FilePath path =
+      GetTestDataFilePath().Append(FILE_PATH_LITERAL("blank.jpg"));
+  network_service_test->OpenFile(path, base::BindLambdaForTesting([&](bool b) {
+                                   result = b;
+                                   run_loop.Quit();
+                                 }));
+  run_loop.Run();
+
+  EXPECT_EQ(result, absl::make_optional(false));
+}
+
+// TODO(yhirano): Add more tests.
+
+}  // namespace
+}  // namespace content
\ No newline at end of file
diff --git a/content/browser/prerender/prerender_attributes.h b/content/browser/prerender/prerender_attributes.h
index af364802..b6b55d0 100644
--- a/content/browser/prerender/prerender_attributes.h
+++ b/content/browser/prerender/prerender_attributes.h
@@ -70,8 +70,9 @@
 
   ui::PageTransition transition_type;
 
-  // Triggers can specify their own pedicates judging whether two URLs are
-  // considered as pointing to the same destination.
+  // Triggers can specify their own predicate judging whether two URLs are
+  // considered as pointing to the same destination. The URLs must be in
+  // same-origin.
   absl::optional<base::RepeatingCallback<bool(const GURL&)>>
       url_match_predicate;
 
diff --git a/content/browser/prerender/prerender_host.cc b/content/browser/prerender/prerender_host.cc
index 38f5dd6..d405b497 100644
--- a/content/browser/prerender/prerender_host.cc
+++ b/content/browser/prerender/prerender_host.cc
@@ -808,7 +808,7 @@
 bool PrerenderHost::IsUrlMatch(const GURL& url) const {
   // If the trigger defines its predicate, respect it.
   if (attributes_.url_match_predicate) {
-    // Triggers are not allowed to treat a cross-origin url a matched url. It
+    // Triggers are not allowed to treat a cross-origin url as a matched url. It
     // would cause security risks.
     if (!url::IsSameOriginWith(attributes_.prerendering_url, url))
       return false;
diff --git a/content/browser/prerender/prerender_host_registry_unittest.cc b/content/browser/prerender/prerender_host_registry_unittest.cc
index 2be8b918..48b357f 100644
--- a/content/browser/prerender/prerender_host_registry_unittest.cc
+++ b/content/browser/prerender/prerender_host_registry_unittest.cc
@@ -144,7 +144,9 @@
  public:
   PrerenderWebContentsDelegate() = default;
 
-  bool IsPrerender2Supported() override { return true; }
+  bool IsPrerender2Supported(WebContents& web_contents) override {
+    return true;
+  }
 };
 
 class PrerenderHostRegistryTest : public RenderViewHostImplTestHarness {
diff --git a/content/browser/prerender/prerender_host_unittest.cc b/content/browser/prerender/prerender_host_unittest.cc
index 48341091..4d62841 100644
--- a/content/browser/prerender/prerender_host_unittest.cc
+++ b/content/browser/prerender/prerender_host_unittest.cc
@@ -136,7 +136,9 @@
  public:
   TestWebContentsDelegate() = default;
   ~TestWebContentsDelegate() override = default;
-  bool IsPrerender2Supported() override { return true; }
+  bool IsPrerender2Supported(WebContents& web_contents) override {
+    return true;
+  }
 };
 
 class PrerenderHostTest : public RenderViewHostImplTestHarness {
diff --git a/content/browser/renderer_host/input/mouse_latency_browsertest.cc b/content/browser/renderer_host/input/mouse_latency_browsertest.cc
index d638e94..271a613 100644
--- a/content/browser/renderer_host/input/mouse_latency_browsertest.cc
+++ b/content/browser/renderer_host/input/mouse_latency_browsertest.cc
@@ -257,7 +257,8 @@
   std::string ShowTraceEventsWithId(const std::string& id_to_show,
                                     const base::ListValue* traceEvents) {
     std::stringstream stream;
-    for (const base::Value& traceEvent_value : traceEvents->GetList()) {
+    for (const base::Value& traceEvent_value :
+         traceEvents->GetListDeprecated()) {
       if (!traceEvent_value.is_dict())
         continue;
       const base::DictionaryValue& traceEvent =
@@ -283,7 +284,8 @@
 
     std::map<std::string, int> trace_ids;
 
-    for (const base::Value& traceEvent_value : traceEvents->GetList()) {
+    for (const base::Value& traceEvent_value :
+         traceEvents->GetListDeprecated()) {
       ASSERT_TRUE(traceEvent_value.is_dict());
       const base::DictionaryValue& traceEvent =
           base::Value::AsDictionaryValue(traceEvent_value);
@@ -337,7 +339,7 @@
 
   std::vector<std::string> trace_event_names;
 
-  for (const base::Value& traceEvent_value : traceEvents->GetList()) {
+  for (const base::Value& traceEvent_value : traceEvents->GetListDeprecated()) {
     ASSERT_TRUE(traceEvent_value.is_dict());
     const base::DictionaryValue& traceEvent =
         base::Value::AsDictionaryValue(traceEvent_value);
diff --git a/content/browser/renderer_host/pepper/pepper_browser_font_singleton_host.cc b/content/browser/renderer_host/pepper/pepper_browser_font_singleton_host.cc
index 43bbece..57e024f 100644
--- a/content/browser/renderer_host/pepper/pepper_browser_font_singleton_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_browser_font_singleton_host.cc
@@ -68,7 +68,7 @@
   // OK to use "slow blocking" version since we're on the blocking pool.
   std::unique_ptr<base::ListValue> list(GetFontList_SlowBlocking());
 
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
   std::string output;
   for (const auto& i : list_view) {
     if (!i.is_list())
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 07acfc7..85e8b71 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -11056,7 +11056,7 @@
       navigation_request->GetResolveErrorInfo(), error_page_content,
       std::move(subresource_loader_factories), std::move(policy_container),
       GetContentClient()->browser()->GetAlternativeErrorPageOverrideInfo(
-          navigation_request->GetURL(), GetBrowserContext()),
+          navigation_request->GetURL(), GetBrowserContext(), error_code),
       BuildCommitFailedNavigationCallback(navigation_request));
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc b/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc
index 44247f71..03c0396 100644
--- a/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_input_event_router_unittest.cc
@@ -1497,7 +1497,7 @@
 
 // This test confirms that points can be forwarded when using delegated ink in
 // a child frame, such as an OOPIF.
-#if defined(OS_LINUX)
+#if BUILDFLAG(IS_LINUX)
 #define MAYBE_ForwardPointsToChildFrame DISABLED_ForwardPointsToChildFrame
 #else
 #define MAYBE_ForwardPointsToChildFrame ForwardPointsToChildFrame
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 3fc60369..09ada3b 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -169,7 +169,7 @@
     DCHECK(focused_item);
     if (focused_item) {
       BrowserAccessibilityCocoa* focused_item_cocoa =
-          ToBrowserAccessibilityCocoa(focused_item);
+          focused_item->GetNativeViewAccessible();
       DCHECK(focused_item_cocoa);
       if (focused_item_cocoa)
         return focused_item_cocoa;
@@ -1534,7 +1534,7 @@
 
 id RenderWidgetHostViewMac::GetRootBrowserAccessibilityElement() {
   if (auto* manager = host()->GetRootBrowserAccessibilityManager())
-    return ToBrowserAccessibilityCocoa(manager->GetRoot());
+    return manager->GetRoot()->GetNativeViewAccessible();
   return nil;
 }
 
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index fd161ae..40bdb85 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -299,7 +299,7 @@
     return false;
   }
 
-  for (const auto& header : headers->GetList()) {
+  for (const auto& header : headers->GetListDeprecated()) {
     if (!header.is_list()) {
       ADD_FAILURE();
       return false;
@@ -335,7 +335,7 @@
     return false;
   }
 
-  for (const auto& header : headers->GetList()) {
+  for (const auto& header : headers->GetListDeprecated()) {
     if (!header.is_list()) {
       ADD_FAILURE();
       return false;
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc
index 13b6c1f2..84544e2 100644
--- a/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -453,9 +453,9 @@
 }
 
 void ServiceWorkerInternalsHandler::HandleGetOptions(const ListValue* args) {
-  CHECK(args->GetList()[0].is_string());
-  CHECK(args->GetList().size() != 0);
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK(args->GetListDeprecated()[0].is_string());
+  CHECK(args->GetListDeprecated().size() != 0);
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
   AllowJavascript();
   base::Value options(base::Value::Type::DICTIONARY);
   options.SetBoolKey("debug_on_start",
@@ -465,7 +465,7 @@
 }
 
 void ServiceWorkerInternalsHandler::HandleSetOption(const ListValue* args) {
-  auto args_list = args->GetList();
+  auto args_list = args->GetListDeprecated();
   if (args_list.size() < 2) {
     return;
   }
@@ -565,11 +565,12 @@
 
 void ServiceWorkerInternalsHandler::HandleStopWorker(const ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (args->GetList().size() == 0 || !args->GetList()[0].is_string())
+  if (args->GetListDeprecated().size() == 0 ||
+      !args->GetListDeprecated()[0].is_string())
     return;
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
-  const base::Value& cmd_args = args->GetList()[1];
+  const base::Value& cmd_args = args->GetListDeprecated()[1];
   if (!cmd_args.is_dict())
     return;
 
@@ -591,11 +592,12 @@
 
 void ServiceWorkerInternalsHandler::HandleInspectWorker(const ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (args->GetList().size() == 0 || !args->GetList()[0].is_string())
+  if (args->GetListDeprecated().size() == 0 ||
+      !args->GetListDeprecated()[0].is_string())
     return;
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
-  const base::Value& cmd_args = args->GetList()[1];
+  const base::Value& cmd_args = args->GetListDeprecated()[1];
   if (!cmd_args.is_dict())
     return;
 
@@ -622,11 +624,12 @@
 
 void ServiceWorkerInternalsHandler::HandleUnregister(const ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (args->GetList().size() == 0 || !args->GetList()[0].is_string())
+  if (args->GetListDeprecated().size() == 0 ||
+      !args->GetListDeprecated()[0].is_string())
     return;
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
-  const base::Value& cmd_args = args->GetList()[1];
+  const base::Value& cmd_args = args->GetListDeprecated()[1];
   if (!cmd_args.is_dict())
     return;
 
@@ -646,11 +649,12 @@
 
 void ServiceWorkerInternalsHandler::HandleStartWorker(const ListValue* args) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (args->GetList().size() == 0 || !args->GetList()[0].is_string())
+  if (args->GetListDeprecated().size() == 0 ||
+      !args->GetListDeprecated()[0].is_string())
     return;
-  std::string callback_id = args->GetList()[0].GetString();
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
-  const base::Value& cmd_args = args->GetList()[1];
+  const base::Value& cmd_args = args->GetListDeprecated()[1];
   if (!cmd_args.is_dict())
     return;
 
diff --git a/content/browser/sms/sms_browsertest.cc b/content/browser/sms/sms_browsertest.cc
index 4f26ae71..8306213 100644
--- a/content/browser/sms/sms_browsertest.cc
+++ b/content/browser/sms/sms_browsertest.cc
@@ -1285,7 +1285,9 @@
                     const std::string&,
                     base::OnceCallback<void()> on_confirm,
                     base::OnceCallback<void()> on_cancel));
-  bool IsPrerender2Supported() override { return true; }
+  bool IsPrerender2Supported(WebContents& web_contents) override {
+    return true;
+  }
 };
 
 class SmsPrerenderingBrowserTest : public SmsBrowserTest {
diff --git a/content/browser/speculation_rules/speculation_host_impl.cc b/content/browser/speculation_rules/speculation_host_impl.cc
index f783c02..cd2ca28 100644
--- a/content/browser/speculation_rules/speculation_host_impl.cc
+++ b/content/browser/speculation_rules/speculation_host_impl.cc
@@ -114,11 +114,14 @@
   if (!registry_ || candidates.empty())
     return;
   DCHECK(blink::features::IsPrerender2Enabled());
-  WebContentsDelegate* web_contents_delegate =
-      content::WebContents::FromRenderFrameHost(render_frame_host())
-          ->GetDelegate();
+
+  // TODO(https://crbug.com/1292422): Move this check into
+  // PrerenderHostRegistry::CreateAndStartHost().
+  WebContents* web_contents =
+      WebContents::FromRenderFrameHost(render_frame_host());
+  WebContentsDelegate* web_contents_delegate = web_contents->GetDelegate();
   if (!web_contents_delegate ||
-      !web_contents_delegate->IsPrerender2Supported()) {
+      !web_contents_delegate->IsPrerender2Supported(*web_contents)) {
     return;
   }
 
@@ -130,7 +133,6 @@
     GetContentClient()->browser()->LogWebFeatureForCurrentPage(
         rfhi, blink::mojom::WebFeature::kSpeculationRulesPrerender);
 
-    auto* web_contents = WebContents::FromRenderFrameHost(rfhi);
     int prerender_host_id = registry_->CreateAndStartHost(
         PrerenderAttributes(
             it->url, PrerenderTriggerType::kSpeculationRule,
diff --git a/content/browser/speculation_rules/speculation_host_impl_unittest.cc b/content/browser/speculation_rules/speculation_host_impl_unittest.cc
index ca9252f1..e16d31d 100644
--- a/content/browser/speculation_rules/speculation_host_impl_unittest.cc
+++ b/content/browser/speculation_rules/speculation_host_impl_unittest.cc
@@ -25,7 +25,9 @@
  public:
   PrerenderWebContentsDelegate() = default;
 
-  bool IsPrerender2Supported() override { return true; }
+  bool IsPrerender2Supported(WebContents& web_contents) override {
+    return true;
+  }
 };
 
 class SpeculationHostImplTest : public RenderViewHostImplTestHarness {
diff --git a/content/browser/speech/tts_controller_impl.cc b/content/browser/speech/tts_controller_impl.cc
index a24ddbc1..ee53b4b 100644
--- a/content/browser/speech/tts_controller_impl.cc
+++ b/content/browser/speech/tts_controller_impl.cc
@@ -751,10 +751,10 @@
   if (!children || !children->is_list())
     return;
 
-  for (size_t i = 0; i < children->GetList().size(); ++i) {
+  for (size_t i = 0; i < children->GetListDeprecated().size(); ++i) {
     // We need to iterate over all children because some text elements are
     // nested within other types of elements, such as <emphasis> tags.
-    PopulateParsedText(parsed_text, &children->GetList()[i]);
+    PopulateParsedText(parsed_text, &children->GetListDeprecated()[i]);
   }
 }
 
diff --git a/content/browser/startup_task_runner.h b/content/browser/startup_task_runner.h
index 417767d3f..06684b29 100644
--- a/content/browser/startup_task_runner.h
+++ b/content/browser/startup_task_runner.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/time/time.h"
 #include "content/common/content_export.h"
 
 #include "build/build_config.h"
diff --git a/content/browser/tracing/background_tracing_config_impl.cc b/content/browser/tracing/background_tracing_config_impl.cc
index dd35ad1f..001d120 100644
--- a/content/browser/tracing/background_tracing_config_impl.cc
+++ b/content/browser/tracing/background_tracing_config_impl.cc
@@ -269,7 +269,7 @@
   if (!configs_list)
     return nullptr;
 
-  for (const auto& config_dict : configs_list->GetList()) {
+  for (const auto& config_dict : configs_list->GetListDeprecated()) {
     if (!config_dict.is_dict())
       return nullptr;
 
@@ -319,7 +319,7 @@
   if (!configs_list)
     return nullptr;
 
-  for (const auto& config_dict : configs_list->GetList()) {
+  for (const auto& config_dict : configs_list->GetListDeprecated()) {
     if (!config_dict.is_dict())
       return nullptr;
 
@@ -356,7 +356,7 @@
   if (!configs_list)
     return nullptr;
 
-  for (const auto& config_dict : configs_list->GetList()) {
+  for (const auto& config_dict : configs_list->GetListDeprecated()) {
     if (!config_dict.is_dict())
       return nullptr;
 
diff --git a/content/browser/ukm_internals_ui.cc b/content/browser/ukm_internals_ui.cc
index 9e14b9d..beab10d 100644
--- a/content/browser/ukm_internals_ui.cc
+++ b/content/browser/ukm_internals_ui.cc
@@ -63,7 +63,7 @@
 UkmMessageHandler::~UkmMessageHandler() {}
 
 void UkmMessageHandler::HandleRequestUkmData(const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   AllowJavascript();
 
   // Identifies the callback, used for when resolving.
diff --git a/content/browser/webauth/authenticator_common.cc b/content/browser/webauth/authenticator_common.cc
index c6dda0e..5e6ce0f 100644
--- a/content/browser/webauth/authenticator_common.cc
+++ b/content/browser/webauth/authenticator_common.cc
@@ -690,7 +690,7 @@
   // request.
   WebAuthenticationRequestProxy* proxy = GetWebAuthnRequestProxyIfActive();
   if (proxy) {
-    request_proxy_make_credential_id_ = proxy->SignalCreateRequest(
+    pending_proxied_request_id_ = proxy->SignalCreateRequest(
         options,
         base::BindOnce(&AuthenticatorCommon::OnMakeCredentialProxyResponse,
                        weak_factory_.GetWeakPtr()));
@@ -926,6 +926,10 @@
   DCHECK(get_assertion_response_callback_.is_null());
   get_assertion_response_callback_ = std::move(callback);
 
+  if (!options->is_conditional) {
+    BeginRequestTimeout(options->timeout);
+  }
+
   WebAuthRequestSecurityChecker::RequestType request_type =
       payment.is_null()
           ? WebAuthRequestSecurityChecker::RequestType::kGetAssertion
@@ -983,6 +987,15 @@
   options->relying_party_id = std::move(*rp_id);
   request_delegate_->SetRelyingPartyId(relying_party_id_);
 
+  WebAuthenticationRequestProxy* proxy = GetWebAuthnRequestProxyIfActive();
+  if (proxy) {
+    pending_proxied_request_id_ = proxy->SignalGetRequest(
+        options,
+        base::BindOnce(&AuthenticatorCommon::OnGetAssertionProxyResponse,
+                       weak_factory_.GetWeakPtr()));
+    return;
+  }
+
   const bool origin_is_crypto_token_extension =
       WebAuthRequestSecurityChecker::OriginIsCryptoTokenExtension(
           caller_origin_);
@@ -1061,10 +1074,6 @@
     requested_extensions_.insert(RequestExtension::kLargeBlobWrite);
   }
 
-  if (!options->is_conditional) {
-    BeginRequestTimeout(options->timeout);
-  }
-
   ctap_get_assertion_request_ =
       CreateCtapGetAssertionRequest(client_data_json_, options, app_id_,
                                     GetBrowserContext()->IsOffTheRecord());
@@ -1140,6 +1149,9 @@
         IsUserVerifyingPlatformAuthenticatorAvailableCallback callback) {
   WebAuthenticationRequestProxy* proxy = GetWebAuthnRequestProxyIfActive();
   if (proxy) {
+    // Note that IsUvpaa requests can interleave with MakeCredential or
+    // GetAssertion, and cannot be cancelled. Thus, we do not set
+    // `pending_proxied_request_id_` here.
     proxy->SignalIsUvpaaRequest(std::move(callback));
     return;
   }
@@ -1620,16 +1632,16 @@
     blink::mojom::AuthenticatorStatus status) {
   DCHECK(!make_credential_response_callback_ ||
          !get_assertion_response_callback_);
-  if (request_proxy_make_credential_id_) {
+  if (pending_proxied_request_id_) {
     WebAuthenticationRequestProxy* proxy =
         GetWebAuthenticationDelegate()->MaybeGetRequestProxy(
             GetBrowserContext());
-    // As long as `request_proxy_make_credential_id_` is set, there should be an
+    // As long as `pending_proxied_request_id_` is set, there should be an
     // active request proxy. Deactivation of the proxy would have invoked
-    // `OnMakeCredentialProxyResponse()`, and cleared
-    // `request_proxy_make_credential_id_`
+    // `OnMakeCredentialProxyResponse()` or `OnGetAssertionProxyResponse()`, and
+    // cleared `pending_proxied_request_id_`
     DCHECK(proxy);
-    proxy->CancelRequest(*request_proxy_make_credential_id_);
+    proxy->CancelRequest(*pending_proxied_request_id_);
   }
   if (make_credential_response_callback_) {
     CompleteMakeCredentialRequest(status);
@@ -1914,7 +1926,7 @@
   error_awaiting_user_acknowledgement_ =
       blink::mojom::AuthenticatorStatus::NOT_ALLOWED_ERROR;
   requested_extensions_.clear();
-  request_proxy_make_credential_id_.reset();
+  pending_proxied_request_id_.reset();
 }
 
 void AuthenticatorCommon::DisableUI() {
@@ -1970,9 +1982,9 @@
     WebAuthenticationRequestProxy::RequestId request_id,
     blink::mojom::WebAuthnDOMExceptionDetailsPtr error,
     blink::mojom::MakeCredentialAuthenticatorResponsePtr response) {
-  DCHECK_EQ(*request_proxy_make_credential_id_, request_id);
+  DCHECK_EQ(*pending_proxied_request_id_, request_id);
   DCHECK(make_credential_response_callback_);
-  request_proxy_make_credential_id_.reset();
+  pending_proxied_request_id_.reset();
   if (error) {
     DCHECK(!response);
     CompleteMakeCredentialRequest(
@@ -1984,4 +1996,22 @@
                                 std::move(response), nullptr, Focus::kDoCheck);
 }
 
+void AuthenticatorCommon::OnGetAssertionProxyResponse(
+    WebAuthenticationRequestProxy::RequestId request_id,
+    blink::mojom::WebAuthnDOMExceptionDetailsPtr error,
+    blink::mojom::GetAssertionAuthenticatorResponsePtr response) {
+  DCHECK_EQ(*pending_proxied_request_id_, request_id);
+  DCHECK(get_assertion_response_callback_);
+  pending_proxied_request_id_.reset();
+  if (error) {
+    DCHECK(!response);
+    CompleteGetAssertionRequest(
+        blink::mojom::AuthenticatorStatus::ERROR_WITH_DOM_EXCEPTION_DETAILS,
+        nullptr, std::move(error));
+    return;
+  }
+  CompleteGetAssertionRequest(blink::mojom::AuthenticatorStatus::SUCCESS,
+                              std::move(response));
+}
+
 }  // namespace content
diff --git a/content/browser/webauth/authenticator_common.h b/content/browser/webauth/authenticator_common.h
index af4f82f1..2a57758 100644
--- a/content/browser/webauth/authenticator_common.h
+++ b/content/browser/webauth/authenticator_common.h
@@ -243,6 +243,11 @@
       blink::mojom::WebAuthnDOMExceptionDetailsPtr error,
       blink::mojom::MakeCredentialAuthenticatorResponsePtr response);
 
+  void OnGetAssertionProxyResponse(
+      WebAuthenticationRequestProxy::RequestId request_id,
+      blink::mojom::WebAuthnDOMExceptionDetailsPtr error,
+      blink::mojom::GetAssertionAuthenticatorResponsePtr response);
+
   const GlobalRenderFrameHostId render_frame_host_id_;
   bool has_pending_request_ = false;
   std::unique_ptr<device::FidoRequestHandlerBase> request_handler_;
@@ -279,8 +284,9 @@
 
   base::flat_set<RequestExtension> requested_extensions_;
 
+  // The request ID of a pending proxied MakeCredential or GetAssertion request.
   absl::optional<WebAuthenticationRequestProxy::RequestId>
-      request_proxy_make_credential_id_;
+      pending_proxied_request_id_;
 
   base::WeakPtrFactory<AuthenticatorCommon> weak_factory_{this};
 };
diff --git a/content/browser/webauth/authenticator_impl_unittest.cc b/content/browser/webauth/authenticator_impl_unittest.cc
index 55a42ab4..fbc7f66 100644
--- a/content/browser/webauth/authenticator_impl_unittest.cc
+++ b/content/browser/webauth/authenticator_impl_unittest.cc
@@ -118,6 +118,7 @@
 using blink::mojom::CableAuthentication;
 using blink::mojom::CableAuthenticationPtr;
 using blink::mojom::CommonCredentialInfo;
+using blink::mojom::GetAssertionAuthenticatorResponse;
 using blink::mojom::GetAssertionAuthenticatorResponsePtr;
 using blink::mojom::MakeCredentialAuthenticatorResponse;
 using blink::mojom::MakeCredentialAuthenticatorResponsePtr;
@@ -1693,19 +1694,26 @@
     bool is_uvpaa = true;
 
     // Whether the request to SignalCreateRequest() should succeed.
-    bool make_credential_success = true;
+    bool request_success = true;
 
-    // If `make_credential_success` is false, the name of the DOMError to be
+    // If `request_success` is false, the name of the DOMError to be
     // returned.
-    std::string make_credential_error_name = "NotAllowedError";
+    std::string request_error_name = "NotAllowedError";
 
-    // If `make_credential_success` is true, the fake response to be returned.
+    // If `request_success` is true, the fake response to be returned for an
+    // onCreateRequest event.
     blink::mojom::MakeCredentialAuthenticatorResponsePtr
         make_credential_response = nullptr;
+
+    // If `request_success` is true, the fake response to be returned for an
+    // onGetRequest event.
+    blink::mojom::GetAssertionAuthenticatorResponsePtr get_assertion_response =
+        nullptr;
   };
 
   struct CallCounts {
     size_t signal_create_request;
+    size_t signal_get_request;
     size_t signal_is_uvpaa_request;
     size_t cancel_request;
   };
@@ -1735,6 +1743,19 @@
     return current_request_id_;
   }
 
+  RequestId SignalGetRequest(
+      const PublicKeyCredentialRequestOptionsPtr& options,
+      GetCallback callback) override {
+    current_request_id_++;
+    call_counts_.signal_get_request++;
+    pending_get_callback_ = std::move(callback);
+    if (config_.resolve_callbacks) {
+      RunPendingGetCallback();
+      return current_request_id_;
+    }
+    return current_request_id_;
+  }
+
   RequestId SignalIsUvpaaRequest(IsUvpaaCallback callback) override {
     DCHECK(!HasPendingRequest());
 
@@ -1756,19 +1777,38 @@
     if (pending_create_callback_) {
       pending_create_callback_.Reset();
     }
+    if (pending_get_callback_) {
+      pending_get_callback_.Reset();
+    }
   }
 
   void RunPendingCreateCallback() {
     DCHECK(pending_create_callback_);
     auto callback =
-        config_.make_credential_success
+        config_.request_success
             ? base::BindOnce(std::move(pending_create_callback_),
                              current_request_id_, nullptr,
                              config_.make_credential_response.Clone())
             : base::BindOnce(std::move(pending_create_callback_),
                              current_request_id_,
                              WebAuthnDOMExceptionDetails::New(
-                                 config_.make_credential_error_name, "message"),
+                                 config_.request_error_name, "message"),
+                             nullptr);
+    base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                     std::move(callback));
+  }
+
+  void RunPendingGetCallback() {
+    DCHECK(pending_get_callback_);
+    auto callback =
+        config_.request_success
+            ? base::BindOnce(std::move(pending_get_callback_),
+                             current_request_id_, nullptr,
+                             config_.get_assertion_response.Clone())
+            : base::BindOnce(std::move(pending_create_callback_),
+                             current_request_id_,
+                             WebAuthnDOMExceptionDetails::New(
+                                 config_.request_error_name, "message"),
                              nullptr);
     base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE,
                                                      std::move(callback));
@@ -1780,7 +1820,8 @@
   }
 
   bool HasPendingRequest() {
-    return pending_create_callback_ || pending_is_uvpaa_callback_;
+    return pending_create_callback_ || pending_get_callback_ ||
+           pending_is_uvpaa_callback_;
   }
 
  private:
@@ -1789,6 +1830,7 @@
 
   RequestId current_request_id_ = 0;
   CreateCallback pending_create_callback_;
+  GetCallback pending_get_callback_;
   IsUvpaaCallback pending_is_uvpaa_callback_;
 };
 
@@ -8366,7 +8408,7 @@
 }
 
 TEST_F(AuthenticatorImplWithRequestProxyTest, MakeCredential) {
-  request_proxy().config().make_credential_success = true;
+  request_proxy().config().request_success = true;
   request_proxy().config().make_credential_response =
       MakeCredentialAuthenticatorResponse::New();
   request_proxy().config().make_credential_response->info =
@@ -8383,7 +8425,7 @@
 
 // Verify requests with an attached proxy run RP ID checks.
 TEST_F(AuthenticatorImplWithRequestProxyTest, MakeCredentialOriginAndRpIds) {
-  request_proxy().config().make_credential_success = true;
+  request_proxy().config().request_success = true;
   request_proxy().config().make_credential_response =
       MakeCredentialAuthenticatorResponse::New();
   request_proxy().config().make_credential_response->info =
@@ -8411,7 +8453,7 @@
 
 TEST_F(AuthenticatorImplWithRequestProxyTest, MakeCredential_Timeout) {
   request_proxy().config().resolve_callbacks = false;
-  request_proxy().config().make_credential_success = true;
+  request_proxy().config().request_success = true;
   request_proxy().config().make_credential_response =
       MakeCredentialAuthenticatorResponse::New();
   request_proxy().config().make_credential_response->info =
@@ -8429,4 +8471,68 @@
   EXPECT_FALSE(request_proxy().HasPendingRequest());
 }
 
+TEST_F(AuthenticatorImplWithRequestProxyTest, GetAssertion) {
+  request_proxy().config().request_success = true;
+  request_proxy().config().get_assertion_response =
+      GetAssertionAuthenticatorResponse::New();
+  request_proxy().config().get_assertion_response->info =
+      CommonCredentialInfo::New();
+
+  NavigateAndCommit(GURL(kTestOrigin1));
+  GetAssertionResult result =
+      AuthenticatorGetAssertion(GetTestPublicKeyCredentialRequestOptions());
+
+  EXPECT_EQ(result.status, AuthenticatorStatus::SUCCESS);
+  EXPECT_EQ(request_proxy().call_counts().signal_get_request, 1u);
+  EXPECT_EQ(request_proxy().call_counts().cancel_request, 0u);
+}
+
+// Verify requests with an attached proxy run RP ID checks.
+TEST_F(AuthenticatorImplWithRequestProxyTest, GetAssertionOriginAndRpIds) {
+  request_proxy().config().request_success = true;
+  request_proxy().config().get_assertion_response =
+      GetAssertionAuthenticatorResponse::New();
+  request_proxy().config().get_assertion_response->info =
+      CommonCredentialInfo::New();
+
+  for (const OriginClaimedAuthorityPair& test_case :
+       kInvalidRelyingPartyTestCases) {
+    SCOPED_TRACE(std::string(test_case.claimed_authority) + " " +
+                 std::string(test_case.origin));
+
+    NavigateAndCommit(GURL(test_case.origin));
+    ASSERT_TRUE(test_client_.GetWebAuthenticationDelegate()
+                    ->MaybeGetRequestProxy(main_rfh()->GetBrowserContext())
+                    ->IsActive());
+
+    PublicKeyCredentialRequestOptionsPtr options =
+        GetTestPublicKeyCredentialRequestOptions();
+    options->relying_party_id = test_case.claimed_authority;
+
+    EXPECT_EQ(AuthenticatorGetAssertion(std::move(options)).status,
+              test_case.expected_status);
+    EXPECT_EQ(request_proxy().call_counts().signal_get_request, 0u);
+  }
+}
+
+TEST_F(AuthenticatorImplWithRequestProxyTest, GetAssertion_Timeout) {
+  request_proxy().config().resolve_callbacks = false;
+  request_proxy().config().request_success = true;
+  request_proxy().config().get_assertion_response =
+      GetAssertionAuthenticatorResponse::New();
+  request_proxy().config().get_assertion_response->info =
+      CommonCredentialInfo::New();
+
+  NavigateAndCommit(GURL(kTestOrigin1));
+  GetAssertionResult result = AuthenticatorGetAssertionAndWaitForTimeout(
+      GetTestPublicKeyCredentialRequestOptions());
+
+  EXPECT_EQ(result.status, AuthenticatorStatus::NOT_ALLOWED_ERROR);
+  EXPECT_EQ(request_proxy().call_counts().signal_get_request, 1u);
+  EXPECT_EQ(request_proxy().call_counts().cancel_request, 1u);
+
+  // Proxy should not hold a pending request after cancellation.
+  EXPECT_FALSE(request_proxy().HasPendingRequest());
+}
+
 }  // namespace content
diff --git a/content/browser/webid/idp_network_request_manager.cc b/content/browser/webid/idp_network_request_manager.cc
index e769f6e..7aeb8c5 100644
--- a/content/browser/webid/idp_network_request_manager.cc
+++ b/content/browser/webid/idp_network_request_manager.cc
@@ -125,9 +125,13 @@
   resource_request->site_for_cookies = site_for_cookies;
   if (send_referrer) {
     resource_request->referrer = initiator.GetURL();
-    resource_request->referrer_policy =
-        net::ReferrerPolicy::ORIGIN_CLEAR_ON_TRANSITION_FROM_SECURE_TO_INSECURE;
+    // Since referrer_policy only affects redirects and we disable redirects
+    // below, we don't need to set referrer_policy here.
   }
+  // TODO(cbiesinger): Not following redirects is important for security because
+  // this bypasses CORB. Ensure there is a test added.
+  // https://crbug.com/1155312.
+  resource_request->redirect_mode = network::mojom::RedirectMode::kError;
   resource_request->headers.SetHeader(net::HttpRequestHeaders::kAccept,
                                       kRequestBodyContentType);
 
@@ -168,7 +172,7 @@
   if (!accounts->is_list())
     return false;
 
-  for (auto& account : accounts->GetList()) {
+  for (auto& account : accounts->GetListDeprecated()) {
     if (!account.is_dict())
       return false;
 
@@ -216,7 +220,7 @@
   const base::Value* icons_value = idp_metadata_value.FindKey("icons");
   if (icons_value != nullptr && icons_value->is_list()) {
     std::vector<blink::Manifest::ImageResource> icons;
-    for (const base::Value& icon_value : icons_value->GetList()) {
+    for (const base::Value& icon_value : icons_value->GetListDeprecated()) {
       if (!icon_value.is_dict())
         continue;
 
@@ -846,7 +850,7 @@
     // Since referrer_policy only affects redirects and we disable redirects
     // below, we don't need to set referrer_policy here.
   }
-  // TODO(kenrb): Not following redirects is important for security because
+  // TODO(cbiesinger): Not following redirects is important for security because
   // this bypasses CORB. Ensure there is a test added.
   // https://crbug.com/1155312.
   resource_request->redirect_mode = network::mojom::RedirectMode::kError;
diff --git a/content/browser/webrtc/webrtc_getusermedia_browsertest.cc b/content/browser/webrtc/webrtc_getusermedia_browsertest.cc
index 4517a2c..7e28802 100644
--- a/content/browser/webrtc/webrtc_getusermedia_browsertest.cc
+++ b/content/browser/webrtc/webrtc_getusermedia_browsertest.cc
@@ -145,7 +145,7 @@
 
     ASSERT_TRUE(parsed_json.value->is_list());
 
-    for (const auto& entry : parsed_json.value->GetList()) {
+    for (const auto& entry : parsed_json.value->GetListDeprecated()) {
       const base::DictionaryValue* dict;
       std::string kind;
       std::string device_id;
diff --git a/content/browser/webrtc/webrtc_internals_browsertest.cc b/content/browser/webrtc/webrtc_internals_browsertest.cc
index c8208f8..bcd4fc82 100644
--- a/content/browser/webrtc/webrtc_internals_browsertest.cc
+++ b/content/browser/webrtc/webrtc_internals_browsertest.cc
@@ -253,10 +253,10 @@
 
     base::ListValue* list_request =
         static_cast<base::ListValue*>(value_requests.get());
-    EXPECT_EQ(requests.size(), list_request->GetList().size());
+    EXPECT_EQ(requests.size(), list_request->GetListDeprecated().size());
 
     for (size_t i = 0; i < requests.size(); ++i) {
-      const base::Value& value = list_request->GetList()[i];
+      const base::Value& value = list_request->GetListDeprecated()[i];
       ASSERT_TRUE(value.is_dict());
       absl::optional<int> rid = value.FindIntKey("rid");
       absl::optional<int> pid = value.FindIntKey("pid");
@@ -470,7 +470,7 @@
       // Verifies the number of updates.
       const base::Value* value = pc_dump.FindListKey("updateLog");
       ASSERT_TRUE(value);
-      EXPECT_EQ((size_t)update_number, value->GetList().size());
+      EXPECT_EQ((size_t)update_number, value->GetListDeprecated().size());
 
       // Verifies the number of stats tables.
       value = pc_dump.FindDictKey("stats");
diff --git a/content/browser/webrtc/webrtc_internals_message_handler.cc b/content/browser/webrtc/webrtc_internals_message_handler.cc
index a654d8a..9dc96ee 100644
--- a/content/browser/webrtc/webrtc_internals_message_handler.cc
+++ b/content/browser/webrtc/webrtc_internals_message_handler.cc
@@ -129,7 +129,7 @@
 }
 
 void WebRTCInternalsMessageHandler::OnDOMLoadDone(const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_GE(args_list.size(), 1u);
 
   const std::string callback_id = args_list[0].GetString();
diff --git a/content/browser/webrtc/webrtc_internals_unittest.cc b/content/browser/webrtc/webrtc_internals_unittest.cc
index e97f8e6..d85a2612 100644
--- a/content/browser/webrtc/webrtc_internals_unittest.cc
+++ b/content/browser/webrtc/webrtc_internals_unittest.cc
@@ -254,8 +254,8 @@
   EXPECT_EQ("update-all-peer-connections", observer.event_name());
 
   ASSERT_TRUE(observer.event_data()->is_list());
-  EXPECT_EQ(1U, observer.event_data()->GetList().size());
-  base::Value& dict = observer.event_data()->GetList()[0];
+  EXPECT_EQ(1U, observer.event_data()->GetListDeprecated().size());
+  base::Value& dict = observer.event_data()->GetListDeprecated()[0];
   ASSERT_TRUE(dict.is_dict());
   ASSERT_FALSE(dict.FindPath("log"));
 
@@ -281,8 +281,8 @@
   EXPECT_EQ("update-all-peer-connections", observer.event_name());
 
   ASSERT_TRUE(observer.event_data()->is_list());
-  EXPECT_EQ(1U, observer.event_data()->GetList().size());
-  base::Value& dict = observer.event_data()->GetList()[0];
+  EXPECT_EQ(1U, observer.event_data()->GetListDeprecated().size());
+  base::Value& dict = observer.event_data()->GetListDeprecated()[0];
   ASSERT_TRUE(dict.is_dict());
   ASSERT_TRUE(dict.FindPath("log")->is_list());
 
@@ -292,8 +292,8 @@
   EXPECT_EQ("update-all-peer-connections", observer.event_name());
 
   ASSERT_TRUE(observer.event_data()->is_list());
-  EXPECT_EQ(1U, observer.event_data()->GetList().size());
-  base::Value& updated_dict = observer.event_data()->GetList()[0];
+  EXPECT_EQ(1U, observer.event_data()->GetListDeprecated().size());
+  base::Value& updated_dict = observer.event_data()->GetListDeprecated()[0];
   ASSERT_TRUE(updated_dict.is_dict());
   ASSERT_FALSE(updated_dict.FindPath("log"));
 
@@ -500,7 +500,7 @@
   ASSERT_TRUE(observer.event_data());
 
   ASSERT_TRUE(observer.event_data()->is_list());
-  base::Value::ConstListView list = observer.event_data()->GetList();
+  base::Value::ConstListView list = observer.event_data()->GetListDeprecated();
   EXPECT_EQ(1U, list.size());
 
   ASSERT_TRUE(list.begin()->is_dict());
@@ -516,7 +516,7 @@
 
   const base::Value* log_value = dict.FindListKey("log");
   ASSERT_TRUE(log_value);
-  base::Value::ConstListView log = log_value->GetList();
+  base::Value::ConstListView log = log_value->GetListDeprecated();
   EXPECT_EQ(1U, log.size());
 
   ASSERT_TRUE(log.begin()->is_dict());
diff --git a/content/browser/webui/web_ui_message_handler.cc b/content/browser/webui/web_ui_message_handler.cc
index c86394c..0b05ca0c7 100644
--- a/content/browser/webui/web_ui_message_handler.cc
+++ b/content/browser/webui/web_ui_message_handler.cc
@@ -43,7 +43,7 @@
 
 bool WebUIMessageHandler::ExtractIntegerValue(const base::ListValue* value,
                                               int* out_int) {
-  const base::Value& single_element = value->GetList()[0];
+  const base::Value& single_element = value->GetListDeprecated()[0];
   absl::optional<double> double_value = single_element.GetIfDouble();
   if (double_value) {
     *out_int = static_cast<int>(*double_value);
@@ -55,7 +55,7 @@
 
 bool WebUIMessageHandler::ExtractDoubleValue(const base::ListValue* value,
                                              double* out_value) {
-  const base::Value& single_element = value->GetList()[0];
+  const base::Value& single_element = value->GetListDeprecated()[0];
   absl::optional<double> double_value = single_element.GetIfDouble();
   if (double_value) {
     *out_value = *double_value;
@@ -67,7 +67,7 @@
 
 std::u16string WebUIMessageHandler::ExtractStringValue(
     const base::ListValue* value) {
-  base::Value::ConstListView list_view = value->GetList();
+  base::Value::ConstListView list_view = value->GetListDeprecated();
   if (0u < list_view.size() && list_view[0].is_string())
     return base::UTF8ToUTF16(list_view[0].GetString());
 
diff --git a/content/browser/webui/web_ui_url_loader_factory.cc b/content/browser/webui/web_ui_url_loader_factory.cc
index e6fbde3..0106f239 100644
--- a/content/browser/webui/web_ui_url_loader_factory.cc
+++ b/content/browser/webui/web_ui_url_loader_factory.cc
@@ -180,7 +180,7 @@
   // as Mojo requires a SequencedTaskRunnerHandle in scope.
   base::ThreadPool::CreateSequencedTaskRunner(
       {base::TaskPriority::USER_BLOCKING, base::MayBlock(),
-       base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})
+       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})
       ->PostTask(FROM_HERE,
                  base::BindOnce(ReadData, std::move(headers), replacements,
                                 replace_in_js, source, std::move(client_remote),
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 5a4aac8..afbb3cd 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -352,6 +352,7 @@
           {"DialogFocusNewSpecBehavior",
            blink::features::kDialogFocusNewSpecBehavior},
           {"EditingNG", blink::features::kEditingNG},
+          {"ElementSuperRareData", blink::features::kElementSuperRareData},
           {"FileHandling", blink::features::kFileHandlingAPI},
           {"Fledge", blink::features::kFledge},
           {"FontAccess", blink::features::kFontAccess},
diff --git a/content/common/cursors/webcursor.cc b/content/common/cursors/webcursor.cc
index 4c80616..1ef9d23 100644
--- a/content/common/cursors/webcursor.cc
+++ b/content/common/cursors/webcursor.cc
@@ -26,11 +26,13 @@
   // - kMaximumCursorSize in Blink's EventHandler
   // - kCursorSize in Chrome's DevToolsEyeDropper
   static constexpr int kMaximumCursorSize = 150;
+  // This value limits the underlying bitmap to a reasonable size.
+  static constexpr int kMaximumBitmapSize = 1024;
   if (cursor.image_scale_factor() < 0.01f ||
       cursor.image_scale_factor() > 100.f ||
       (cursor.type() == ui::mojom::CursorType::kCustom &&
-       (cursor.custom_bitmap().width() > kMaximumCursorSize ||
-        cursor.custom_bitmap().height() > kMaximumCursorSize ||
+       (cursor.custom_bitmap().width() > kMaximumBitmapSize ||
+        cursor.custom_bitmap().height() > kMaximumBitmapSize ||
         cursor.custom_bitmap().width() / cursor.image_scale_factor() >
             kMaximumCursorSize ||
         cursor.custom_bitmap().height() / cursor.image_scale_factor() >
diff --git a/content/common/cursors/webcursor_unittest.cc b/content/common/cursors/webcursor_unittest.cc
index d778630..d958c249 100644
--- a/content/common/cursors/webcursor_unittest.cc
+++ b/content/common/cursors/webcursor_unittest.cc
@@ -120,12 +120,21 @@
   cursor.set_image_scale_factor(1000.f);
   EXPECT_FALSE(webcursor.SetCursor(cursor));
 
-  // SetCursor should return false when the image width is too large.
+  // SetCursor should return false when the unscaled bitmap width is too large.
+  cursor.set_image_scale_factor(10.f);
+  cursor.set_custom_bitmap(CreateTestBitmap(1025, 5));
+  EXPECT_FALSE(webcursor.SetCursor(cursor));
+
+  // SetCursor should return false when the unscaled bitmap height is too large.
+  cursor.set_custom_bitmap(CreateTestBitmap(5, 1025));
+  EXPECT_FALSE(webcursor.SetCursor(cursor));
+
+  // SetCursor should return false when the 1x scaled image width is too large.
   cursor.set_image_scale_factor(1.f);
   cursor.set_custom_bitmap(CreateTestBitmap(151, 3));
   EXPECT_FALSE(webcursor.SetCursor(cursor));
 
-  // SetCursor should return false when the image height is too large.
+  // SetCursor should return false when the 1x scaled image height is too large.
   cursor.set_custom_bitmap(CreateTestBitmap(3, 151));
   EXPECT_FALSE(webcursor.SetCursor(cursor));
 
diff --git a/content/common/font_list_unittest.cc b/content/common/font_list_unittest.cc
index a9693b74..45545be 100644
--- a/content/common/font_list_unittest.cc
+++ b/content/common/font_list_unittest.cc
@@ -84,7 +84,7 @@
 TEST(FontList, GetFontListDoesNotIncludeHiddenFonts) {
   std::unique_ptr<base::ListValue> fonts = content::GetFontList_SlowBlocking();
 
-  for (const auto& font : fonts->GetList()) {
+  for (const auto& font : fonts->GetListDeprecated()) {
     const auto& font_names = font.GetList();
     const std::string& font_id = font_names[0].GetString();
 
diff --git a/content/common/input/actions_parser.cc b/content/common/input/actions_parser.cc
index 51adedb1b7..6b6dec5 100644
--- a/content/common/input/actions_parser.cc
+++ b/content/common/input/actions_parser.cc
@@ -222,7 +222,7 @@
         "action_sequence[%zu].actions is not defined or not a list",
         action_index_);
     return false;
-  } else if (actions->GetList().size() == 0) {
+  } else if (actions->GetListDeprecated().size() == 0) {
     error_message_ = base::StringPrintf(
         "action_sequence[%zu].actions is an empty list", action_index_);
     return false;
@@ -285,11 +285,12 @@
         "action_sequence[%zu].actions is not defined or not a list",
         action_index_);
     return false;
-  } else if (actions->GetList().size() == 0) {
+  } else if (actions->GetListDeprecated().size() == 0) {
     error_message_ = base::StringPrintf(
         "action_sequence[%zu].actions is an empty list", action_index_);
     return false;
-  } else if (*source_type == "wheel" && actions->GetList().size() > 1) {
+  } else if (*source_type == "wheel" &&
+             actions->GetListDeprecated().size() > 1) {
     error_message_ = base::StringPrintf(
         "action_sequence[%zu].actions should only have one action for the "
         "wheel input source",
diff --git a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
index 38bec0b..47d4d0a 100644
--- a/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/ChildProcessLauncherHelperImpl.java
@@ -389,9 +389,9 @@
                     sandboxed = false;
                 }
 
-                // Remove sandbox restriction on network service process.
+                // Network Service:
                 if (ContentSwitches.NETWORK_SANDBOX_TYPE.equals(serviceSandboxType)) {
-                    sandboxed = false;
+                    sandboxed = ChildProcessLauncherHelperImplJni.get().isNetworkSandboxEnabled();
                 }
             }
         }
@@ -879,5 +879,6 @@
                 int reverseRank);
 
         boolean serviceGroupImportanceEnabled();
+        boolean isNetworkSandboxEnabled();
     }
 }
diff --git a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
index b067336..95134772 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerTest.java
@@ -20,6 +20,7 @@
 import org.junit.runner.RunWith;
 import org.robolectric.Robolectric;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.process_launcher.ChildProcessConnection;
@@ -38,6 +39,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class BindingManagerTest {
     // Creates a mocked ChildProcessConnection that is optionally added to a BindingManager.
     private static ChildProcessConnection createTestChildProcessConnection(
diff --git a/content/public/android/junit/src/org/chromium/content/browser/SpareChildConnectionTest.java b/content/public/android/junit/src/org/chromium/content/browser/SpareChildConnectionTest.java
index 79a99c8..e5540d77 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/SpareChildConnectionTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/SpareChildConnectionTest.java
@@ -23,6 +23,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLooper;
 
 import org.chromium.base.process_launcher.ChildConnectionAllocator;
@@ -34,6 +35,7 @@
 /** Unit tests for the SpareChildConnection class. */
 @Config(manifest = Config.NONE)
 @RunWith(BaseRobolectricTestRunner.class)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class SpareChildConnectionTest {
     @Mock
     private ChildProcessConnection.ServiceCallback mServiceCallback;
diff --git a/content/public/android/junit/src/org/chromium/content/browser/input/InputMethodManagerWrapperImplTest.java b/content/public/android/junit/src/org/chromium/content/browser/input/InputMethodManagerWrapperImplTest.java
index 98fab27..25f1530 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/input/InputMethodManagerWrapperImplTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/input/InputMethodManagerWrapperImplTest.java
@@ -23,6 +23,7 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 import org.robolectric.shadows.ShadowLog;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
@@ -37,6 +38,7 @@
 @RunWith(BaseRobolectricTestRunner.class)
 // Any VERSION_CODE >= O is fine.
 @Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.O)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class InputMethodManagerWrapperImplTest {
     private static final boolean DEBUG = false;
 
diff --git a/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java b/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java
index 5c3ea586..8f90b3d 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/input/ThreadedInputConnectionTest.java
@@ -34,6 +34,7 @@
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
+import org.robolectric.annotation.LooperMode;
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.task.PostTask;
@@ -48,6 +49,7 @@
  */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@LooperMode(LooperMode.Mode.LEGACY)
 public class ThreadedInputConnectionTest {
     @Mock
     ImeAdapterImpl mImeAdapter;
diff --git a/content/public/browser/ax_inspect_factory_mac.mm b/content/public/browser/ax_inspect_factory_mac.mm
index 9b2056c..ff7c6b60 100644
--- a/content/public/browser/ax_inspect_factory_mac.mm
+++ b/content/public/browser/ax_inspect_factory_mac.mm
@@ -6,8 +6,8 @@
 
 #include "content/browser/accessibility/accessibility_event_recorder_mac.h"
 #include "content/browser/accessibility/accessibility_tree_formatter_blink.h"
-#include "content/browser/accessibility/accessibility_tree_formatter_mac.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
+#include "ui/accessibility/platform/inspect/ax_tree_formatter_mac.h"
 
 namespace content {
 
@@ -38,7 +38,7 @@
     case ui::AXApiType::kBlink:
       return std::make_unique<AccessibilityTreeFormatterBlink>();
     case ui::AXApiType::kMac:
-      return std::make_unique<AccessibilityTreeFormatterMac>();
+      return std::make_unique<ui::AXTreeFormatterMac>();
     default:
       NOTREACHED() << "Unsupported API type " << type;
   }
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 7c700a4..174b7a6 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -1300,7 +1300,8 @@
 mojom::AlternativeErrorPageOverrideInfoPtr
 ContentBrowserClient::GetAlternativeErrorPageOverrideInfo(
     const GURL& url,
-    BrowserContext* browser_context) {
+    BrowserContext* browser_context,
+    int32_t error_code) {
   return nullptr;
 }
 
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 3aaacce..f5db7c3 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -2180,11 +2180,13 @@
 
   // Gets information required for an alternative error page from web app's
   // manifest for |url|, including theme color, background color and app short
-  // name. Information is returned in a struct. Default implementation returns
-  // nullptr.
+  // name. The |error_code| is the network error as specified in
+  // `net/base/net_error_list.h`. Information is returned in a struct. Default
+  // implementation returns nullptr.
   virtual mojom::AlternativeErrorPageOverrideInfoPtr
   GetAlternativeErrorPageOverrideInfo(const GURL& url,
-                                      BrowserContext* browser_context);
+                                      BrowserContext* browser_context,
+                                      int32_t error_code);
 };
 
 }  // namespace content
diff --git a/content/public/browser/desktop_capture.cc b/content/public/browser/desktop_capture.cc
index d30a48bd2..ba9c71d 100644
--- a/content/public/browser/desktop_capture.cc
+++ b/content/public/browser/desktop_capture.cc
@@ -30,6 +30,8 @@
   } else {
     options.set_allow_use_magnification_api(true);
   }
+  options.set_enumerate_current_process_windows(
+      ShouldEnumerateCurrentProcessWindows());
 #elif BUILDFLAG(IS_MAC)
   if (base::FeatureList::IsEnabled(features::kIOSurfaceCapturer)) {
     options.set_allow_iosurface(true);
@@ -74,5 +76,13 @@
 #endif
 }
 
+bool ShouldEnumerateCurrentProcessWindows() {
+#if BUILDFLAG(IS_WIN)
+  return false;
+#else
+  return true;
+#endif
+}
+
 }  // namespace desktop_capture
 }  // namespace content
diff --git a/content/public/browser/desktop_capture.h b/content/public/browser/desktop_capture.h
index 700d5c4..256dc2e4 100644
--- a/content/public/browser/desktop_capture.h
+++ b/content/public/browser/desktop_capture.h
@@ -25,6 +25,9 @@
 // 3) Chromium has features::kWebRtcPipeWireCapturer enabled
 CONTENT_EXPORT bool CanUsePipeWire();
 
+// Whether the capturer should find windows owned by the current process.
+CONTENT_EXPORT bool ShouldEnumerateCurrentProcessWindows();
+
 }  // namespace desktop_capture
 }  // namespace content
 
diff --git a/content/public/browser/web_authentication_request_proxy.h b/content/public/browser/web_authentication_request_proxy.h
index 3cdf906..af68b36 100644
--- a/content/public/browser/web_authentication_request_proxy.h
+++ b/content/public/browser/web_authentication_request_proxy.h
@@ -26,6 +26,14 @@
       blink::mojom::WebAuthnDOMExceptionDetailsPtr,
       blink::mojom::MakeCredentialAuthenticatorResponsePtr)>;
 
+  // GetCallback is the response callback type for `SignalCreateRequest`. It
+  // is invoked with the status and optional response that resulted from the
+  // proxied request.
+  using GetCallback = base::OnceCallback<void(
+      RequestId,
+      blink::mojom::WebAuthnDOMExceptionDetailsPtr,
+      blink::mojom::GetAssertionAuthenticatorResponsePtr)>;
+
   // IsUvpaaCallback is the response callback type for `SignalIsUvpaaRequest`.
   // It is invoked with the result of the proxied request.
   using IsUvpaaCallback = base::OnceCallback<void(bool is_available)>;
@@ -42,6 +50,12 @@
       const blink::mojom::PublicKeyCredentialCreationOptionsPtr& options,
       CreateCallback callback) = 0;
 
+  // SignalGetRequest is invoked when a Web Authentication API
+  // `navigator.credentials.get()` request occurs.
+  virtual RequestId SignalGetRequest(
+      const blink::mojom::PublicKeyCredentialRequestOptionsPtr& options,
+      GetCallback callback) = 0;
+
   // SignalIsUvpaaRequest is invoked when a
   // PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() (aka
   // `IsUvpaa`) request occurs.
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index 9701abb99..cf3a961 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -338,7 +338,7 @@
   return false;
 }
 
-bool WebContentsDelegate::IsPrerender2Supported() {
+bool WebContentsDelegate::IsPrerender2Supported(WebContents& web_contents) {
   return false;
 }
 
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 5211198..722aef0 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -681,8 +681,9 @@
   // indication that the cache will be used.
   virtual bool IsBackForwardCacheSupported();
 
-  // Returns true is prerender2 is supported.
-  virtual bool IsPrerender2Supported();
+  // Returns true if Prerender2 (see content/browser/prerender/README.md for
+  // details) is supported.
+  virtual bool IsPrerender2Supported(WebContents& web_contents);
 
   // Requests the delegate to replace |predecessor_contents| with
   // |portal_contents| in the container that holds |predecessor_contents|. If
diff --git a/content/public/browser/web_ui.h b/content/public/browser/web_ui.h
index c76553b..b5f89e5 100644
--- a/content/public/browser/web_ui.h
+++ b/content/public/browser/web_ui.h
@@ -160,7 +160,7 @@
     static void Impl(base::RepeatingCallback<void(Args...)> callback,
                      base::StringPiece message,
                      const base::ListValue* list) {
-      base::span<const base::Value> args = list->GetList();
+      base::span<const base::Value> args = list->GetListDeprecated();
       CHECK_EQ(args.size(), sizeof...(Args)) << message;
       callback.Run(GetValue<Args>(args[Is])...);
     }
diff --git a/content/public/common/alternative_error_page_override_info.mojom b/content/public/common/alternative_error_page_override_info.mojom
index 7e608f1..609e0a5 100644
--- a/content/public/common/alternative_error_page_override_info.mojom
+++ b/content/public/common/alternative_error_page_override_info.mojom
@@ -6,11 +6,6 @@
 
 import "mojo/public/mojom/base/values.mojom";
 
-// |alternative_error_page_params| dictionary key values.
-const string kAppShortName = "app_short_name";
-const string kThemeColor = "theme_color";
-const string kBackgroundColor = "background_color";
-
 // Stores information about an alternative error page to use in place of the
 // embedder's default error page.
 struct AlternativeErrorPageOverrideInfo {
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index c5f6a7fa..5c5b32a1e 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -273,7 +273,7 @@
 }
 
 BrowserTestBase::~BrowserTestBase() {
-  CHECK(set_up_called_ || IsSkipped())
+  CHECK(set_up_called_ || IsSkipped() || HasFatalFailure())
       << "SetUp was not called. This probably means that the "
          "developer has overridden the method and not called "
          "the superclass version. In this case, the test "
diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc
index e9fcc80c..0197892 100644
--- a/content/public/test/browser_test_utils.cc
+++ b/content/public/test/browser_test_utils.cc
@@ -1674,15 +1674,16 @@
   } else if (!response) {
     error_stream << "Internal Error: no value";
   } else {
-    bool is_reply_from_script = response->is_list() &&
-                                response->GetList().size() == 2 &&
-                                response->GetList()[0].is_string() &&
-                                response->GetList()[0].GetString() == token;
+    bool is_reply_from_script =
+        response->is_list() && response->GetListDeprecated().size() == 2 &&
+        response->GetListDeprecated()[0].is_string() &&
+        response->GetListDeprecated()[0].GetString() == token;
 
-    bool is_error = is_reply_from_script && response->GetList()[1].is_string();
+    bool is_error =
+        is_reply_from_script && response->GetListDeprecated()[1].is_string();
     bool is_automatic_success_reply =
-        is_reply_from_script && response->GetList()[1].is_list() &&
-        response->GetList()[1].GetList().size() == 1;
+        is_reply_from_script && response->GetListDeprecated()[1].is_list() &&
+        response->GetListDeprecated()[1].GetList().size() == 1;
 
     if (is_error) {
       // This is a response generated by the error handler in our runner
@@ -1691,7 +1692,7 @@
       //
       // Parse the stack trace here, and interleave lines of source code from
       // |script| to aid debugging.
-      std::string error_text = response->GetList()[1].GetString();
+      std::string error_text = response->GetListDeprecated()[1].GetString();
 
       if (base::StartsWith(error_text,
                            "a JavaScript error:\nEvalError: Refused",
@@ -1715,8 +1716,9 @@
       // Got a response from the runner script that indicates success (of the
       // form [token, [completion_value]]. Return the completion value, with an
       // empty error.
-      return EvalJsResult(std::move(response->GetList()[1].GetList()[0]),
-                          std::string());
+      return EvalJsResult(
+          std::move(response->GetListDeprecated()[1].GetList()[0]),
+          std::string());
     } else {
       // The response was not well-formed (it failed the token match), so it's
       // not from our runner script. Fail with an explanation of the raw
diff --git a/content/public/test/network_service_test_helper.cc b/content/public/test/network_service_test_helper.cc
index b38c34e1..deb4c4ce 100644
--- a/content/public/test/network_service_test_helper.cc
+++ b/content/public/test/network_service_test_helper.cc
@@ -284,6 +284,12 @@
     receivers_.Clear();
   }
 
+  void OpenFile(const base::FilePath& path,
+                base::OnceCallback<void(bool)> callback) override {
+    base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+    std::move(callback).Run(file.IsValid());
+  }
+
  private:
   void OnMemoryPressure(
       base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
diff --git a/content/public/test/test_web_ui.cc b/content/public/test/test_web_ui.cc
index 15c3e4f5..5abfeb6 100644
--- a/content/public/test/test_web_ui.cc
+++ b/content/public/test/test_web_ui.cc
@@ -34,7 +34,7 @@
     // handler during iteration of the vector, resulting in undefined behavior.
     std::vector<MessageCallback> callbacks_to_run = callbacks_map_it->second;
     for (auto& callback : callbacks_to_run)
-      callback.Run(args->GetList());
+      callback.Run(args->GetListDeprecated());
     return;
   }
 
diff --git a/content/renderer/java/gin_java_bridge_value_converter_unittest.cc b/content/renderer/java/gin_java_bridge_value_converter_unittest.cc
index 13e6c0a..d0ace60 100644
--- a/content/renderer/java/gin_java_bridge_value_converter_unittest.cc
+++ b/content/renderer/java/gin_java_bridge_value_converter_unittest.cc
@@ -146,9 +146,9 @@
         converter->FromV8Value(v8_typed_array, context));
     ASSERT_TRUE(list_value.get()) << typed_array_type;
     ASSERT_TRUE(list_value->is_list()) << typed_array_type;
-    EXPECT_EQ(1u, list_value->GetList().size()) << typed_array_type;
+    EXPECT_EQ(1u, list_value->GetListDeprecated().size()) << typed_array_type;
 
-    const auto value = list_value->GetList().cbegin();
+    const auto value = list_value->GetListDeprecated().cbegin();
     if (value->type() == base::Value::Type::BINARY) {
       std::unique_ptr<const GinJavaBridgeValue> gin_value(
           GinJavaBridgeValue::FromValue(&*value));
diff --git a/content/renderer/pepper/pepper_video_capture_host.cc b/content/renderer/pepper/pepper_video_capture_host.cc
index 2820a01..a53d27a8 100644
--- a/content/renderer/pepper/pepper_video_capture_host.cc
+++ b/content/renderer/pepper/pepper_video_capture_host.cc
@@ -165,7 +165,7 @@
                 buffers_[i].buffer->size(), frame->timestamp());
         int uv_size = mapped_frame->coded_size().GetArea() / 2;
         std::vector<uint8_t> temp_uv_buffer(uv_size);
-        media::Status status = media::ConvertAndScaleFrame(
+        media::EncoderStatus status = media::ConvertAndScaleFrame(
             *mapped_frame, *dst_frame, temp_uv_buffer);
         if (!status.is_ok())
           return;
diff --git a/content/renderer/skia_benchmarking_extension_unittest.cc b/content/renderer/skia_benchmarking_extension_unittest.cc
index 19d48100..142c11c5 100644
--- a/content/renderer/skia_benchmarking_extension_unittest.cc
+++ b/content/renderer/skia_benchmarking_extension_unittest.cc
@@ -16,8 +16,8 @@
 
 testing::AssertionResult HasArg(const base::ListValue* args,
                                 const char name[]) {
-  for (size_t i = 0; i < args->GetList().size(); ++i) {
-    const base::Value& arg = args->GetList()[i];
+  for (size_t i = 0; i < args->GetListDeprecated().size(); ++i) {
+    const base::Value& arg = args->GetListDeprecated()[i];
     if (!arg.is_dict() || arg.DictSize() != 1) {
       return testing::AssertionFailure() << " malformed argument for index "
                                          << i;
@@ -74,7 +74,7 @@
   EXPECT_TRUE(op->GetString("cmd_string", &op_name));
   EXPECT_EQ(op_name, "Save");
   ASSERT_TRUE(op->GetList("info", &op_args));
-  EXPECT_EQ(op_args->GetList().size(), static_cast<size_t>(0));
+  EXPECT_EQ(op_args->GetListDeprecated().size(), static_cast<size_t>(0));
 
   value = &ops.GetList()[index++];
   ASSERT_TRUE(value->is_dict());
@@ -82,7 +82,7 @@
   EXPECT_TRUE(op->GetString("cmd_string", &op_name));
   EXPECT_EQ(op_name, "ClipRect");
   ASSERT_TRUE(op->GetList("info", &op_args));
-  EXPECT_EQ(op_args->GetList().size(), static_cast<size_t>(3));
+  EXPECT_EQ(op_args->GetListDeprecated().size(), static_cast<size_t>(3));
   EXPECT_TRUE(HasArg(op_args, "rect"));
   EXPECT_TRUE(HasArg(op_args, "op"));
   EXPECT_TRUE(HasArg(op_args, "anti-alias"));
@@ -93,7 +93,7 @@
   EXPECT_TRUE(op->GetString("cmd_string", &op_name));
   EXPECT_EQ(op_name, "SetMatrix");
   ASSERT_TRUE(op->GetList("info", &op_args));
-  EXPECT_EQ(op_args->GetList().size(), static_cast<size_t>(1));
+  EXPECT_EQ(op_args->GetListDeprecated().size(), static_cast<size_t>(1));
   EXPECT_TRUE(HasArg(op_args, "matrix"));
 
   value = &ops.GetList()[index++];
@@ -102,7 +102,7 @@
   EXPECT_TRUE(op->GetString("cmd_string", &op_name));
   EXPECT_EQ(op_name, "DrawRect");
   ASSERT_TRUE(op->GetList("info", &op_args));
-  EXPECT_EQ(op_args->GetList().size(), static_cast<size_t>(2));
+  EXPECT_EQ(op_args->GetListDeprecated().size(), static_cast<size_t>(2));
   EXPECT_TRUE(HasArg(op_args, "rect"));
   EXPECT_TRUE(HasArg(op_args, "paint"));
 
@@ -112,7 +112,7 @@
   EXPECT_TRUE(op->GetString("cmd_string", &op_name));
   EXPECT_EQ(op_name, "Restore");
   ASSERT_TRUE(op->GetList("info", &op_args));
-  EXPECT_EQ(op_args->GetList().size(), static_cast<size_t>(0));
+  EXPECT_EQ(op_args->GetListDeprecated().size(), static_cast<size_t>(0));
 }
 
 } // namespace content
diff --git a/content/renderer/v8_value_converter_impl.cc b/content/renderer/v8_value_converter_impl.cc
index 8236f47..6f0c58ad 100644
--- a/content/renderer/v8_value_converter_impl.cc
+++ b/content/renderer/v8_value_converter_impl.cc
@@ -287,13 +287,14 @@
     v8::Isolate* isolate,
     v8::Local<v8::Object> creation_context,
     const base::ListValue* val) const {
-  v8::Local<v8::Array> result(v8::Array::New(isolate, val->GetList().size()));
+  v8::Local<v8::Array> result(
+      v8::Array::New(isolate, val->GetListDeprecated().size()));
 
   // TODO(robwu): Callers should pass in the context.
   v8::Local<v8::Context> context = isolate->GetCurrentContext();
 
-  for (size_t i = 0; i < val->GetList().size(); ++i) {
-    const base::Value& child = val->GetList()[i];
+  for (size_t i = 0; i < val->GetListDeprecated().size(); ++i) {
+    const base::Value& child = val->GetListDeprecated()[i];
 
     v8::Local<v8::Value> child_v8 =
         ToV8ValueImpl(isolate, creation_context, &child);
diff --git a/content/renderer/v8_value_converter_impl_unittest.cc b/content/renderer/v8_value_converter_impl_unittest.cc
index ee6754e..eef8372 100644
--- a/content/renderer/v8_value_converter_impl_unittest.cc
+++ b/content/renderer/v8_value_converter_impl_unittest.cc
@@ -111,7 +111,7 @@
   }
 
   std::string GetString(base::ListValue* value, uint32_t index) {
-    base::Value::ConstListView value_list = value->GetList();
+    base::Value::ConstListView value_list = value->GetListDeprecated();
     if (index >= value_list.size() || !value_list[index].is_string()) {
       ADD_FAILURE();
       return std::string();
@@ -237,15 +237,15 @@
     ASSERT_TRUE(list.get());
     ASSERT_TRUE(list->is_list());
     if (expected_value) {
-      ASSERT_FALSE(list->GetList().empty());
-      const base::Value& temp = list->GetList()[0];
+      ASSERT_FALSE(list->GetListDeprecated().empty());
+      const base::Value& temp = list->GetListDeprecated()[0];
       EXPECT_EQ(expected_type, temp.type());
       EXPECT_EQ(*expected_value, temp);
     } else {
       // Arrays should preserve their length, and convert unconvertible
       // types into null.
-      ASSERT_FALSE(list->GetList().empty());
-      const base::Value& temp = list->GetList()[0];
+      ASSERT_FALSE(list->GetListDeprecated().empty());
+      const base::Value& temp = list->GetListDeprecated()[0];
       EXPECT_EQ(base::Value::Type::NONE, temp.type());
     }
   }
@@ -499,7 +499,7 @@
       base::ListValue::From(converter.FromV8Value(array, context)));
   ASSERT_TRUE(converted.get());
   // http://code.google.com/p/v8/issues/detail?id=1342
-  EXPECT_EQ(2u, converted->GetList().size());
+  EXPECT_EQ(2u, converted->GetListDeprecated().size());
   EXPECT_TRUE(IsNull(converted.get(), 0));
 
   // Converting to v8 value should not be affected by the getter/setter
@@ -775,7 +775,7 @@
   std::unique_ptr<base::ListValue> list_result(
       base::ListValue::From(converter.FromV8Value(array, context)));
   ASSERT_TRUE(list_result.get());
-  EXPECT_EQ(2u, list_result->GetList().size());
+  EXPECT_EQ(2u, list_result->GetListDeprecated().size());
   EXPECT_TRUE(IsNull(list_result.get(), 1));
 }
 
@@ -838,7 +838,7 @@
   std::unique_ptr<base::ListValue> result(
       base::ListValue::From(converter.FromV8Value(array, context)));
   ASSERT_TRUE(result.get());
-  EXPECT_EQ(2u, result->GetList().size());
+  EXPECT_EQ(2u, result->GetListDeprecated().size());
 }
 
 TEST_F(V8ValueConverterImplTest, UndefinedValueBehavior) {
@@ -1032,8 +1032,8 @@
     std::unique_ptr<base::ListValue> list_result(
         base::ListValue::From(converter.FromV8Value(array, context)));
     ASSERT_TRUE(list_result.get());
-    ASSERT_EQ(2u, list_result->GetList().size());
-    for (size_t i = 0; i < list_result->GetList().size(); ++i) {
+    ASSERT_EQ(2u, list_result->GetListDeprecated().size());
+    for (size_t i = 0; i < list_result->GetListDeprecated().size(); ++i) {
       ASSERT_FALSE(IsNull(list_result.get(), i));
       base::DictionaryValue* dict_value = nullptr;
       ASSERT_TRUE(list_result->GetDictionary(0u, &dict_value));
diff --git a/content/services/auction_worklet/auction_v8_helper_unittest.cc b/content/services/auction_worklet/auction_v8_helper_unittest.cc
index 7ba8746..37bfbf1 100644
--- a/content/services/auction_worklet/auction_v8_helper_unittest.cc
+++ b/content/services/auction_worklet/auction_v8_helper_unittest.cc
@@ -733,7 +733,7 @@
         breakpoint_hit.value.FindListPath("params.hitBreakpoints");
     ASSERT_TRUE(hit_breakpoints);
     base::Value::ConstListView hit_breakpoints_list =
-        hit_breakpoints->GetList();
+        hit_breakpoints->GetListDeprecated();
     ASSERT_EQ(1u, hit_breakpoints_list.size());
     ASSERT_TRUE(hit_breakpoints_list[0].is_string());
     EXPECT_EQ("1:2:0:https://example.com/test.js",
@@ -845,7 +845,7 @@
         const base::Value* reasons =
             breakpoint_hit.value.FindListPath("params.data.reasons");
         ASSERT_TRUE(reasons);
-        base::Value::ConstListView reasons_list = reasons->GetList();
+        base::Value::ConstListView reasons_list = reasons->GetListDeprecated();
         ASSERT_EQ(2u, reasons_list.size());
         ASSERT_TRUE(reasons_list[0].is_dict());
         ASSERT_TRUE(reasons_list[1].is_dict());
diff --git a/content/services/auction_worklet/bidder_worklet_unittest.cc b/content/services/auction_worklet/bidder_worklet_unittest.cc
index 09f9733d..881f18b 100644
--- a/content/services/auction_worklet/bidder_worklet_unittest.cc
+++ b/content/services/auction_worklet/bidder_worklet_unittest.cc
@@ -2594,7 +2594,7 @@
       breakpoint_hit1.value.FindListPath("params.hitBreakpoints");
   ASSERT_TRUE(hit_breakpoints1);
   base::Value::ConstListView hit_breakpoints_list1 =
-      hit_breakpoints1->GetList();
+      hit_breakpoints1->GetListDeprecated();
   ASSERT_EQ(1u, hit_breakpoints_list1.size());
   ASSERT_TRUE(hit_breakpoints_list1[0].is_string());
   EXPECT_EQ("1:0:0:http://example.com/first.js",
@@ -2638,7 +2638,7 @@
       breakpoint_hit2.value.FindListPath("params.hitBreakpoints");
   ASSERT_TRUE(hit_breakpoints2);
   base::Value::ConstListView hit_breakpoints_list2 =
-      hit_breakpoints2->GetList();
+      hit_breakpoints2->GetListDeprecated();
   ASSERT_EQ(1u, hit_breakpoints_list2.size());
   ASSERT_TRUE(hit_breakpoints_list2[0].is_string());
   EXPECT_EQ("1:0:0:http://example.org/second.js",
diff --git a/content/services/auction_worklet/seller_worklet_unittest.cc b/content/services/auction_worklet/seller_worklet_unittest.cc
index 5c059e7..07d7beb 100644
--- a/content/services/auction_worklet/seller_worklet_unittest.cc
+++ b/content/services/auction_worklet/seller_worklet_unittest.cc
@@ -1742,7 +1742,7 @@
       breakpoint_hit1.value.FindListPath("params.hitBreakpoints");
   ASSERT_TRUE(hit_breakpoints1);
   base::Value::ConstListView hit_breakpoints_list1 =
-      hit_breakpoints1->GetList();
+      hit_breakpoints1->GetListDeprecated();
   ASSERT_EQ(1u, hit_breakpoints_list1.size());
   ASSERT_TRUE(hit_breakpoints_list1[0].is_string());
   EXPECT_EQ("1:2:0:http://example.com/first.js",
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc
index ff66c64..23ea81b4 100644
--- a/content/shell/browser/shell.cc
+++ b/content/shell/browser/shell.cc
@@ -584,7 +584,7 @@
   return true;
 }
 
-bool Shell::IsPrerender2Supported() {
+bool Shell::IsPrerender2Supported(WebContents& web_contents) {
   return true;
 }
 
diff --git a/content/shell/browser/shell.h b/content/shell/browser/shell.h
index 4202e7f..f0ff103e 100644
--- a/content/shell/browser/shell.h
+++ b/content/shell/browser/shell.h
@@ -157,7 +157,7 @@
       base::RepeatingClosure hang_monitor_restarter) override;
   void ActivateContents(WebContents* contents) override;
   bool IsBackForwardCacheSupported() override;
-  bool IsPrerender2Supported() override;
+  bool IsPrerender2Supported(WebContents& web_contents) override;
   std::unique_ptr<content::WebContents> ActivatePortalWebContents(
       content::WebContents* predecessor_contents,
       std::unique_ptr<content::WebContents> portal_contents) override;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 893ee4b..93fd134 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1195,6 +1195,7 @@
     "../browser/net/dns_https_protocol_upgrade_browsertest.cc",
     "../browser/net/http_cookie_browsertest.cc",
     "../browser/net/network_field_trial_browsertest.cc",
+    "../browser/net/sandboxed_http_cache_browsertest.cc",
     "../browser/net/split_cache_browsertest.cc",
     "../browser/net/trust_token_browsertest.cc",
     "../browser/net/trust_token_browsertest.h",
@@ -1733,7 +1734,7 @@
 
   if (is_mac) {
     sources += [
-      "../browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm",
+      "../browser/accessibility/ax_tree_formatter_mac_browsertest.mm",
       "../browser/accessibility/browser_accessibility_cocoa_browsertest.mm",
       "../browser/accessibility/hit_testing_mac_browsertest.mm",
       "../browser/form_controls_browsertest_mac.h",
diff --git a/content/test/content_browser_test_test.cc b/content/test/content_browser_test_test.cc
index ea1065b..22d1f0ff 100644
--- a/content/test/content_browser_test_test.cc
+++ b/content/test/content_browser_test_test.cc
@@ -248,9 +248,9 @@
 
   val = root->FindListKey("per_iteration_data");
   ASSERT_TRUE(val);
-  ASSERT_EQ(1u, val->GetList().size());
+  ASSERT_EQ(1u, val->GetListDeprecated().size());
 
-  base::Value* iteration_val = &(val->GetList()[0]);
+  base::Value* iteration_val = &(val->GetListDeprecated()[0]);
   ASSERT_TRUE(iteration_val);
   ASSERT_TRUE(iteration_val->is_dict());
   EXPECT_EQ(3u, iteration_val->DictSize());
diff --git a/content/test/data/direct_sockets/udp.html b/content/test/data/direct_sockets/udp.html
index c177b2d..203de51 100644
--- a/content/test/data/direct_sockets/udp.html
+++ b/content/test/data/direct_sockets/udp.html
@@ -8,14 +8,17 @@
     async function sendLoop(writer, requiredBytes) {
       let bytesWritten = 0;
       let chunkLength = 0;
-      const encoder = new TextEncoder();
 
       while (bytesWritten < requiredBytes) {
         chunkLength = Math.min(chunkLength + 1,
                                requiredBytes - bytesWritten);
-        bytesWritten += chunkLength;
-        const view = encoder.encode('a'.repeat(chunkLength));
-        await writer.write({ data: view.buffer });
+        let chunk = new Uint8Array(chunkLength);
+        for (let index = 0; index < chunkLength; index++) {
+          chunk[index] = bytesWritten % 256;
+          bytesWritten++;
+        }
+        await writer.ready;
+        await writer.write({ data: chunk });
       }
       return 'send succeeded';
     }
@@ -23,15 +26,23 @@
     async function readLoop(reader, requiredBytes) {
       let bytesRead = 0;
       while (bytesRead < requiredBytes) {
-        const { value : { data }, done } = await reader.read();
+        const { value, done } = await reader.read();
         if (done) {
           return 'readLoop failed: stream closed prematurely.';
         }
-        if (!data || data.byteLength === 0) {
+
+        const { data } = value;
+        if (!data || data.length === 0) {
           return 'readLoop failed: no data returned.';
         }
 
-        bytesRead += data.byteLength;
+        for (let index = 0; index < data.length; index++) {
+          if (data[index] != bytesRead % 256) {
+            console.log(`Expected ${bytesRead % 256}, received ${data[index]}`);
+            return 'readLoop failed: bad data.';
+          }
+          bytesRead++;
+        }
       }
       return 'readLoop succeeded.';
     }
diff --git a/content/test/fuzzer/renderer_tree_fuzzer.cc b/content/test/fuzzer/renderer_tree_fuzzer.cc
index cdedd337..57c2ebf 100644
--- a/content/test/fuzzer/renderer_tree_fuzzer.cc
+++ b/content/test/fuzzer/renderer_tree_fuzzer.cc
@@ -158,7 +158,7 @@
       return;
     }
 
-    for (const auto& listItem : list->GetList()) {
+    for (const auto& listItem : list->GetListDeprecated()) {
       std::unique_ptr<Node> node(Node::ParseJson(listItem));
       if (node) {
         push_back(std::move(node));
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 0dd126fa..0ebc779 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -303,9 +303,6 @@
 ###################
 # Non-"Skip" expectations go here to suppress regular flakes/failures.
 
-# Fuchsia issues
-crbug.com/1157136 [ fuchsia skia-renderer-vulkan ] Pixel_OffscreenCanvasWebGLDefault [ Failure ]
-
 crbug.com/624256 [ android ] Pixel_SolidColorBackground [ Failure ]
 
 # Failing on Nexus 5; haven't investigated why yet.
diff --git a/content/web_test/browser/devtools_protocol_test_bindings.cc b/content/web_test/browser/devtools_protocol_test_bindings.cc
index a13615c..1679f83 100644
--- a/content/web_test/browser/devtools_protocol_test_bindings.cc
+++ b/content/web_test/browser/devtools_protocol_test_bindings.cc
@@ -98,8 +98,9 @@
 
   const base::Value* params = message.FindListKey("params");
   if (*method == "dispatchProtocolMessage" && params &&
-      params->GetList().size() == 1) {
-    const std::string* protocol_message = params->GetList()[0].GetIfString();
+      params->GetListDeprecated().size() == 1) {
+    const std::string* protocol_message =
+        params->GetListDeprecated()[0].GetIfString();
     if (!protocol_message)
       return;
 
diff --git a/device/bluetooth/bluetooth_adapter.cc b/device/bluetooth/bluetooth_adapter.cc
index c4d381c5..8a9127e 100644
--- a/device/bluetooth/bluetooth_adapter.cc
+++ b/device/bluetooth/bluetooth_adapter.cc
@@ -464,6 +464,15 @@
     observer.GattDescriptorValueChanged(this, descriptor, value);
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+void BluetoothAdapter::
+    NotifyLowEnergyScanSessionHardwareOffloadingStatusChanged(
+        LowEnergyScanSessionHardwareOffloadingStatus status) {
+  for (auto& observer : observers_)
+    observer.LowEnergyScanSessionHardwareOffloadingStatusChanged(status);
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
 BluetoothAdapter::SetPoweredCallbacks::SetPoweredCallbacks() = default;
 BluetoothAdapter::SetPoweredCallbacks::~SetPoweredCallbacks() = default;
 
diff --git a/device/bluetooth/bluetooth_adapter.h b/device/bluetooth/bluetooth_adapter.h
index b590cbcb5..1b978f96 100644
--- a/device/bluetooth/bluetooth_adapter.h
+++ b/device/bluetooth/bluetooth_adapter.h
@@ -61,6 +61,14 @@
 class DEVICE_BLUETOOTH_EXPORT BluetoothAdapter
     : public base::RefCounted<BluetoothAdapter> {
  public:
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  enum class LowEnergyScanSessionHardwareOffloadingStatus {
+    kUndetermined = 0,
+    kNotSupported,
+    kSupported
+  };
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // Interface for observing changes from bluetooth adapters.
   class DEVICE_BLUETOOTH_EXPORT Observer {
    public:
@@ -318,6 +326,13 @@
         BluetoothAdapter* adapter,
         BluetoothRemoteGattDescriptor* descriptor,
         const std::vector<uint8_t>& value) {}
+
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+    // Called when the low energy scanning hardware offloading support state
+    // changes.
+    virtual void LowEnergyScanSessionHardwareOffloadingStatusChanged(
+        LowEnergyScanSessionHardwareOffloadingStatus status) {}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
   };
 
   // Used to configure a listening service.
@@ -376,12 +391,6 @@
 
   enum class PermissionStatus { kUndetermined = 0, kDenied, kAllowed };
 
-  enum class LowEnergyScanSessionHardwareOffloadingStatus {
-    kUndetermined = 0,
-    kNotSupported,
-    kSupported
-  };
-
   // Creates a new adapter. Initialize() must be called before the adapter can
   // be used.
   static scoped_refptr<BluetoothAdapter> CreateAdapter();
@@ -681,6 +690,9 @@
       const std::vector<uint8_t>& value);
 
 #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  void NotifyLowEnergyScanSessionHardwareOffloadingStatusChanged(
+      LowEnergyScanSessionHardwareOffloadingStatus status);
+
   // Set a service allowlist by specifying services UUIDs. When this is called,
   // existing connections will be disconnected and services not in the allowlist
   // will be blocked. Device property |IsBlockedByPolicy| will be True if some
diff --git a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
index 9d6cf9b3..3f1e1cf 100644
--- a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
+++ b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
@@ -298,6 +298,11 @@
   bluez::BluezDBusManager::Get()
       ->GetBluetoothAgentManagerClient()
       ->RemoveObserver(this);
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  bluez::BluezDBusManager::Get()
+      ->GetBluetoothAdvertisementMonitorManagerClient()
+      ->RemoveObserver(this);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 
   BLUETOOTH_LOG(EVENT) << "Unregistering pairing agent";
   bluez::BluezDBusManager::Get()
@@ -337,6 +342,11 @@
   bluez::BluezDBusManager::Get()->GetBluetoothInputClient()->AddObserver(this);
   bluez::BluezDBusManager::Get()->GetBluetoothAgentManagerClient()->AddObserver(
       this);
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  bluez::BluezDBusManager::Get()
+      ->GetBluetoothAdvertisementMonitorManagerClient()
+      ->AddObserver(this);
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 
   // Register the pairing agent.
   dbus::Bus* system_bus = bluez::BluezDBusManager::Get()->GetSystemBus();
@@ -966,6 +976,13 @@
 void BluetoothAdapterBlueZ::AgentManagerRemoved(
     const dbus::ObjectPath& object_path) {}
 
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+void BluetoothAdapterBlueZ::SupportedAdvertisementMonitorFeaturesChanged() {
+  NotifyLowEnergyScanSessionHardwareOffloadingStatusChanged(
+      GetLowEnergyScanSessionHardwareOffloadingStatus());
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
 void BluetoothAdapterBlueZ::Released() {
   BLUETOOTH_LOG(EVENT) << "Released";
   if (!IsPresent())
@@ -1631,38 +1648,23 @@
   if (!chromeos::features::IsBluetoothAdvertisementMonitoringEnabled())
     return LowEnergyScanSessionHardwareOffloadingStatus::kNotSupported;
 
-  // If the adapter is not present, reset any cached value.
-  if (!IsPresent()) {
-    low_energy_scan_session_hardware_offloading_status_ =
-        LowEnergyScanSessionHardwareOffloadingStatus::kUndetermined;
-    return low_energy_scan_session_hardware_offloading_status_;
-  }
-
-  // Return the cached value if we've previously looked it up.
-  if (low_energy_scan_session_hardware_offloading_status_ !=
-      LowEnergyScanSessionHardwareOffloadingStatus::kUndetermined)
-    return low_energy_scan_session_hardware_offloading_status_;
+  if (!IsPresent())
+    return LowEnergyScanSessionHardwareOffloadingStatus::kUndetermined;
 
   BluetoothAdvertisementMonitorManagerClient::Properties* properties =
       bluez::BluezDBusManager::Get()
           ->GetBluetoothAdvertisementMonitorManagerClient()
           ->GetProperties(object_path_);
+
   if (!properties) {
     return LowEnergyScanSessionHardwareOffloadingStatus::kUndetermined;
   }
 
-  // Cache the response to avoid D-Bus traffic from repeated calls.
-  bool supported = base::Contains(properties->supported_features.value(),
-                                  bluetooth_advertisement_monitor_manager::
-                                      kSupportedFeaturesControllerPatterns);
-  if (supported) {
-    low_energy_scan_session_hardware_offloading_status_ =
-        LowEnergyScanSessionHardwareOffloadingStatus::kSupported;
-  } else {
-    low_energy_scan_session_hardware_offloading_status_ =
-        LowEnergyScanSessionHardwareOffloadingStatus::kNotSupported;
-  }
-  return low_energy_scan_session_hardware_offloading_status_;
+  return base::Contains(properties->supported_features.value(),
+                        bluetooth_advertisement_monitor_manager::
+                            kSupportedFeaturesControllerPatterns)
+             ? LowEnergyScanSessionHardwareOffloadingStatus::kSupported
+             : LowEnergyScanSessionHardwareOffloadingStatus::kNotSupported;
 }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 
diff --git a/device/bluetooth/bluez/bluetooth_adapter_bluez.h b/device/bluetooth/bluez/bluetooth_adapter_bluez.h
index fc4ba67..f16c6cb 100644
--- a/device/bluetooth/bluez/bluetooth_adapter_bluez.h
+++ b/device/bluetooth/bluez/bluetooth_adapter_bluez.h
@@ -39,6 +39,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 #include "device/bluetooth/bluetooth_low_energy_scan_filter.h"
 #include "device/bluetooth/bluetooth_low_energy_scan_session.h"
+#include "device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "services/data_decoder/public/mojom/ble_scan_parser.mojom.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -92,6 +93,9 @@
       public bluez::BluetoothDeviceClient::Observer,
       public bluez::BluetoothInputClient::Observer,
       public bluez::BluetoothAgentManagerClient::Observer,
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+      public bluez::BluetoothAdvertisementMonitorManagerClient::Observer,
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
       public bluez::BluetoothAgentServiceProvider::Delegate {
  public:
   using ErrorCompletionCallback =
@@ -356,6 +360,11 @@
   void AgentManagerAdded(const dbus::ObjectPath& object_path) override;
   void AgentManagerRemoved(const dbus::ObjectPath& object_path) override;
 
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  // bluez::BluetoothAdvertisementMonitorManagerClient::Observer override.
+  void SupportedAdvertisementMonitorFeaturesChanged() override;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
   // bluez::BluetoothAgentServiceProvider::Delegate override.
   void Released() override;
   void RequestPinCode(const dbus::ObjectPath& device_path,
@@ -612,10 +621,6 @@
   // is registered.
   base::queue<std::unique_ptr<BluetoothAdvertisementMonitorServiceProvider>>
       pending_advertisement_monitors_;
-
-  LowEnergyScanSessionHardwareOffloadingStatus
-      low_energy_scan_session_hardware_offloading_status_ =
-          LowEnergyScanSessionHardwareOffloadingStatus::kUndetermined;
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 
   // Note: This should remain the last member so it'll be destroyed and
diff --git a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc
index 8f4c2b26..565b94b 100644
--- a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc
+++ b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc
@@ -5101,10 +5101,13 @@
                 kNotSupported);
 }
 
-TEST_F(BluetoothBlueZTest, LowEnergyScanSession_HardwareOffloadingSupported) {
+TEST_F(BluetoothBlueZTest, LowEnergyScanSession_HardwareOffloadingSupport) {
   GetAdapter();
   ASSERT_TRUE(adapter_->IsPresent());
 
+  // Install an observer;
+  TestBluetoothAdapterObserver observer(adapter_);
+
   BluetoothAdapterBlueZ* adapter_bluez =
       static_cast<BluetoothAdapterBlueZ*>(adapter_.get());
   FakeBluetoothAdvertisementMonitorManagerClient* client =
@@ -5117,6 +5120,9 @@
   EXPECT_EQ(adapter_->GetLowEnergyScanSessionHardwareOffloadingStatus(),
             BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
                 kUndetermined);
+  EXPECT_EQ(observer.last_low_energy_scan_session_hardware_offloading_status(),
+            BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
+                kUndetermined);
 
   // Once we add the "controller-patterns" feature, the adapter should report
   // hardware offloading as supported.
@@ -5130,17 +5136,21 @@
   EXPECT_EQ(adapter_->GetLowEnergyScanSessionHardwareOffloadingStatus(),
             BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
                 kSupported);
-
-  // Ensure that if no properties are returned we still get the cached value.
-  client->RemoveProperties();
-  EXPECT_EQ(adapter_->GetLowEnergyScanSessionHardwareOffloadingStatus(),
+  EXPECT_EQ(observer.last_low_energy_scan_session_hardware_offloading_status(),
             BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
                 kSupported);
 
-  // If the adapter becomes not present we should clear the cached value.
-  fake_bluetooth_adapter_client_->SetPresent(false);
-  GetAdapter();
-  ASSERT_FALSE(adapter_->IsPresent());
+  properties->supported_features.ReplaceValue({});
+  EXPECT_EQ(adapter_->GetLowEnergyScanSessionHardwareOffloadingStatus(),
+            BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
+                kNotSupported);
+  EXPECT_EQ(observer.last_low_energy_scan_session_hardware_offloading_status(),
+            BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
+                kNotSupported);
+
+  // Ensure that if no properties are returned we get the |kUndetermined|
+  // status.
+  client->RemoveProperties();
   EXPECT_EQ(adapter_->GetLowEnergyScanSessionHardwareOffloadingStatus(),
             BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
                 kUndetermined);
diff --git a/device/bluetooth/chromeos/OWNERS b/device/bluetooth/chromeos/OWNERS
index d84943c..d81ce61a 100644
--- a/device/bluetooth/chromeos/OWNERS
+++ b/device/bluetooth/chromeos/OWNERS
@@ -1,2 +1,3 @@
+gordonseto@google.com
 hansberry@chromium.org
 khorimoto@chromium.org
diff --git a/device/bluetooth/chromeos/bluetooth_utils.cc b/device/bluetooth/chromeos/bluetooth_utils.cc
index 321a170..7daa640 100644
--- a/device/bluetooth/chromeos/bluetooth_utils.cc
+++ b/device/bluetooth/chromeos/bluetooth_utils.cc
@@ -141,8 +141,10 @@
       return "BLE";
     case BluetoothTransport::BLUETOOTH_TRANSPORT_DUAL:
       return "Dual";
+    case BLUETOOTH_TRANSPORT_INVALID:
+      return "Invalid";
     default:
-      // A transport type of INVALID or other is unexpected, and no success
+      // A transport type of other is unexpected, and no success
       // metric for it exists.
       return "";
   }
diff --git a/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.cc b/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.cc
index 1baa256..a7615ab 100644
--- a/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.cc
+++ b/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.cc
@@ -7,7 +7,9 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/check.h"
+#include "base/logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/observer_list.h"
 #include "dbus/bus.h"
 #include "dbus/message.h"
 #include "dbus/object_manager.h"
@@ -21,6 +23,8 @@
 
 namespace bluez {
 
+BluetoothAdvertisementMonitorManagerClient::Observer::~Observer() = default;
+
 BluetoothAdvertisementMonitorManagerClient::Properties::Properties(
     dbus::ObjectProxy* object_proxy,
     const std::string& interface_name,
@@ -37,7 +41,7 @@
 
 // The BluetoothAdvertisementMonitorManagerClient implementation used in
 // production.
-class BluetoothAdvertisementMonitorManagerClientImpl
+class BluetoothAdvertisementMonitorManagerClientImpl final
     : public BluetoothAdvertisementMonitorManagerClient,
       public dbus::ObjectManager::Interface {
  public:
@@ -96,10 +100,27 @@
       dbus::ObjectProxy* object_proxy,
       const dbus::ObjectPath& object_path,
       const std::string& interface_name) override {
-    return new Properties(object_proxy, interface_name, base::DoNothing());
+    return new Properties(
+        object_proxy, interface_name,
+        base::BindRepeating(
+            &BluetoothAdvertisementMonitorManagerClientImpl::OnPropertyChanged,
+            weak_ptr_factory_.GetWeakPtr(), object_path));
+    ;
   }
 
   // BluetoothAdvertisementMonitorManagerClient override.
+  void AddObserver(
+      BluetoothAdvertisementMonitorManagerClient::Observer* observer) override {
+    DCHECK(observer);
+    observers_.AddObserver(observer);
+  }
+
+  void RemoveObserver(
+      BluetoothAdvertisementMonitorManagerClient::Observer* observer) override {
+    DCHECK(observer);
+    observers_.RemoveObserver(observer);
+  }
+
   Properties* GetProperties(const dbus::ObjectPath& object_path) override {
     DCHECK(object_manager_);
     return static_cast<Properties*>(object_manager_->GetProperties(
@@ -122,6 +143,20 @@
   }
 
  private:
+  // Called by dbus::PropertySet when a property value is changed. Informs
+  // observers.
+  void OnPropertyChanged(const dbus::ObjectPath& object_path,
+                         const std::string& property_name) {
+    DVLOG(2) << "Bluetooth Advertisement Monitor Client property changed: "
+             << object_path.value() << ": " << property_name;
+
+    if (property_name ==
+        bluetooth_advertisement_monitor_manager::kSupportedFeatures) {
+      for (auto& observer : observers_)
+        observer.SupportedAdvertisementMonitorFeaturesChanged();
+    }
+  }
+
   void CallObjectProxyMethod(const dbus::ObjectPath& manager_object_path,
                              dbus::MethodCall* method_call,
                              base::OnceClosure callback,
@@ -164,6 +199,8 @@
     std::move(error_callback).Run(error_name, error_message);
   }
 
+  base::ObserverList<Observer> observers_;
+
   dbus::ObjectManager* object_manager_ = nullptr;
 
   base::WeakPtrFactory<BluetoothAdvertisementMonitorManagerClientImpl>
diff --git a/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.h b/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.h
index b9d1e09..d95e2b3 100644
--- a/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.h
+++ b/device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/callback.h"
+#include "base/observer_list_types.h"
 #include "dbus/object_path.h"
 #include "dbus/property.h"
 #include "device/bluetooth/bluetooth_export.h"
@@ -36,11 +37,23 @@
     dbus::Property<std::vector<std::string>> supported_features;
   };
 
+  // Interface for observing changes in advertisement monitor client properties.
+  class Observer : public base::CheckedObserver {
+   public:
+    ~Observer() override;
+
+    // Called when the advertisement monitoring supported features change.
+    virtual void SupportedAdvertisementMonitorFeaturesChanged() = 0;
+  };
+
   ~BluetoothAdvertisementMonitorManagerClient() override;
 
   using ErrorCallback = base::OnceCallback<void(std::string error_name,
                                                 std::string error_message)>;
 
+  virtual void AddObserver(Observer* observer) = 0;
+  virtual void RemoveObserver(Observer* observer) = 0;
+
   // Registers an advertisement monitor manager at the D-bus object path
   // |application| with the remote BlueZ advertisement monitor manager. After
   // successful registration applications can register advertisement monitors
diff --git a/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.cc b/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.cc
index 6298b33a..2487ae2 100644
--- a/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.cc
@@ -5,7 +5,9 @@
 #include "device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.h"
 
 #include "base/callback_helpers.h"
+#include "base/logging.h"
 #include "base/notreached.h"
+#include "base/observer_list.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
 namespace bluez {
@@ -42,6 +44,16 @@
   return properties_.get();
 }
 
+void FakeBluetoothAdvertisementMonitorManagerClient::AddObserver(
+    Observer* observer) {
+  observers_.AddObserver(observer);
+}
+
+void FakeBluetoothAdvertisementMonitorManagerClient::RemoveObserver(
+    Observer* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 void FakeBluetoothAdvertisementMonitorManagerClient::
     RegisterApplicationServiceProvider(
         FakeBluetoothAdvertisementMonitorApplicationServiceProvider* provider) {
@@ -55,11 +67,27 @@
       nullptr,
       bluetooth_advertisement_monitor_manager::
           kBluetoothAdvertisementMonitorManagerInterface,
-      base::DoNothing());
+      base::BindRepeating(
+          &FakeBluetoothAdvertisementMonitorManagerClient::OnPropertyChanged,
+          weak_ptr_factory_.GetWeakPtr(),
+          /*object_path=*/dbus::ObjectPath("")));
 }
 
 void FakeBluetoothAdvertisementMonitorManagerClient::RemoveProperties() {
   properties_.reset();
 }
 
+void FakeBluetoothAdvertisementMonitorManagerClient::OnPropertyChanged(
+    const dbus::ObjectPath& object_path,
+    const std::string& property_name) {
+  DVLOG(2) << "Bluetooth Advertisement Monitor Client property changed: "
+           << object_path.value() << ": " << property_name;
+
+  if (property_name ==
+      bluetooth_advertisement_monitor_manager::kSupportedFeatures) {
+    for (auto& observer : observers_)
+      observer.SupportedAdvertisementMonitorFeaturesChanged();
+  }
+}
+
 }  // namespace bluez
diff --git a/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.h b/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.h
index a4cc27e..98b1f54 100644
--- a/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.h
+++ b/device/bluetooth/dbus/fake_bluetooth_advertisement_monitor_manager_client.h
@@ -10,6 +10,8 @@
 
 #include "base/callback_forward.h"
 #include "base/containers/flat_set.h"
+#include "base/memory/weak_ptr.h"
+#include "base/observer_list.h"
 #include "dbus/object_path.h"
 #include "device/bluetooth/bluetooth_export.h"
 #include "device/bluetooth/dbus/bluetooth_advertisement_monitor_manager_client.h"
@@ -21,7 +23,7 @@
 // Bluetooth daemon's Advertisement Monitor Manager object and is used in
 // test case.
 class DEVICE_BLUETOOTH_EXPORT FakeBluetoothAdvertisementMonitorManagerClient
-    : public BluetoothAdvertisementMonitorManagerClient {
+    final : public BluetoothAdvertisementMonitorManagerClient {
  public:
   FakeBluetoothAdvertisementMonitorManagerClient();
   ~FakeBluetoothAdvertisementMonitorManagerClient() override;
@@ -43,6 +45,8 @@
                          base::OnceClosure callback,
                          ErrorCallback error_callback) override;
   Properties* GetProperties(const dbus::ObjectPath& object_path) override;
+  void AddObserver(Observer* observer) override;
+  void RemoveObserver(Observer* observer) override;
 
   void RegisterApplicationServiceProvider(
       FakeBluetoothAdvertisementMonitorApplicationServiceProvider* provider);
@@ -58,9 +62,18 @@
   }
 
  private:
+  // Property callback passed when we create Properties structures.
+  void OnPropertyChanged(const dbus::ObjectPath& object_path,
+                         const std::string& property_name);
+
   FakeBluetoothAdvertisementMonitorApplicationServiceProvider*
       application_provider_ = nullptr;
   std::unique_ptr<Properties> properties_;
+
+  base::ObserverList<Observer> observers_;
+
+  base::WeakPtrFactory<FakeBluetoothAdvertisementMonitorManagerClient>
+      weak_ptr_factory_{this};
 };
 
 }  // namespace bluez
diff --git a/device/bluetooth/test/test_bluetooth_adapter_observer.cc b/device/bluetooth/test/test_bluetooth_adapter_observer.cc
index 1a5a5dd..7ad7262 100644
--- a/device/bluetooth/test/test_bluetooth_adapter_observer.cc
+++ b/device/bluetooth/test/test_bluetooth_adapter_observer.cc
@@ -418,6 +418,15 @@
   QuitMessageLoop();
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+void TestBluetoothAdapterObserver::
+    LowEnergyScanSessionHardwareOffloadingStatusChanged(
+        BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus status) {
+  last_low_energy_scan_session_hardware_offloading_status_ = status;
+  QuitMessageLoop();
+}
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+
 void TestBluetoothAdapterObserver::QuitMessageLoop() {
   if (base::RunLoop::IsRunningOnCurrentThread())
     base::RunLoop::QuitCurrentWhenIdleDeprecated();
diff --git a/device/bluetooth/test/test_bluetooth_adapter_observer.h b/device/bluetooth/test/test_bluetooth_adapter_observer.h
index 7324d72..39e23f05 100644
--- a/device/bluetooth/test/test_bluetooth_adapter_observer.h
+++ b/device/bluetooth/test/test_bluetooth_adapter_observer.h
@@ -107,6 +107,11 @@
   void GattDescriptorValueChanged(BluetoothAdapter* adapter,
                                   BluetoothRemoteGattDescriptor* descriptor,
                                   const std::vector<uint8_t>& value) override;
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  void LowEnergyScanSessionHardwareOffloadingStatusChanged(
+      BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus status)
+      override;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 
   // Adapter related:
   int present_changed_count() const { return present_changed_count_; }
@@ -223,6 +228,12 @@
   std::vector<uint8_t> last_changed_descriptor_value() const {
     return last_changed_descriptor_value_;
   }
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+  last_low_energy_scan_session_hardware_offloading_status() const {
+    return last_low_energy_scan_session_hardware_offloading_status_;
+  }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 
  private:
   // Some tests use a message loop since background processing is simulated;
@@ -294,6 +305,13 @@
   std::string last_gatt_descriptor_id_;
   BluetoothUUID last_gatt_descriptor_uuid_;
   std::vector<uint8_t> last_changed_descriptor_value_;
+
+#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
+  BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus
+      last_low_energy_scan_session_hardware_offloading_status_ =
+          BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus::
+              kUndetermined;
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS)
 };
 
 }  // namespace device
diff --git a/device/fido/filter.cc b/device/fido/filter.cc
index 739c84a..a405caa 100644
--- a/device/fido/filter.cc
+++ b/device/fido/filter.cc
@@ -51,7 +51,7 @@
   if (!v->is_list()) {
     return false;
   }
-  auto contents = v->GetList();
+  auto contents = v->GetListDeprecated();
   return !contents.empty() &&
          std::all_of(contents.begin(), contents.end(), predicate);
 }
@@ -62,7 +62,7 @@
   }
 
   std::vector<std::string> ret;
-  for (const auto& elem : v->GetList()) {
+  for (const auto& elem : v->GetListDeprecated()) {
     ret.push_back(elem.GetString());
   }
   return ret;
@@ -81,7 +81,7 @@
   }
 
   std::vector<FilterStep> ret;
-  const auto filter_list = filters->GetList();
+  const auto filter_list = filters->GetListDeprecated();
   for (const auto& filter : filter_list) {
     if (!filter.is_dict()) {
       return absl::nullopt;
diff --git a/docs/gpu/gpu_testing.md b/docs/gpu/gpu_testing.md
index 23cd0eb2..2b9cbd04 100644
--- a/docs/gpu/gpu_testing.md
+++ b/docs/gpu/gpu_testing.md
@@ -246,6 +246,43 @@
 
 [Cloud Storage Credentials]: gpu_testing_bot_details.md#Cloud-storage-credentials
 
+### Bisecting ChromeOS Failures Locally
+
+Failures that occur on the ChromeOS amd64-generic configuration are easy to
+reproduce due to the VM being readily available for use, but doing so requires
+some additional steps to the bisect process. The following are steps that can be
+followed using two terminals and the [Simple Chrome SDK] to bisect a ChromeOS
+failure.
+
+1. Terminal 1: Start the bisect as normal `git bisect start`
+   `git bisect good <good_revision>` `git bisect bad <bad_revision>`
+1. Terminal 1: Sync to the revision that git spits out
+   `gclient sync -r src@<revision>`
+1. Terminal 2: Enter the Simple Chrome SDK
+   `cros chrome-sdk --board amd64-generic-vm --log-level info --download-vm --clear-sdk-cache`
+1. Terminal 2: Compile the relevant target (probably the GPU integration tests)
+   `autoninja -C out_amd64-generic-vm/Release/ telemetry_gpu_integration_test`
+1. Terminal 2: Start the VM `cros_vm --start`
+1. Terminal 2: Deploy the Chrome binary to the VM
+   `deploy_chrome --build-dir out_amd64-generic-vm/Release/ --device 127.0.0.1:9222`
+   This will require you to accept a prompt twice, once because of a board
+   mismatch and once because the VM still has rootfs verification enabled.
+1. Terminal 1: Run your test on the VM. For GPU integration tests, this involves
+   specifying `--browser cros-chrome --remote 127.0.0.1 --remote-ssh-port 9222`
+1. Terminal 2: After determining whether the revision is good or bad, shut down
+   the VM `cros_vm --stop`
+1. Terminal 2: Exit the SKD `exit`
+1. Terminal 1: Let git know whether the revision was good or bad
+   `git bisect good`/`git bisect bad`
+1. Repeat from step 2 with the new revision git spits out.
+
+The repeated entry/exit from the SDK between revisions is to ensure that the
+VM image is in sync with the Chromium revision, as it is possible for
+regressions to be caused by an update to the image itself rather than a Chromium
+change.
+
+[Simple Chrome SDK]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/simple_chrome_workflow.md
+
 ### Telemetry Test Suites
 The Telemetry-based tests are all technically the same target,
 `telemetry_gpu_integration_test`, just run with different runtime arguments. The
diff --git a/docs/infra/new_builder.md b/docs/infra/new_builder.md
index b2f0f9e..1dae4c6d 100644
--- a/docs/infra/new_builder.md
+++ b/docs/infra/new_builder.md
@@ -402,10 +402,14 @@
 This will add the builder to all CQ attempts (except for CLs that only contain
 files in some particular directories).
 
-###### Regular (non-Orchestrator) CQ builders
+The starlark config files for builders are organized by builder_group. For
+example, the linux builders are in
+//infra/config/subprojects/chromium/try/tryserver.chromium.linux.star. These
+files have default values set for all builders in each particular file.
 
+###### Regular (non-Orchestrator) CQ builders
 ```starlark
-try_.chromium_linux_builder(
+try_.builder(
     name = '$BUILDER_NAME',
     tryjob = try_.job(),
 )
@@ -422,19 +426,22 @@
 beefier >=16 core bot. The Compilator builder name should always be the
 orchestrator name + "-compilator", like linux-rel and linux-rel-compilator.
 
-In chromium/src/infra/config/subprojects/chromium/try.star:
+In //infra/config/subprojects/chromium/try/tryserver.chromium.linux.star:
 ```starlark
-try_.chromium_linux_orchestrator_pair(
+try_.orchestrator_builder(
     name = "linux-rel",
+    compilator = "linux-rel-compilator",
     branch_selector = branches.STANDARD_MILESTONE,
     main_list_view = "try",
     use_clang_coverage = True,
     coverage_test_types = ["unit", "overall"],
-    orchestrator_cores = 2,
-    orchestrator_tryjob = try_.job(),
-    compilator_cores = 16,
-    compilator_goma_jobs = goma.jobs.J150,
-    compilator_name = "linux-rel-compilator",
+    tryjob = try_.job(),
+)
+
+try_.compilator_builder(
+    name = "linux-rel-compilator",
+    branch_selector = branches.STANDARD_MILESTONE,
+    main_list_view = "try",
 )
 ```
 
diff --git a/docs/linux/build_instructions.md b/docs/linux/build_instructions.md
index 98d3a1a..62467ec2 100644
--- a/docs/linux/build_instructions.md
+++ b/docs/linux/build_instructions.md
@@ -268,8 +268,14 @@
 
 ## Running test targets
 
-You can run the tests in the same way. You can also limit which tests are
-run using the `--gtest_filter` arg, e.g.:
+First build the unit_tests binary by running the command:
+
+```shell
+$ autoninja -C out/Default unit_tests
+```
+
+You can run the tests by running the unit_tests binary. You can also limit which
+tests are run using the `--gtest_filter` arg, e.g.:
 
 ```shell
 $ out/Default/unit_tests --gtest_filter="PushClientTest.*"
diff --git a/extensions/browser/api/alarms/alarm_manager.cc b/extensions/browser/api/alarms/alarm_manager.cc
index 467138c..c6d3ba67 100644
--- a/extensions/browser/api/alarms/alarm_manager.cc
+++ b/extensions/browser/api/alarms/alarm_manager.cc
@@ -334,7 +334,7 @@
                                    std::unique_ptr<base::Value> value) {
   if (value.get() && value->is_list()) {
     AlarmList alarm_states =
-        AlarmsFromValue(extension_id, is_unpacked, value->GetList());
+        AlarmsFromValue(extension_id, is_unpacked, value->GetListDeprecated());
     for (auto& alarm : alarm_states)
       AddAlarmImpl(extension_id, std::move(alarm));
   }
diff --git a/extensions/browser/api/alarms/alarms_api_unittest.cc b/extensions/browser/api/alarms/alarms_api_unittest.cc
index f246f20..8eb2625 100644
--- a/extensions/browser/api/alarms/alarms_api_unittest.cc
+++ b/extensions/browser/api/alarms/alarms_api_unittest.cc
@@ -81,7 +81,7 @@
   // JsAlarms.
   std::vector<std::unique_ptr<JsAlarm>> ToAlarmList(base::Value* value) {
     std::vector<std::unique_ptr<JsAlarm>> list;
-    for (const auto& item : value->GetList()) {
+    for (const auto& item : value->GetListDeprecated()) {
       std::unique_ptr<JsAlarm> alarm(new JsAlarm());
 
       if (!item.is_dict()) {
diff --git a/extensions/browser/api/audio/audio_device_id_calculator.cc b/extensions/browser/api/audio/audio_device_id_calculator.cc
index 052f42e..ff638f9 100644
--- a/extensions/browser/api/audio/audio_device_id_calculator.cc
+++ b/extensions/browser/api/audio/audio_device_id_calculator.cc
@@ -37,7 +37,8 @@
       ExtensionsBrowserClient::Get()->GetPrefServiceForContext(context_);
   const base::Value* audio_service_stable_ids =
       pref_service->GetList(kAudioApiStableDeviceIds);
-  base::Value::ConstListView ids_list = audio_service_stable_ids->GetList();
+  base::Value::ConstListView ids_list =
+      audio_service_stable_ids->GetListDeprecated();
   for (size_t i = 0; i < ids_list.size(); ++i) {
     const std::string* audio_service_stable_id = ids_list[i].GetIfString();
     if (!audio_service_stable_id) {
@@ -59,7 +60,7 @@
       kAudioApiStableDeviceIds);
 
   std::string api_stable_id =
-      base::NumberToString(update.Get()->GetList().size());
+      base::NumberToString(update.Get()->GetListDeprecated().size());
   stable_id_map_[audio_service_stable_id] = api_stable_id;
   update->Append(audio_service_stable_id);
   return api_stable_id;
diff --git a/extensions/browser/api/content_settings/content_settings_service.cc b/extensions/browser/api/content_settings/content_settings_service.cc
index 109fb0079..37b68f7 100644
--- a/extensions/browser/api/content_settings/content_settings_service.cc
+++ b/extensions/browser/api/content_settings/content_settings_service.cc
@@ -46,13 +46,14 @@
   if (prefs->ReadPrefAsList(
           extension_id, pref_names::kPrefContentSettings, &content_settings)) {
     content_settings_store_->SetExtensionContentSettingFromList(
-        extension_id, content_settings->GetList(), kExtensionPrefsScopeRegular);
+        extension_id, content_settings->GetListDeprecated(),
+        kExtensionPrefsScopeRegular);
   }
   if (prefs->ReadPrefAsList(extension_id,
                             pref_names::kPrefIncognitoContentSettings,
                             &content_settings)) {
     content_settings_store_->SetExtensionContentSettingFromList(
-        extension_id, content_settings->GetList(),
+        extension_id, content_settings->GetListDeprecated(),
         kExtensionPrefsScopeIncognitoPersistent);
   }
 }
diff --git a/extensions/browser/api/declarative/rules_cache_delegate.h b/extensions/browser/api/declarative/rules_cache_delegate.h
index af403cc..36a9f00 100644
--- a/extensions/browser/api/declarative/rules_cache_delegate.h
+++ b/extensions/browser/api/declarative/rules_cache_delegate.h
@@ -12,6 +12,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/observer_list.h"
+#include "base/time/time.h"
 #include "base/values.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/extensions/browser/api/declarative/rules_registry.cc b/extensions/browser/api/declarative/rules_registry.cc
index 6e94a42b4..4541e5ba 100644
--- a/extensions/browser/api/declarative/rules_registry.cc
+++ b/extensions/browser/api/declarative/rules_registry.cc
@@ -53,7 +53,7 @@
   if (!value || !value->is_list())
     return rules;
 
-  base::Value::ConstListView list_view = value->GetList();
+  base::Value::ConstListView list_view = value->GetListDeprecated();
   rules.reserve(list_view.size());
   for (const base::Value& value : list_view) {
     if (!value.is_dict())
diff --git a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
index bbb1e8a6..f8e1e3e 100644
--- a/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
+++ b/extensions/browser/api/declarative_webrequest/webrequest_condition_attribute.cc
@@ -142,7 +142,7 @@
                                             keys::kResourceTypeKey);
     return nullptr;
   }
-  base::Value::ConstListView list = value->GetList();
+  base::Value::ConstListView list = value->GetListDeprecated();
 
   std::vector<WebRequestResourceType> passed_types;
   passed_types.reserve(list.size());
@@ -223,7 +223,7 @@
     return nullptr;
   }
   std::vector<std::string> content_types;
-  for (const auto& entry : value->GetList()) {
+  for (const auto& entry : value->GetListDeprecated()) {
     if (!entry.is_string()) {
       *error = ErrorUtils::FormatErrorMessage(kInvalidValue, name);
       return nullptr;
@@ -497,7 +497,7 @@
     switch (content->type()) {
       case base::Value::Type::LIST: {
         CHECK(content->is_list());
-        for (const auto& elem : content->GetList()) {
+        for (const auto& elem : content->GetListDeprecated()) {
           matching_tests->push_back(
               StringMatchTest::Create(elem, match_type, !is_name));
         }
@@ -559,7 +559,7 @@
   }
 
   std::unique_ptr<const HeaderMatcher> header_matcher(
-      HeaderMatcher::Create(value->GetList()));
+      HeaderMatcher::Create(value->GetListDeprecated()));
   if (!header_matcher.get())
     *error = ErrorUtils::FormatErrorMessage(kInvalidValue, name);
   return header_matcher;
diff --git a/extensions/browser/api/device_permissions_manager.cc b/extensions/browser/api/device_permissions_manager.cc
index 064d4ec..91e91aea 100644
--- a/extensions/browser/api/device_permissions_manager.cc
+++ b/extensions/browser/api/device_permissions_manager.cc
@@ -100,8 +100,9 @@
 
   base::Value device_entry(entry->ToValue());
   // TODO(crbug.com/1187106): Use base::Contains once |devices| not a ListValue.
-  DCHECK(std::find(devices->GetList().begin(), devices->GetList().end(),
-                   device_entry) == devices->GetList().end());
+  DCHECK(std::find(devices->GetListDeprecated().begin(),
+                   devices->GetListDeprecated().end(),
+                   device_entry) == devices->GetListDeprecated().end());
   devices->Append(std::move(device_entry));
 }
 
@@ -139,8 +140,8 @@
     return;
   }
 
-  for (auto it = devices->GetList().begin(); it != devices->GetList().end();
-       ++it) {
+  for (auto it = devices->GetListDeprecated().begin();
+       it != devices->GetListDeprecated().end(); ++it) {
     base::DictionaryValue* dict_value;
     if (!it->GetAsDictionary(&dict_value)) {
       continue;
@@ -165,8 +166,8 @@
     return;
   }
 
-  for (auto it = devices->GetList().begin(); it != devices->GetList().end();
-       ++it) {
+  for (auto it = devices->GetListDeprecated().begin();
+       it != devices->GetListDeprecated().end(); ++it) {
     base::DictionaryValue* dict_value;
     if (!it->GetAsDictionary(&dict_value)) {
       continue;
@@ -254,7 +255,7 @@
     return result;
   }
 
-  for (const auto& entry : devices->GetList()) {
+  for (const auto& entry : devices->GetListDeprecated()) {
     const base::DictionaryValue* entry_dict;
     if (entry.GetAsDictionary(&entry_dict)) {
       scoped_refptr<DevicePermissionEntry> device_entry =
diff --git a/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc b/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc
index 68d7f5d..40f1375 100644
--- a/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc
+++ b/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc
@@ -107,8 +107,8 @@
       return;
     }
     ASSERT_TRUE(event->event_args);
-    ASSERT_TRUE(!event->event_args->GetList().empty());
-    const base::Value& arg_value = event->event_args->GetList()[0];
+    ASSERT_TRUE(!event->event_args->GetListDeprecated().empty());
+    const base::Value& arg_value = event->event_args->GetListDeprecated()[0];
 
     std::unique_ptr<extensions::api::lock_screen_data::DataItemsAvailableEvent>
         event_args = extensions::api::lock_screen_data::
diff --git a/extensions/browser/api/socket/socket_apitest.cc b/extensions/browser/api/socket/socket_apitest.cc
index dfc12ac..24a0aa5b 100644
--- a/extensions/browser/api/socket/socket_apitest.cc
+++ b/extensions/browser/api/socket/socket_apitest.cc
@@ -65,7 +65,7 @@
   // If we're invoking socket tests, all we can confirm is that we have at
   // least one address, but not what it is.
   ASSERT_TRUE(result->is_list());
-  ASSERT_GT(result->GetList().size(), 0U);
+  ASSERT_GT(result->GetListDeprecated().size(), 0U);
 }
 
 }  //  namespace extensions
diff --git a/extensions/browser/api/system_network/system_network_api_unittest.cc b/extensions/browser/api/system_network/system_network_api_unittest.cc
index 5b75d6d7..fc051f2 100644
--- a/extensions/browser/api/system_network/system_network_api_unittest.cc
+++ b/extensions/browser/api/system_network/system_network_api_unittest.cc
@@ -42,9 +42,9 @@
   // All we can confirm is that we have at least one address, but not what it
   // is.
   base::ListValue* value = static_cast<base::ListValue*>(result.get());
-  ASSERT_TRUE(value->GetList().size() > 0);
+  ASSERT_TRUE(value->GetListDeprecated().size() > 0);
 
-  for (const auto& network_interface_value : value->GetList()) {
+  for (const auto& network_interface_value : value->GetListDeprecated()) {
     NetworkInterface network_interface;
     ASSERT_TRUE(NetworkInterface::Populate(network_interface_value,
                                            &network_interface));
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 62835b1..7448333 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -292,7 +292,8 @@
     *out_value = value->GetString();
   } else if (binary_value) {
     if (!binary_value->is_list() ||
-        !helpers::CharListToString(binary_value->GetList(), out_value)) {
+        !helpers::CharListToString(binary_value->GetListDeprecated(),
+                                   out_value)) {
       return false;
     }
   }
@@ -2176,7 +2177,7 @@
     modified_headers->Append(
         helpers::CreateHeaderDictionary(iter.name(), iter.value()));
   }
-  if (!modified_headers->GetList().empty()) {
+  if (!modified_headers->GetListDeprecated().empty()) {
     details->Set(activity_log::kModifiedRequestHeadersKey,
                  std::move(modified_headers));
   }
@@ -2185,7 +2186,7 @@
   for (const std::string& header : delta.deleted_request_headers) {
     deleted_headers->Append(header);
   }
-  if (!deleted_headers->GetList().empty()) {
+  if (!deleted_headers->GetListDeprecated().empty()) {
     details->Set(activity_log::kDeletedRequestHeadersKey,
                  std::move(deleted_headers));
   }
@@ -2800,7 +2801,7 @@
       }
       EXTENSION_FUNCTION_VALIDATE(headers_value);
 
-      for (const base::Value& elem : headers_value->GetList()) {
+      for (const base::Value& elem : headers_value->GetListDeprecated()) {
         EXTENSION_FUNCTION_VALIDATE(elem.is_dict());
         const base::DictionaryValue& header_value =
             base::Value::AsDictionaryValue(elem);
diff --git a/extensions/browser/api_test_utils.cc b/extensions/browser/api_test_utils.cc
index a0828ac..886dbef 100644
--- a/extensions/browser/api_test_utils.cc
+++ b/extensions/browser/api_test_utils.cc
@@ -137,8 +137,9 @@
   EXPECT_TRUE(function->GetError().empty()) << "Unexpected error: "
                                             << function->GetError();
   if (function->GetResultList() &&
-      !function->GetResultList()->GetList().empty()) {
-    const base::Value& single_result = function->GetResultList()->GetList()[0];
+      !function->GetResultList()->GetListDeprecated().empty()) {
+    const base::Value& single_result =
+        function->GetResultList()->GetListDeprecated()[0];
     return single_result.CreateDeepCopy();
   }
   return nullptr;
@@ -182,7 +183,8 @@
   // is no specified result.
   const base::ListValue* results = function->GetResultList();
   CHECK(results);
-  EXPECT_TRUE(results->GetList().empty()) << "Did not expect a result";
+  EXPECT_TRUE(results->GetListDeprecated().empty())
+      << "Did not expect a result";
   CHECK(function->response_type());
   EXPECT_EQ(ExtensionFunction::FAILED, *function->response_type());
   return function->GetError();
diff --git a/extensions/browser/computed_hashes.cc b/extensions/browser/computed_hashes.cc
index 3bb3395..11134b7 100644
--- a/extensions/browser/computed_hashes.cc
+++ b/extensions/browser/computed_hashes.cc
@@ -134,7 +134,7 @@
   }
 
   ComputedHashes::Data data;
-  for (const base::Value& file_hash : all_hashes->GetList()) {
+  for (const base::Value& file_hash : all_hashes->GetListDeprecated()) {
     if (!file_hash.is_dict()) {
       *status = Status::PARSE_FAILED;
       return absl::nullopt;
@@ -170,7 +170,7 @@
         base::FilePath::FromUTF8Unsafe(*relative_path_utf8);
     std::vector<std::string> hashes;
 
-    for (const base::Value& value : block_hashes->GetList()) {
+    for (const base::Value& value : block_hashes->GetListDeprecated()) {
       if (!value.is_string()) {
         *status = Status::PARSE_FAILED;
         return absl::nullopt;
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc
index 310eef0..3b6f27b 100644
--- a/extensions/browser/event_router.cc
+++ b/extensions/browser/event_router.cc
@@ -732,7 +732,7 @@
     return events;
   }
 
-  for (const base::Value& event_val : events_value->GetList()) {
+  for (const base::Value& event_val : events_value->GetListDeprecated()) {
     const std::string* event = event_val.GetIfString();
     if (event)
       events.insert(*event);
@@ -782,7 +782,7 @@
     return;
   }
   filter_list->EraseListIter(
-      base::ranges::find(filter_list->GetList(), *filter));
+      base::ranges::find(filter_list->GetListDeprecated(), *filter));
 }
 
 const DictionaryValue* EventRouter::GetFilteredEvents(
diff --git a/extensions/browser/event_router.h b/extensions/browser/event_router.h
index e4b87de..62def67 100644
--- a/extensions/browser/event_router.h
+++ b/extensions/browser/event_router.h
@@ -342,6 +342,8 @@
       UpdateHostAccess_UnrequestedHostsDispatchUpdateEvents);
   FRIEND_TEST_ALL_PREFIXES(DeveloperPrivateApiUnitTest,
                            ExtensionUpdatedEventOnPermissionsChange);
+  FRIEND_TEST_ALL_PREFIXES(DeveloperPrivateApiUnitTest,
+                           OnUserSiteSettingsChanged);
   FRIEND_TEST_ALL_PREFIXES(DeveloperPrivateApiAllowlistUnitTest,
                            ExtensionUpdatedEventOnAllowlistWarningChange);
   FRIEND_TEST_ALL_PREFIXES(StorageApiUnittest, StorageAreaOnChanged);
diff --git a/extensions/browser/event_router_unittest.cc b/extensions/browser/event_router_unittest.cc
index 06239111..65383ba 100644
--- a/extensions/browser/event_router_unittest.cc
+++ b/extensions/browser/event_router_unittest.cc
@@ -236,7 +236,7 @@
       return false;
     }
 
-    for (const base::Value& filter : filter_list->GetList()) {
+    for (const base::Value& filter : filter_list->GetListDeprecated()) {
       if (!filter.is_dict()) {
         ADD_FAILURE();
         return false;
diff --git a/extensions/browser/extension_event_histogram_value.h b/extensions/browser/extension_event_histogram_value.h
index 309f39e..2e835fd8 100644
--- a/extensions/browser/extension_event_histogram_value.h
+++ b/extensions/browser/extension_event_histogram_value.h
@@ -507,6 +507,8 @@
   INPUT_METHOD_PRIVATE_ON_TOUCH = 485,
   WEB_AUTHENTICATION_PROXY_ON_CREATE_REQUEST = 486,
   WEB_AUTHENTICATION_PROXY_REQUEST_CANCELLED = 487,
+  WEB_AUTHENTICATION_PROXY_ON_GET_REQUEST = 488,
+  DEVELOPER_PRIVATE_ON_USER_SITE_SETTINGS_CHANGED = 489,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h
index d276a1fb..4033e96 100644
--- a/extensions/browser/extension_function_histogram_value.h
+++ b/extensions/browser/extension_function_histogram_value.h
@@ -1682,6 +1682,7 @@
   AUTOTESTPRIVATE_STARTARC = 1619,
   AUTOTESTPRIVATE_STOPARC = 1620,
   PASSWORDSPRIVATE_MUTEINSECURECREDENTIAL = 1621,
+  WEB_AUTHENTICATION_PROXY_COMPLETE_GET_REQUEST = 1622,
   // Last entry: Add new entries above, then run:
   // python tools/metrics/histograms/update_extension_histograms.py
   ENUM_BOUNDARY
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc
index 4c0d7e90..ee844a6 100644
--- a/extensions/browser/extension_prefs.cc
+++ b/extensions/browser/extension_prefs.cc
@@ -2097,7 +2097,7 @@
     return absl::nullopt;
 
   DCHECK(ids_value);
-  for (const base::Value& id_value : ids_value->GetList()) {
+  for (const base::Value& id_value : ids_value->GetListDeprecated()) {
     if (!id_value.is_int())
       return absl::nullopt;
 
@@ -2297,7 +2297,7 @@
 
   std::insert_iterator<ExtensionIdContainer> insert_iterator(
       *id_container_out, id_container_out->end());
-  for (const auto& entry : user_pref_value->GetList()) {
+  for (const auto& entry : user_pref_value->GetListDeprecated()) {
     if (!entry.is_string()) {
       NOTREACHED();
       continue;
@@ -2661,7 +2661,7 @@
   ListPrefUpdate update(prefs_, kExternalUninstalls);
   base::Value* current_ids = update.Get();
   for (const auto& id : uninstalled_ids) {
-    base::Value::ListView list = current_ids->GetList();
+    base::Value::ListView list = current_ids->GetListDeprecated();
     auto existing_entry =
         std::find_if(list.begin(), list.end(), [&id](const base::Value& value) {
           return value.is_string() && value.GetString() == id;
@@ -2733,7 +2733,7 @@
     const std::string& extension_id) {
   ListPrefUpdate update(prefs_, pref_names::kDeletedComponentExtensions);
   base::Value* current_ids = update.Get();
-  base::Value::ListView list = current_ids->GetList();
+  base::Value::ListView list = current_ids->GetListDeprecated();
   auto existing_entry = std::find_if(
       list.begin(), list.end(), [&extension_id](const base::Value& value) {
         return value.is_string() && value.GetString() == extension_id;
@@ -2746,7 +2746,7 @@
     const ManifestLocation location) {
   ListPrefUpdate update(prefs_, pref_names::kDeletedComponentExtensions);
   base::Value* current_ids = update.Get();
-  base::Value::ListView list = current_ids->GetList();
+  base::Value::ListView list = current_ids->GetListDeprecated();
   auto existing_entry = std::find_if(
       list.begin(), list.end(), [&extension_id](const base::Value& value) {
         return value.is_string() && value.GetString() == extension_id;
diff --git a/extensions/browser/notification_types.h b/extensions/browser/notification_types.h
index c06952b..b84df03 100644
--- a/extensions/browser/notification_types.h
+++ b/extensions/browser/notification_types.h
@@ -53,12 +53,6 @@
   // TODO(https://crbug.com/1174734): Remove.
   NOTIFICATION_EXTENSION_INSTALL_ERROR,
 
-  // Sent when an bookmarks extensions API function was successfully invoked.
-  // The source is the id of the extension that invoked the function, and the
-  // details are a pointer to the const BookmarksFunction in question.
-  // TODO(https://crbug.com/1174748): Remove.
-  NOTIFICATION_EXTENSION_BOOKMARKS_API_INVOKED,
-
   // Sent when the extension updater starts checking for updates to installed
   // extensions. The source is a BrowserContext*, and there are no details.
   // TODO(https://crbug.com/1174753): Remove.
diff --git a/extensions/browser/permissions_manager.cc b/extensions/browser/permissions_manager.cc
index 4fce051..fa358fe 100644
--- a/extensions/browser/permissions_manager.cc
+++ b/extensions/browser/permissions_manager.cc
@@ -71,7 +71,7 @@
   if (!list)
     return sites;
 
-  for (const auto& site : list->GetList()) {
+  for (const auto& site : list->GetListDeprecated()) {
     const std::string* site_as_string = site.GetIfString();
     if (!site_as_string)
       continue;
@@ -175,18 +175,16 @@
     return;
 
   // Origin cannot be both restricted and permitted.
-  RemoveUserPermittedSite(origin);
+  RemovePermittedSiteAndUpdatePrefs(origin);
 
   user_permissions_.restricted_sites.insert(origin);
   AddSiteToPrefs(extension_prefs_, kRestrictedSites, origin);
+  SignalUserPermissionsSettingsChanged();
 }
 
 void PermissionsManager::RemoveUserRestrictedSite(const url::Origin& origin) {
-  if (!base::Contains(user_permissions_.restricted_sites, origin))
-    return;
-
-  user_permissions_.restricted_sites.erase(origin);
-  RemoveSiteFromPrefs(extension_prefs_, kRestrictedSites, origin);
+  if (RemoveRestrictedSiteAndUpdatePrefs(origin))
+    SignalUserPermissionsSettingsChanged();
 }
 
 void PermissionsManager::AddUserPermittedSite(const url::Origin& origin) {
@@ -194,23 +192,52 @@
     return;
 
   // Origin cannot be both restricted and permitted.
-  RemoveUserRestrictedSite(origin);
+  RemoveRestrictedSiteAndUpdatePrefs(origin);
 
   user_permissions_.permitted_sites.insert(origin);
   AddSiteToPrefs(extension_prefs_, kPermittedSites, origin);
+  SignalUserPermissionsSettingsChanged();
 }
 
 void PermissionsManager::RemoveUserPermittedSite(const url::Origin& origin) {
-  if (!base::Contains(user_permissions_.permitted_sites, origin))
-    return;
-
-  user_permissions_.permitted_sites.erase(origin);
-  RemoveSiteFromPrefs(extension_prefs_, kPermittedSites, origin);
+  if (RemovePermittedSiteAndUpdatePrefs(origin))
+    SignalUserPermissionsSettingsChanged();
 }
 
 const PermissionsManager::UserPermissionsSettings&
-PermissionsManager::GetUserPermissionsSettings() {
+PermissionsManager::GetUserPermissionsSettings() const {
   return user_permissions_;
 }
 
+void PermissionsManager::AddObserver(Observer* observer) {
+  observers_.AddObserver(observer);
+}
+
+void PermissionsManager::RemoveObserver(Observer* observer) {
+  observers_.RemoveObserver(observer);
+}
+
+void PermissionsManager::SignalUserPermissionsSettingsChanged() const {
+  for (auto& observer : observers_)
+    observer.UserPermissionsSettingsChanged(GetUserPermissionsSettings());
+}
+
+bool PermissionsManager::RemovePermittedSiteAndUpdatePrefs(
+    const url::Origin& origin) {
+  bool removed_site = user_permissions_.permitted_sites.erase(origin);
+  if (removed_site)
+    RemoveSiteFromPrefs(extension_prefs_, kPermittedSites, origin);
+
+  return removed_site;
+}
+
+bool PermissionsManager::RemoveRestrictedSiteAndUpdatePrefs(
+    const url::Origin& origin) {
+  bool removed_site = user_permissions_.restricted_sites.erase(origin);
+  if (removed_site)
+    RemoveSiteFromPrefs(extension_prefs_, kRestrictedSites, origin);
+
+  return removed_site;
+}
+
 }  // namespace extensions
diff --git a/extensions/browser/permissions_manager.h b/extensions/browser/permissions_manager.h
index 4da6d59..e61ab705 100644
--- a/extensions/browser/permissions_manager.h
+++ b/extensions/browser/permissions_manager.h
@@ -7,6 +7,8 @@
 
 #include <set>
 
+#include "base/memory/raw_ptr.h"
+#include "base/observer_list.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "url/origin.h"
 
@@ -50,6 +52,12 @@
     std::set<url::Origin> permitted_sites;
   };
 
+  class Observer {
+   public:
+    virtual void UserPermissionsSettingsChanged(
+        const UserPermissionsSettings& settings) {}
+  };
+
   explicit PermissionsManager(content::BrowserContext* browser_context);
   ~PermissionsManager() override;
   PermissionsManager(const PermissionsManager&) = delete;
@@ -70,7 +78,7 @@
   void AddUserRestrictedSite(const url::Origin& origin);
 
   // Removes `origin` from the list of sites the user has blocked all
-  // extensions from running on.
+  // extensions from running on and notifies observers.
   void RemoveUserRestrictedSite(const url::Origin& origin);
 
   // Adds `origin` to the list of sites the user has allowed all
@@ -79,13 +87,31 @@
   void AddUserPermittedSite(const url::Origin& origin);
 
   // Removes `origin` from the list of sites the user has allowed all
-  // extensions to run on.
+  // extensions to run on and notifies observers.
   void RemoveUserPermittedSite(const url::Origin& origin);
 
   // Returns the user's permission settings.
-  const UserPermissionsSettings& GetUserPermissionsSettings();
+  const UserPermissionsSettings& GetUserPermissionsSettings() const;
+
+  // Adds or removes observers.
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
 
  private:
+  // Called whenever `user_permissions_` have changed.
+  void SignalUserPermissionsSettingsChanged() const;
+
+  // Removes `origin` from the list of sites the user has allowed all
+  // extensions to run on and saves the change to `extension_prefs_`. Returns if
+  // the site has been removed.
+  bool RemovePermittedSiteAndUpdatePrefs(const url::Origin& origin);
+
+  // Removes `origin` from the list of sites the user has blocked all
+  // extensions from running on and saves the change to `extension_prefs_`.
+  // Returns if the site has been removed.
+  bool RemoveRestrictedSiteAndUpdatePrefs(const url::Origin& origin);
+
+  base::ObserverList<Observer>::Unchecked observers_;
   ExtensionPrefs* const extension_prefs_;
   UserPermissionsSettings user_permissions_;
 };
diff --git a/extensions/browser/quota_service_unittest.cc b/extensions/browser/quota_service_unittest.cc
index 1369d92..deecc6d9 100644
--- a/extensions/browser/quota_service_unittest.cc
+++ b/extensions/browser/quota_service_unittest.cc
@@ -43,7 +43,7 @@
   void GetBucketsForArgs(const base::Value* args,
                          BucketList* buckets) override {
     ASSERT_TRUE(args->is_list());
-    for (const auto& val : args->GetList()) {
+    for (const auto& val : args->GetListDeprecated()) {
       absl::optional<int> id = val.GetIfInt();
       ASSERT_TRUE(id.has_value());
       if (buckets_.find(*id) == buckets_.end())
diff --git a/extensions/browser/verified_contents.cc b/extensions/browser/verified_contents.cc
index 67bb70c..b982a79 100644
--- a/extensions/browser/verified_contents.cc
+++ b/extensions/browser/verified_contents.cc
@@ -143,7 +143,7 @@
   if (!hashes_list)
     return nullptr;
 
-  for (const base::Value& hashes : hashes_list->GetList()) {
+  for (const base::Value& hashes : hashes_list->GetListDeprecated()) {
     if (!hashes.is_dict())
       return nullptr;
 
@@ -167,7 +167,7 @@
     if (!files)
       return nullptr;
 
-    for (const base::Value& data : files->GetList()) {
+    for (const base::Value& data : files->GetListDeprecated()) {
       if (!data.is_dict())
         return nullptr;
 
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json
index 87381229..dbd9ee9 100644
--- a/extensions/common/api/_api_features.json
+++ b/extensions/common/api/_api_features.json
@@ -485,7 +485,7 @@
     ],
     "matches": ["<all_urls>"]
   },{
-    "channel": "dev",
+    "channel": "stable",
     "contexts": ["webui_untrusted"],
     "matches": [
       // Allow only terminal_ssh.html in Terminal System Web App.
@@ -555,7 +555,7 @@
       "chrome://file-manager/*"
     ]
   },{
-    "channel": "dev",
+    "channel": "stable",
     "contexts": ["webui_untrusted"],
     "matches": [
       // Allow only terminal_ssh.html in Terminal System Web App.
diff --git a/extensions/common/event_matcher.cc b/extensions/common/event_matcher.cc
index a56b567..2d0818f26 100644
--- a/extensions/common/event_matcher.cc
+++ b/extensions/common/event_matcher.cc
@@ -60,7 +60,7 @@
 int EventMatcher::GetURLFilterCount() const {
   base::ListValue* url_filters = nullptr;
   if (filter_->GetList(kUrlFiltersKey, &url_filters))
-    return url_filters->GetList().size();
+    return url_filters->GetListDeprecated().size();
   return 0;
 }
 
@@ -68,7 +68,7 @@
                                 const base::DictionaryValue** url_filter_out) {
   base::ListValue* url_filters = nullptr;
   if (filter_->GetList(kUrlFiltersKey, &url_filters)) {
-    base::Value& dict = url_filters->GetList()[i];
+    base::Value& dict = url_filters->GetListDeprecated()[i];
     if (!dict.is_dict()) {
       return false;
     }
@@ -97,14 +97,14 @@
 int EventMatcher::GetWindowTypeCount() const {
   base::ListValue* window_type_filters = nullptr;
   if (filter_->GetList(kWindowTypesKey, &window_type_filters))
-    return window_type_filters->GetList().size();
+    return window_type_filters->GetListDeprecated().size();
   return 0;
 }
 
 bool EventMatcher::GetWindowType(int i, std::string* window_type_out) const {
   base::ListValue* window_types = nullptr;
   if (filter_->GetList(kWindowTypesKey, &window_types)) {
-    base::Value::ConstListView types_list = window_types->GetList();
+    base::Value::ConstListView types_list = window_types->GetListDeprecated();
     if (i >= 0 && static_cast<size_t>(i) < types_list.size() &&
         types_list[i].is_string()) {
       *window_type_out = types_list[i].GetString();
diff --git a/extensions/common/extension.cc b/extensions/common/extension.cc
index 731da16d..40d6346 100644
--- a/extensions/common/extension.cc
+++ b/extensions/common/extension.cc
@@ -737,7 +737,8 @@
     *error = base::ASCIIToUTF16(list_error);
     return false;
   }
-  base::Value::ConstListView pattern_list = temp_pattern_value->GetList();
+  base::Value::ConstListView pattern_list =
+      temp_pattern_value->GetListDeprecated();
   for (size_t i = 0; i < pattern_list.size(); ++i) {
     std::string pattern_string;
     if (pattern_list[i].is_string()) {
diff --git a/extensions/common/extension_api.cc b/extensions/common/extension_api.cc
index b13bcc21..318ec9e0a 100644
--- a/extensions/common/extension_api.cc
+++ b/extensions/common/extension_api.cc
@@ -56,7 +56,7 @@
 const base::DictionaryValue* FindListItem(const base::ListValue* list,
                                           const std::string& property_name,
                                           const std::string& property_value) {
-  for (const base::Value& item_value : list->GetList()) {
+  for (const base::Value& item_value : list->GetListDeprecated()) {
     CHECK(item_value.is_dict()) << property_value << "/" << property_name;
     const base::DictionaryValue* item =
         static_cast<const base::DictionaryValue*>(&item_value);
diff --git a/extensions/common/extension_l10n_util.cc b/extensions/common/extension_l10n_util.cc
index cd832fb..4a78bf9 100644
--- a/extensions/common/extension_l10n_util.cc
+++ b/extensions/common/extension_l10n_util.cc
@@ -129,7 +129,7 @@
     return true;
 
   bool ret = true;
-  base::Value::ListView list_view = list->GetList();
+  base::Value::ListView list_view = list->GetListDeprecated();
   for (size_t i = 0; i < list_view.size(); ++i) {
     if (list_view[i].is_string()) {
       std::string result = list_view[i].GetString();
@@ -270,7 +270,7 @@
 
   base::ListValue* file_handlers = NULL;
   if (manifest->GetList(keys::kFileBrowserHandlers, &file_handlers)) {
-    for (base::Value& handler : file_handlers->GetList()) {
+    for (base::Value& handler : file_handlers->GetListDeprecated()) {
       if (!handler.is_dict()) {
         *error = errors::kInvalidFileBrowserHandler;
         return false;
@@ -284,7 +284,7 @@
   // Initialize all input_components
   base::ListValue* input_components = NULL;
   if (manifest->GetList(keys::kInputComponents, &input_components)) {
-    for (base::Value& module : input_components->GetList()) {
+    for (base::Value& module : input_components->GetListDeprecated()) {
       if (!module.is_dict()) {
         *error = errors::kInvalidInputComponents;
         return false;
diff --git a/extensions/common/extension_l10n_util_unittest.cc b/extensions/common/extension_l10n_util_unittest.cc
index a4fcc1f..7f52ae23 100644
--- a/extensions/common/extension_l10n_util_unittest.cc
+++ b/extensions/common/extension_l10n_util_unittest.cc
@@ -530,7 +530,7 @@
   base::ListValue* handlers_raw = nullptr;
   manifest.GetList(keys::kFileBrowserHandlers, &handlers_raw);
   base::DictionaryValue* handler_raw = nullptr;
-  handlers_raw->GetList()[0].GetAsDictionary(&handler_raw);
+  handlers_raw->GetListDeprecated()[0].GetAsDictionary(&handler_raw);
   ASSERT_TRUE(handler_raw->GetString(keys::kActionDefaultTitle, &result));
   EXPECT_EQ("file handler title", result);
 
@@ -668,7 +668,7 @@
   base::ListValue* startup_pages_raw = nullptr;
   ASSERT_TRUE(manifest.GetList(keys::kOverrideStartupPage, &startup_pages_raw));
   base::Value::ConstListView startup_pages_raw_list =
-      startup_pages_raw->GetList();
+      startup_pages_raw->GetListDeprecated();
   ASSERT_GT(startup_pages_raw_list.size(), 0u);
   ASSERT_TRUE(startup_pages_raw_list[0].is_string());
   EXPECT_EQ("http://www.foo.de", startup_pages_raw_list[0].GetString());
diff --git a/extensions/common/manifest_handlers/action_handlers_handler.cc b/extensions/common/manifest_handlers/action_handlers_handler.cc
index 7db5ab56..17378724 100644
--- a/extensions/common/manifest_handlers/action_handlers_handler.cc
+++ b/extensions/common/manifest_handlers/action_handlers_handler.cc
@@ -50,7 +50,7 @@
   }
 
   auto info = std::make_unique<ActionHandlersInfo>();
-  for (const base::Value& wrapped_value : entries->GetList()) {
+  for (const base::Value& wrapped_value : entries->GetListDeprecated()) {
     std::string value;
     bool enabled_on_lock_screen = false;
     if (wrapped_value.is_dict()) {
diff --git a/extensions/common/manifest_handlers/app_isolation_info.cc b/extensions/common/manifest_handlers/app_isolation_info.cc
index 86c364ea..f29bdef 100644
--- a/extensions/common/manifest_handlers/app_isolation_info.cc
+++ b/extensions/common/manifest_handlers/app_isolation_info.cc
@@ -69,7 +69,7 @@
   }
 
   bool has_isolated_storage = false;
-  base::Value::ConstListView list_view = isolation_list->GetList();
+  base::Value::ConstListView list_view = isolation_list->GetListDeprecated();
   for (size_t i = 0; i < list_view.size(); ++i) {
     if (!list_view[i].is_string()) {
       *error = ErrorUtils::FormatErrorMessageUTF16(
diff --git a/extensions/common/manifest_handlers/background_info.cc b/extensions/common/manifest_handlers/background_info.cc
index 469444c..eae899d 100644
--- a/extensions/common/manifest_handlers/background_info.cc
+++ b/extensions/common/manifest_handlers/background_info.cc
@@ -187,7 +187,7 @@
   }
 
   base::Value::ConstListView background_scripts =
-      background_scripts_value->GetList();
+      background_scripts_value->GetListDeprecated();
   for (size_t i = 0; i < background_scripts.size(); ++i) {
     if (!background_scripts[i].is_string()) {
       *error = ErrorUtils::FormatErrorMessageUTF16(
diff --git a/extensions/common/manifest_handlers/file_handler_info.cc b/extensions/common/manifest_handlers/file_handler_info.cc
index d9ae6e7..c023aad5 100644
--- a/extensions/common/manifest_handlers/file_handler_info.cc
+++ b/extensions/common/manifest_handlers/file_handler_info.cc
@@ -106,8 +106,8 @@
     }
   }
 
-  if ((!mime_types || mime_types->GetList().empty()) &&
-      (!file_extensions || file_extensions->GetList().empty()) &&
+  if ((!mime_types || mime_types->GetListDeprecated().empty()) &&
+      (!file_extensions || file_extensions->GetListDeprecated().empty()) &&
       !handler.include_directories) {
     *error = ErrorUtils::FormatErrorMessageUTF16(
         errors::kInvalidFileHandlerNoTypeOrExtension,
@@ -116,7 +116,7 @@
   }
 
   if (mime_types) {
-    base::Value::ConstListView list_storage = mime_types->GetList();
+    base::Value::ConstListView list_storage = mime_types->GetListDeprecated();
     for (size_t i = 0; i < list_storage.size(); ++i) {
       if (!list_storage[i].is_string()) {
         *error = ErrorUtils::FormatErrorMessageUTF16(
@@ -129,7 +129,8 @@
   }
 
   if (file_extensions) {
-    base::Value::ConstListView list_storage = file_extensions->GetList();
+    base::Value::ConstListView list_storage =
+        file_extensions->GetListDeprecated();
     for (size_t i = 0; i < list_storage.size(); ++i) {
       if (!list_storage[i].is_string()) {
         *error = ErrorUtils::FormatErrorMessageUTF16(
diff --git a/extensions/common/manifest_handlers/kiosk_mode_info.cc b/extensions/common/manifest_handlers/kiosk_mode_info.cc
index e84e306..79f6adab 100644
--- a/extensions/common/manifest_handlers/kiosk_mode_info.cc
+++ b/extensions/common/manifest_handlers/kiosk_mode_info.cc
@@ -149,7 +149,7 @@
     const bool allow_enabled_on_launch =
         AllowSecondaryAppEnabledOnLaunch(extension);
 
-    for (const auto& value : secondary_apps_value->GetList()) {
+    for (const auto& value : secondary_apps_value->GetListDeprecated()) {
       std::unique_ptr<KioskSecondaryAppsType> app =
           KioskSecondaryAppsType::FromValue(value, error);
       if (!app) {
diff --git a/extensions/common/manifest_handlers/mime_types_handler.cc b/extensions/common/manifest_handlers/mime_types_handler.cc
index a74df21..cf432ff4 100644
--- a/extensions/common/manifest_handlers/mime_types_handler.cc
+++ b/extensions/common/manifest_handlers/mime_types_handler.cc
@@ -149,7 +149,7 @@
 
   auto info = std::make_unique<MimeTypesHandlerInfo>();
   info->handler_.set_extension_id(extension->id());
-  for (const auto& entry : mime_types_value->GetList()) {
+  for (const auto& entry : mime_types_value->GetListDeprecated()) {
     if (!entry.is_string()) {
       *error = errors::kInvalidMIMETypes;
       return false;
diff --git a/extensions/common/manifest_handlers/nacl_modules_handler.cc b/extensions/common/manifest_handlers/nacl_modules_handler.cc
index 0a2327e7..0df0768a1 100644
--- a/extensions/common/manifest_handlers/nacl_modules_handler.cc
+++ b/extensions/common/manifest_handlers/nacl_modules_handler.cc
@@ -52,7 +52,7 @@
 
   std::unique_ptr<NaClModuleData> nacl_module_data(new NaClModuleData);
 
-  base::Value::ConstListView list_view = list_value->GetList();
+  base::Value::ConstListView list_view = list_value->GetListDeprecated();
   for (size_t i = 0; i < list_view.size(); ++i) {
     if (!list_view[i].is_dict()) {
       *error = errors::kInvalidNaClModules;
diff --git a/extensions/common/manifest_handlers/permissions_parser.cc b/extensions/common/manifest_handlers/permissions_parser.cc
index 3738cda..9e3ca3e 100644
--- a/extensions/common/manifest_handlers/permissions_parser.cc
+++ b/extensions/common/manifest_handlers/permissions_parser.cc
@@ -102,7 +102,7 @@
   }
 
   // Add all permissions parsed from the manifest to |hosts|.
-  base::Value::ConstListView list_view = permissions->GetList();
+  base::Value::ConstListView list_view = permissions->GetListDeprecated();
   for (size_t i = 0; i < list_view.size(); ++i) {
     if (list_view[i].is_string()) {
       hosts->push_back(list_view[i].GetString());
diff --git a/extensions/common/manifest_handlers/sandboxed_page_info.cc b/extensions/common/manifest_handlers/sandboxed_page_info.cc
index 90e8cfc1..9064fa4 100644
--- a/extensions/common/manifest_handlers/sandboxed_page_info.cc
+++ b/extensions/common/manifest_handlers/sandboxed_page_info.cc
@@ -64,7 +64,7 @@
     return false;
   }
 
-  base::Value::ConstListView list_view = list_value->GetList();
+  base::Value::ConstListView list_view = list_value->GetListDeprecated();
   for (size_t i = 0; i < list_view.size(); ++i) {
     if (!list_view[i].is_string()) {
       *error = ErrorUtils::FormatErrorMessageUTF16(
diff --git a/extensions/common/manifest_handlers/webview_info.cc b/extensions/common/manifest_handlers/webview_info.cc
index 6642788..6c97bea 100644
--- a/extensions/common/manifest_handlers/webview_info.cc
+++ b/extensions/common/manifest_handlers/webview_info.cc
@@ -130,7 +130,8 @@
   }
 
   // The partition list must have at least one entry.
-  base::Value::ConstListView partition_list_view = partition_list->GetList();
+  base::Value::ConstListView partition_list_view =
+      partition_list->GetListDeprecated();
   if (partition_list_view.empty()) {
     *error = errors::kInvalidWebviewPartitionsList;
     return false;
@@ -160,7 +161,7 @@
     }
 
     // The URL list should have at least one entry.
-    base::Value::ConstListView url_list_view = url_list->GetList();
+    base::Value::ConstListView url_list_view = url_list->GetListDeprecated();
     if (url_list_view.empty()) {
       *error = errors::kInvalidWebviewAccessibleResourcesList;
       return false;
diff --git a/extensions/common/permissions/api_permission_set.cc b/extensions/common/permissions/api_permission_set.cc
index 2c32f9b..5cf79bf 100644
--- a/extensions/common/permissions/api_permission_set.cc
+++ b/extensions/common/permissions/api_permission_set.cc
@@ -102,7 +102,8 @@
       return true;
     }
 
-    base::Value::ConstListView list_view = permission_value->GetList();
+    base::Value::ConstListView list_view =
+        permission_value->GetListDeprecated();
     for (size_t i = 0; i < list_view.size(); ++i) {
       std::string permission_str;
       if (!list_view[i].is_string()) {
@@ -159,7 +160,7 @@
     // return true here anyway.
     return true;
   }
-  base::Value::ConstListView list_view = permissions->GetList();
+  base::Value::ConstListView list_view = permissions->GetListDeprecated();
   for (size_t i = 0; i < list_view.size(); ++i) {
     std::string permission_str;
     const base::Value* permission_value = nullptr;
diff --git a/extensions/common/permissions/manifest_permission_set.cc b/extensions/common/permissions/manifest_permission_set.cc
index eabacd93..3483230 100644
--- a/extensions/common/permissions/manifest_permission_set.cc
+++ b/extensions/common/permissions/manifest_permission_set.cc
@@ -62,7 +62,8 @@
     ManifestPermissionSet* manifest_permissions,
     std::u16string* error,
     std::vector<std::string>* unhandled_permissions) {
-  base::Value::ConstListView permissions_list = permissions->GetList();
+  base::Value::ConstListView permissions_list =
+      permissions->GetListDeprecated();
   for (size_t i = 0; i < permissions_list.size(); ++i) {
     const base::Value& value = permissions_list[i];
     std::string permission_name;
diff --git a/extensions/common/permissions/set_disjunction_permission.h b/extensions/common/permissions/set_disjunction_permission.h
index 64c22c6..9718a84 100644
--- a/extensions/common/permissions/set_disjunction_permission.h
+++ b/extensions/common/permissions/set_disjunction_permission.h
@@ -117,7 +117,7 @@
       return false;
     }
 
-    for (const base::Value& item_value : value->GetList()) {
+    for (const base::Value& item_value : value->GetListDeprecated()) {
       PermissionDataType data;
       if (data.FromValue(&item_value)) {
         data_set_.insert(data);
diff --git a/extensions/common/url_pattern_set.cc b/extensions/common/url_pattern_set.cc
index 01a5212..e6a63a1 100644
--- a/extensions/common/url_pattern_set.cc
+++ b/extensions/common/url_pattern_set.cc
@@ -238,7 +238,7 @@
   std::unique_ptr<base::ListValue> value(new base::ListValue);
   for (auto i = patterns_.cbegin(); i != patterns_.cend(); ++i) {
     base::Value pattern_str_value(i->GetAsString());
-    if (!base::Contains(value->GetList(), pattern_str_value))
+    if (!base::Contains(value->GetListDeprecated(), pattern_str_value))
       value->Append(std::move(pattern_str_value));
   }
   return value;
diff --git a/extensions/common/value_builder_unittest.cc b/extensions/common/value_builder_unittest.cc
index d856380..a44ba5b 100644
--- a/extensions/common/value_builder_unittest.cc
+++ b/extensions/common/value_builder_unittest.cc
@@ -30,11 +30,11 @@
   base::ListValue* list_value;
   ASSERT_TRUE(settings->GetList("permissions", &list_value));
 
-  ASSERT_EQ(2U, list_value->GetList().size());
-  ASSERT_TRUE(list_value->GetList()[0].is_string());
-  ASSERT_EQ(list_value->GetList()[0].GetString(), "tabs");
-  ASSERT_TRUE(list_value->GetList()[1].is_string());
-  ASSERT_EQ(list_value->GetList()[1].GetString(), "history");
+  ASSERT_EQ(2U, list_value->GetListDeprecated().size());
+  ASSERT_TRUE(list_value->GetListDeprecated()[0].is_string());
+  ASSERT_EQ(list_value->GetListDeprecated()[0].GetString(), "tabs");
+  ASSERT_TRUE(list_value->GetListDeprecated()[1].is_string());
+  ASSERT_EQ(list_value->GetListDeprecated()[1].GetString(), "history");
 }
 
 TEST(ValueBuilderTest, AppendList) {
diff --git a/extensions/renderer/bindings/api_binding.cc b/extensions/renderer/bindings/api_binding.cc
index de292082..a4caf7d 100644
--- a/extensions/renderer/bindings/api_binding.cc
+++ b/extensions/renderer/bindings/api_binding.cc
@@ -208,7 +208,7 @@
   // construction.
 
   if (function_definitions) {
-    for (const auto& func : function_definitions->GetList()) {
+    for (const auto& func : function_definitions->GetListDeprecated()) {
       const base::DictionaryValue* func_dict = nullptr;
       CHECK(func.GetAsDictionary(&func_dict));
       std::string name;
@@ -224,7 +224,7 @@
   }
 
   if (type_definitions) {
-    for (const auto& type : type_definitions->GetList()) {
+    for (const auto& type : type_definitions->GetListDeprecated()) {
       const base::DictionaryValue* type_dict = nullptr;
       CHECK(type.GetAsDictionary(&type_dict));
       std::string id;
@@ -249,7 +249,7 @@
       // them. Cache the function signatures in the type map.
       const base::ListValue* type_functions = nullptr;
       if (type_dict->GetList("functions", &type_functions)) {
-        for (const auto& func : type_functions->GetList()) {
+        for (const auto& func : type_functions->GetListDeprecated()) {
           const base::DictionaryValue* func_dict = nullptr;
           CHECK(func.GetAsDictionary(&func_dict));
           std::string function_name;
@@ -267,8 +267,8 @@
   }
 
   if (event_definitions) {
-    events_.reserve(event_definitions->GetList().size());
-    for (const auto& event : event_definitions->GetList()) {
+    events_.reserve(event_definitions->GetListDeprecated().size());
+    for (const auto& event : event_definitions->GetListDeprecated()) {
       const base::DictionaryValue* event_dict = nullptr;
       CHECK(event.GetAsDictionary(&event_dict));
       std::string name;
@@ -277,7 +277,7 @@
           base::StringPrintf("%s.%s", api_name_.c_str(), name.c_str());
       const base::ListValue* filters = nullptr;
       bool supports_filters = event_dict->GetList("filters", &filters) &&
-                              !filters->GetList().empty();
+                              !filters->GetListDeprecated().empty();
 
       std::vector<std::string> rule_actions;
       std::vector<std::string> rule_conditions;
@@ -303,7 +303,7 @@
                                       std::vector<std::string>* out_value) {
             const base::ListValue* list = nullptr;
             CHECK(options->GetList(name, &list));
-            for (const auto& entry : list->GetList()) {
+            for (const auto& entry : list->GetListDeprecated()) {
               DCHECK(entry.is_string());
               out_value->push_back(entry.GetString());
             }
@@ -461,7 +461,8 @@
       auto is_this_platform = [&this_platform](const base::Value& platform) {
         return platform.is_string() && platform.GetString() == this_platform;
       };
-      if (base::ranges::none_of(platforms->GetList(), is_this_platform))
+      if (base::ranges::none_of(platforms->GetListDeprecated(),
+                                is_this_platform))
         continue;
     }
 
diff --git a/extensions/renderer/bindings/api_request_handler.cc b/extensions/renderer/bindings/api_request_handler.cc
index e482e87..96112cad 100644
--- a/extensions/renderer/bindings/api_request_handler.cc
+++ b/extensions/renderer/bindings/api_request_handler.cc
@@ -65,8 +65,8 @@
         << "GetArguments() should only be called once.";
     std::unique_ptr<content::V8ValueConverter> converter =
         content::V8ValueConverter::Create();
-    v8_arguments_.reserve(base_arguments_->GetList().size());
-    for (const auto& arg : base_arguments_->GetList())
+    v8_arguments_.reserve(base_arguments_->GetListDeprecated().size());
+    for (const auto& arg : base_arguments_->GetListDeprecated())
       v8_arguments_.push_back(converter->ToV8Value(&arg, context));
   }
 
diff --git a/extensions/renderer/bindings/argument_spec.cc b/extensions/renderer/bindings/argument_spec.cc
index be91d910..e9ef1bf 100644
--- a/extensions/renderer/bindings/argument_spec.cc
+++ b/extensions/renderer/bindings/argument_spec.cc
@@ -97,10 +97,10 @@
   {
     const base::ListValue* choices = nullptr;
     if (dict->GetList("choices", &choices)) {
-      DCHECK(!choices->GetList().empty());
+      DCHECK(!choices->GetListDeprecated().empty());
       type_ = ArgumentType::CHOICES;
-      choices_.reserve(choices->GetList().size());
-      for (const auto& choice : choices->GetList())
+      choices_.reserve(choices->GetListDeprecated().size());
+      for (const auto& choice : choices->GetListDeprecated())
         choices_.push_back(std::make_unique<ArgumentSpec>(choice));
       return;
     }
@@ -176,10 +176,10 @@
     // always update this if need be.
     const base::ListValue* enums = nullptr;
     if (dict->GetList("enum", &enums)) {
-      size_t size = enums->GetList().size();
+      size_t size = enums->GetListDeprecated().size();
       CHECK_GT(size, 0u);
       for (size_t i = 0; i < size; ++i) {
-        const base::Value& value = enums->GetList()[i];
+        const base::Value& value = enums->GetListDeprecated()[i];
         const std::string* enum_str = value.GetIfString();
         // Enum entries come in two versions: a list of possible strings, and
         // a dictionary with a field 'name'.
diff --git a/extensions/renderer/chrome_setting.cc b/extensions/renderer/chrome_setting.cc
index d14fbe2..aa47b27 100644
--- a/extensions/renderer/chrome_setting.cc
+++ b/extensions/renderer/chrome_setting.cc
@@ -28,7 +28,8 @@
     APIEventHandler* event_handler,
     APITypeReferenceMap* type_refs,
     const BindingAccessChecker* access_checker) {
-  base::Value::ConstListView property_values_list = property_values->GetList();
+  base::Value::ConstListView property_values_list =
+      property_values->GetListDeprecated();
   CHECK_GE(property_values_list.size(), 2u);
   std::string pref_name = property_values_list[0u].GetString();
   const base::Value& value_spec = property_values_list[1u];
@@ -178,7 +179,8 @@
   }
 
   parse_result.arguments_list->Insert(
-      parse_result.arguments_list->GetList().begin(), base::Value(pref_name_));
+      parse_result.arguments_list->GetListDeprecated().begin(),
+      base::Value(pref_name_));
 
   v8::Local<v8::Promise> promise = request_handler_->StartRequest(
       context, full_name, std::move(parse_result.arguments_list),
diff --git a/extensions/renderer/content_setting.cc b/extensions/renderer/content_setting.cc
index abde896f..27c0496 100644
--- a/extensions/renderer/content_setting.cc
+++ b/extensions/renderer/content_setting.cc
@@ -59,7 +59,8 @@
     APIEventHandler* event_handler,
     APITypeReferenceMap* type_refs,
     const BindingAccessChecker* access_checker) {
-  base::Value::ConstListView property_values_list = property_values->GetList();
+  base::Value::ConstListView property_values_list =
+      property_values->GetListDeprecated();
   CHECK_GE(property_values_list.size(), 2u);
   std::string pref_name = property_values_list[0].GetString();
   const base::Value& value_spec = property_values_list[1u];
@@ -212,7 +213,8 @@
   }
 
   parse_result.arguments_list->Insert(
-      parse_result.arguments_list->GetList().begin(), base::Value(pref_name_));
+      parse_result.arguments_list->GetListDeprecated().begin(),
+      base::Value(pref_name_));
 
   v8::Local<v8::Promise> promise = request_handler_->StartRequest(
       context, "contentSettings." + method_name,
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc
index 306ec23..34b57743 100644
--- a/extensions/renderer/dispatcher.cc
+++ b/extensions/renderer/dispatcher.cc
@@ -157,7 +157,7 @@
       content::V8ValueConverter::Create();
 
   std::vector<v8::Local<v8::Value>> arguments;
-  for (const auto& arg : args->GetList()) {
+  for (const auto& arg : args->GetListDeprecated()) {
     arguments.push_back(converter->ToV8Value(&arg, context->v8_context()));
   }
 
diff --git a/extensions/renderer/storage_area.cc b/extensions/renderer/storage_area.cc
index 89ff6c8..ddeae275 100644
--- a/extensions/renderer/storage_area.cc
+++ b/extensions/renderer/storage_area.cc
@@ -304,7 +304,8 @@
   }
 
   parse_result.arguments_list->Insert(
-      parse_result.arguments_list->GetList().begin(), base::Value(name_));
+      parse_result.arguments_list->GetListDeprecated().begin(),
+      base::Value(name_));
 
   v8::Local<v8::Promise> promise = request_handler_->StartRequest(
       context, full_method_name, std::move(parse_result.arguments_list),
diff --git a/fuchsia/base/legacymetrics_user_event_recorder.cc b/fuchsia/base/legacymetrics_user_event_recorder.cc
index 4668c36e..f762c51 100644
--- a/fuchsia/base/legacymetrics_user_event_recorder.cc
+++ b/fuchsia/base/legacymetrics_user_event_recorder.cc
@@ -8,6 +8,7 @@
 
 #include "base/callback.h"
 #include "base/metrics/user_metrics.h"
+#include "base/time/time.h"
 
 namespace cr_fuchsia {
 
diff --git a/fuchsia/engine/browser/web_engine_memory_inspector.cc b/fuchsia/engine/browser/web_engine_memory_inspector.cc
index 3762ebf..09af6e28 100644
--- a/fuchsia/engine/browser/web_engine_memory_inspector.cc
+++ b/fuchsia/engine/browser/web_engine_memory_inspector.cc
@@ -26,8 +26,8 @@
     return {};
 
   std::vector<std::string> names;
-  names.reserve(names_list->GetList().size());
-  for (auto& name : names_list->GetList()) {
+  names.reserve(names_list->GetListDeprecated().size());
+  for (auto& name : names_list->GetListDeprecated()) {
     names.push_back(name.GetString());
   }
   return names;
diff --git a/fuchsia/engine/renderer/web_engine_audio_renderer_test.cc b/fuchsia/engine/renderer/web_engine_audio_renderer_test.cc
index 317a470..ee6bbf0f 100644
--- a/fuchsia/engine/renderer/web_engine_audio_renderer_test.cc
+++ b/fuchsia/engine/renderer/web_engine_audio_renderer_test.cc
@@ -39,7 +39,6 @@
     explicit ReadResult(const media::AudioDecoderConfig& config)
         : config(config) {}
 
-    media::Status status;
     absl::optional<media::AudioDecoderConfig> config;
     scoped_refptr<media::DecoderBuffer> buffer;
   };
diff --git a/fuchsia/runners/cast/cast_streaming.cc b/fuchsia/runners/cast/cast_streaming.cc
index a6e6630..4388dab 100644
--- a/fuchsia/runners/cast/cast_streaming.cc
+++ b/fuchsia/runners/cast/cast_streaming.cc
@@ -71,7 +71,7 @@
     return kCastStreamingMessagePortOrigin;
   }
 
-  for (const base::Value& app_id_value : app_id_list->GetList()) {
+  for (const base::Value& app_id_value : app_id_list->GetListDeprecated()) {
     if (!app_id_value.is_string()) {
       continue;
     }
diff --git a/google_apis/common/base_requests.cc b/google_apis/common/base_requests.cc
index 90105346..a9180b1 100644
--- a/google_apis/common/base_requests.cc
+++ b/google_apis/common/base_requests.cc
@@ -73,7 +73,7 @@
     // Returns the reason of the first error.
     const base::ListValue* errors = nullptr;
     if (error->GetListWithoutPathExpansion(kErrorErrorsKey, &errors)) {
-      const base::Value& first_error = errors->GetList()[0];
+      const base::Value& first_error = errors->GetListDeprecated()[0];
       if (first_error.is_dict()) {
         const std::string* reason = first_error.FindStringKey(kErrorReasonKey);
         if (reason)
diff --git a/google_apis/drive/drive_api_parser.cc b/google_apis/drive/drive_api_parser.cc
index 95c17b7..b3dec5a 100644
--- a/google_apis/drive/drive_api_parser.cc
+++ b/google_apis/drive/drive_api_parser.cc
@@ -54,9 +54,9 @@
     return false;
 
   base::JSONValueConverter<ParentReference> converter;
-  result->resize(value->GetList().size());
-  for (size_t i = 0; i < value->GetList().size(); ++i) {
-    const base::Value& parent_value = value->GetList()[i];
+  result->resize(value->GetListDeprecated().size());
+  for (size_t i = 0; i < value->GetListDeprecated().size(); ++i) {
+    const base::Value& parent_value = value->GetListDeprecated()[i];
     if (!converter.Convert(parent_value, &(*result)[i]))
       return false;
   }
diff --git a/google_apis/gaia/gaia_auth_util.cc b/google_apis/gaia/gaia_auth_util.cc
index 262cdaf..3af23ed 100644
--- a/google_apis/gaia/gaia_auth_util.cc
+++ b/google_apis/gaia/gaia_auth_util.cc
@@ -126,7 +126,7 @@
 
   if (!value->is_list())
     return false;
-  base::Value::ConstListView list = value->GetList();
+  base::Value::ConstListView list = value->GetListDeprecated();
   if (list.size() < 2u)
     return false;
 
diff --git a/google_apis/gaia/gaia_oauth_client_unittest.cc b/google_apis/gaia/gaia_oauth_client_unittest.cc
index e9301a5..e72b9f5 100644
--- a/google_apis/gaia/gaia_oauth_client_unittest.cc
+++ b/google_apis/gaia/gaia_oauth_client_unittest.cc
@@ -532,7 +532,7 @@
   FlushNetwork();
 
   auto capabilities =
-      captured_result->FindListKey("accountCapabilities")->GetList();
+      captured_result->FindListKey("accountCapabilities")->GetListDeprecated();
   ASSERT_EQ(capabilities.size(), 2U);
   EXPECT_EQ(*capabilities[0].FindStringKey("name"), "accountcapabilities/111");
   EXPECT_FALSE(*capabilities[0].FindBoolKey("booleanValue"));
diff --git a/google_apis/gaia/oauth2_id_token_decoder.cc b/google_apis/gaia/oauth2_id_token_decoder.cc
index 876647c..b4c124a 100644
--- a/google_apis/gaia/oauth2_id_token_decoder.cc
+++ b/google_apis/gaia/oauth2_id_token_decoder.cc
@@ -71,7 +71,7 @@
     VLOG(1) << "Missing service flags in the id_token";
     return false;
   }
-  for (const auto& flag_value : service_flags_value_raw->GetList()) {
+  for (const auto& flag_value : service_flags_value_raw->GetListDeprecated()) {
     const std::string& flag = flag_value.GetString();
     if (flag.size())
       out_service_flags->push_back(flag);
diff --git a/google_apis/gaia/oauth2_mint_token_flow.cc b/google_apis/gaia/oauth2_mint_token_flow.cc
index 7a0881b..27459ce 100644
--- a/google_apis/gaia/oauth2_mint_token_flow.cc
+++ b/google_apis/gaia/oauth2_mint_token_flow.cc
@@ -363,7 +363,7 @@
       resolution_dict->FindListKey("browserCookies");
   base::span<const base::Value> cookie_list;
   if (browser_cookies)
-    cookie_list = browser_cookies->GetList();
+    cookie_list = browser_cookies->GetListDeprecated();
 
   base::Time time_now = base::Time::Now();
   bool success = true;
diff --git a/google_apis/gaia/oauth2_mint_token_flow_unittest.cc b/google_apis/gaia/oauth2_mint_token_flow_unittest.cc
index bd71867..2b6e49a 100644
--- a/google_apis/gaia/oauth2_mint_token_flow_unittest.cc
+++ b/google_apis/gaia/oauth2_mint_token_flow_unittest.cc
@@ -477,7 +477,8 @@
   for (const auto* required_field : kRequiredFields) {
     std::unique_ptr<base::Value> json = ParseJson(kValidRemoteConsentResponse);
     base::Value::ListView cookies =
-        json->FindListPath("resolutionData.browserCookies")->GetList();
+        json->FindListPath("resolutionData.browserCookies")
+            ->GetListDeprecated();
     EXPECT_TRUE(cookies[0].RemoveKey(required_field));
     RemoteConsentResolutionData resolution_data;
     EXPECT_FALSE(OAuth2MintTokenFlow::ParseRemoteConsentResponse(
@@ -494,7 +495,8 @@
   for (const auto* optional_field : kOptionalFields) {
     std::unique_ptr<base::Value> json = ParseJson(kValidRemoteConsentResponse);
     base::Value::ListView cookies =
-        json->FindListPath("resolutionData.browserCookies")->GetList();
+        json->FindListPath("resolutionData.browserCookies")
+            ->GetListDeprecated();
     EXPECT_TRUE(cookies[0].RemoveKey(optional_field));
     RemoteConsentResolutionData resolution_data;
     EXPECT_TRUE(OAuth2MintTokenFlow::ParseRemoteConsentResponse(
@@ -509,7 +511,7 @@
        ParseRemoteConsentResponse_BadCookie_BadMaxAge) {
   std::unique_ptr<base::Value> json = ParseJson(kValidRemoteConsentResponse);
   base::Value::ListView cookies =
-      json->FindListPath("resolutionData.browserCookies")->GetList();
+      json->FindListPath("resolutionData.browserCookies")->GetListDeprecated();
   cookies[0].SetStringKey("maxAgeSeconds", "not-a-number");
   RemoteConsentResolutionData resolution_data;
   EXPECT_FALSE(OAuth2MintTokenFlow::ParseRemoteConsentResponse(
diff --git a/google_apis/gaia/oauth_multilogin_result.cc b/google_apis/gaia/oauth_multilogin_result.cc
index 3ff6c91a..0eca57b 100644
--- a/google_apis/gaia/oauth_multilogin_result.cc
+++ b/google_apis/gaia/oauth_multilogin_result.cc
@@ -74,7 +74,7 @@
     status_ = OAuthMultiloginResponseStatus::kUnknownStatus;
     return;
   }
-  for (auto& account : failed_accounts->GetList()) {
+  for (auto& account : failed_accounts->GetListDeprecated()) {
     const std::string* gaia_id = account.FindStringKey("obfuscated_id");
     const std::string* status = account.FindStringKey("status");
     if (status && gaia_id && *status != "OK")
@@ -92,7 +92,7 @@
     status_ = OAuthMultiloginResponseStatus::kUnknownStatus;
     return;
   }
-  for (const auto& cookie : cookie_list->GetList()) {
+  for (const auto& cookie : cookie_list->GetListDeprecated()) {
     const std::string* name = cookie.FindStringKey("name");
     const std::string* value = cookie.FindStringKey("value");
     const std::string* domain = cookie.FindStringKey("domain");
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 1cb4031d..c70ee3c 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -994,62 +994,74 @@
   DCHECK_LT(static_cast<size_t>(requested_adapter_index),
             dawn_adapters_.size());
 
-  dawn::native::DawnDeviceDescriptor device_descriptor;
-  if (request_device_properties.textureCompressionBC) {
-    device_descriptor.requiredFeatures.push_back("texture-compression-bc");
-  }
-  if (request_device_properties.textureCompressionETC2) {
-    device_descriptor.requiredFeatures.push_back("texture-compression-etc2");
-  }
-  if (request_device_properties.textureCompressionASTC) {
-    device_descriptor.requiredFeatures.push_back("texture-compression-astc");
-  }
-  if (request_device_properties.shaderFloat16) {
-    device_descriptor.requiredFeatures.push_back("shader-float16");
-  }
-  if (request_device_properties.pipelineStatisticsQuery) {
-    device_descriptor.requiredFeatures.push_back("pipeline-statistics-query");
-  }
-  if (request_device_properties.timestampQuery) {
-    device_descriptor.requiredFeatures.push_back("timestamp-query");
-  }
-  if (request_device_properties.depthClamping) {
-    device_descriptor.requiredFeatures.push_back("depth-clamping");
-  }
-  if (request_device_properties.invalidFeature) {
-    device_descriptor.requiredFeatures.push_back("invalid-feature");
-  }
+  WGPUDeviceDescriptor device_descriptor;
 
   // We need to request internal usage to be able to do operations with internal
   // methods that would need specific usages.
-  device_descriptor.requiredFeatures.push_back("dawn-internal-usages");
+  std::vector<WGPUFeatureName> required_features;
+  required_features.push_back(WGPUFeatureName_DawnInternalUsages);
+  if (request_device_properties.textureCompressionBC) {
+    required_features.push_back(WGPUFeatureName_TextureCompressionBC);
+  }
+  if (request_device_properties.textureCompressionETC2) {
+    required_features.push_back(WGPUFeatureName_TextureCompressionETC2);
+  }
+  if (request_device_properties.textureCompressionASTC) {
+    required_features.push_back(WGPUFeatureName_TextureCompressionASTC);
+  }
+  if (request_device_properties.shaderFloat16) {
+    required_features.push_back(WGPUFeatureName_DawnShaderFloat16);
+  }
+  if (request_device_properties.pipelineStatisticsQuery) {
+    required_features.push_back(WGPUFeatureName_PipelineStatisticsQuery);
+  }
+  if (request_device_properties.timestampQuery) {
+    required_features.push_back(WGPUFeatureName_TimestampQuery);
+  }
+  if (request_device_properties.depthClamping) {
+    required_features.push_back(WGPUFeatureName_DepthClamping);
+  }
+  if (request_device_properties.invalidFeature) {
+    // Pass something invalid.
+    required_features.push_back(static_cast<WGPUFeatureName>(-1));
+  }
+  device_descriptor.requiredFeatures = required_features.data();
+  device_descriptor.requiredFeaturesCount = required_features.size();
 
   // If a new toggle is added here, ForceDawnTogglesForWebGPU() which collects
   // info for about:gpu should be updated as well.
+  WGPUDawnTogglesDeviceDescriptor dawn_toggles;
+  std::vector<const char*> force_enabled_toggles;
+  std::vector<const char*> force_disabled_toggles;
 
   // Disallows usage of SPIR-V by default for security (we only ensure that WGSL
   // is secure), unless --enable-unsafe-webgpu is used.
   if (!enable_unsafe_webgpu_) {
-    device_descriptor.forceEnabledToggles.push_back("disallow_spirv");
+    force_enabled_toggles.push_back("disallow_spirv");
   }
-
   for (const std::string& toggles : force_enabled_toggles_) {
-    device_descriptor.forceEnabledToggles.push_back(toggles.c_str());
+    force_enabled_toggles.push_back(toggles.c_str());
   }
   for (const std::string& toggles : force_disabled_toggles_) {
-    device_descriptor.forceDisabledToggles.push_back(toggles.c_str());
+    force_disabled_toggles.push_back(toggles.c_str());
   }
+  dawn_toggles.forceEnabledToggles = force_enabled_toggles.data();
+  dawn_toggles.forceEnabledTogglesCount = force_enabled_toggles.size();
+  dawn_toggles.forceDisabledToggles = force_disabled_toggles.data();
+  dawn_toggles.forceDisabledTogglesCount = force_disabled_toggles.size();
+  dawn_toggles.chain.sType = WGPUSType_DawnTogglesDeviceDescriptor;
+  device_descriptor.nextInChain =
+      reinterpret_cast<WGPUChainedStruct*>(&dawn_toggles);
 
   // webgpu_implementation.cc sends the requested limits inside a
   // WGPUDeviceProperties struct which contains WGPUSupportedLimits, not
   // WGPURequiredLimits. It should be WGPURequiredLimits, but to avoid
   // additional custom serialization, we reuse the WGPUDeviceProperties struct
   // until requestDevice is implemented in dawn::wire.
-  WGPURequiredLimits requiredLimits;
-  requiredLimits.nextInChain = nullptr;
-  requiredLimits.limits = request_device_properties.limits.limits;
-
-  device_descriptor.requiredLimits = &requiredLimits;
+  WGPURequiredLimits required_limits;
+  required_limits.nextInChain = nullptr;
+  required_limits.limits = request_device_properties.limits.limits;
+  device_descriptor.requiredLimits = &required_limits;
 
   auto callback =
       base::BindOnce(&WebGPUDecoderImpl::OnRequestDeviceCallback,
diff --git a/gpu/ipc/service/gpu_watchdog_thread_unittest.cc b/gpu/ipc/service/gpu_watchdog_thread_unittest.cc
index b8987425..d016e01 100644
--- a/gpu/ipc/service/gpu_watchdog_thread_unittest.cc
+++ b/gpu/ipc/service/gpu_watchdog_thread_unittest.cc
@@ -114,13 +114,19 @@
   }
 
   full_thread_time_on_windows_ = timeout_ * kMaxCountOfMoreGpuThreadTimeAllowed;
+
 #elif BUILDFLAG(IS_MAC)
   int os_version = base::mac::internal::MacOSVersion();
-  // Use slow timeout for all Mac versions for now.
-  if (os_version <= 1300) {
+  // Use slow timeout for Mac versions < 11.00.
+  if (os_version <= 1100) {
     timeout_ = kGpuWatchdogTimeoutForTestingSlow;
     extra_gpu_job_time_ = kExtraGPUJobTimeForTestingSlow;
+  } else {
+    // To prevent flakiness on the very first test, call Sleep() once before
+    // tests start.
+    base::PlatformThread::Sleep(timeout_ / 4);
   }
+
 #elif BUILDFLAG(IS_ANDROID)
   int32_t major_version = 0;
   int32_t minor_version = 0;
diff --git a/gpu/tools/compositor_model_bench/render_tree.cc b/gpu/tools/compositor_model_bench/render_tree.cc
index 88b72ce..6066841 100644
--- a/gpu/tools/compositor_model_bench/render_tree.cc
+++ b/gpu/tools/compositor_model_bench/render_tree.cc
@@ -173,7 +173,7 @@
   c->set_targetSurface(node.FindIntKey("targetSurfaceID").value());
 
   const Value* transform = node.FindKey("transform");
-  if (transform->GetList().size() != 16) {
+  if (transform->GetListDeprecated().size() != 16) {
     LOG(ERROR) << "4x4 transform matrix did not have 16 elements";
     return false;
   }
@@ -181,7 +181,7 @@
   for (int i = 0; i < 16; ++i) {
     if (!VerifyListEntry(*transform, i, Value::Type::DOUBLE, "Transform"))
       return false;
-    transform_mat[i] = transform->GetList()[i].GetDouble();
+    transform_mat[i] = transform->GetListDeprecated()[i].GetDouble();
   }
   c->set_transform(transform_mat);
 
@@ -198,16 +198,16 @@
       !VerifyListEntry(*dim, 1, Value::Type::INTEGER, "Tile dimension")) {
     return false;
   }
-  c->set_tile_width(dim->GetList()[0].GetInt());
-  c->set_tile_height(dim->GetList()[1].GetInt());
+  c->set_tile_width(dim->GetListDeprecated()[0].GetInt());
+  c->set_tile_height(dim->GetListDeprecated()[1].GetInt());
 
   if (!VerifyDictionaryEntry(*tiles_dict, "info", Value::Type::LIST))
     return false;
   const Value* tiles = tiles_dict->FindKey("info");
-  for (unsigned int i = 0; i < tiles->GetList().size(); ++i) {
+  for (unsigned int i = 0; i < tiles->GetListDeprecated().size(); ++i) {
     if (!VerifyListEntry(*tiles, i, Value::Type::DICTIONARY, "Tile info"))
       return false;
-    const Value& tdict = tiles->GetList()[i];
+    const Value& tdict = tiles->GetListDeprecated()[i];
 
     if (!VerifyDictionaryEntry(tdict, "x", Value::Type::INTEGER) ||
         !VerifyDictionaryEntry(tdict, "y", Value::Type::INTEGER)) {
@@ -242,10 +242,10 @@
   c->set_fragment_shader(ShaderIDFromString(fragment_shader_name));
 
   const Value* textures = node.FindKey("textures");
-  for (unsigned int i = 0; i < textures->GetList().size(); ++i) {
+  for (unsigned int i = 0; i < textures->GetListDeprecated().size(); ++i) {
     if (!VerifyListEntry(*textures, i, Value::Type::DICTIONARY, "Tex list"))
       return false;
-    const Value& tex = textures->GetList()[i];
+    const Value& tex = textures->GetListDeprecated()[i];
 
     if (!VerifyDictionaryEntry(tex, "texID", Value::Type::INTEGER) ||
         !VerifyDictionaryEntry(tex, "height", Value::Type::INTEGER) ||
@@ -265,7 +265,7 @@
                  << " (format: " << *format_name
                  << ")\n"
                     "The layer had "
-                 << textures->GetList().size() << " children.";
+                 << textures->GetListDeprecated().size() << " children.";
       return false;
     }
 
@@ -303,8 +303,8 @@
   n->set_skipsDraw(node.FindBoolKey("skipsDraw").value());
 
   const Value* children = node.FindKey("children");
-  for (unsigned int i = 0; i < children->GetList().size(); ++i) {
-    const Value& child_node = children->GetList()[i];
+  for (unsigned int i = 0; i < children->GetListDeprecated().size(); ++i) {
+    const Value& child_node = children->GetListDeprecated()[i];
     if (!child_node.is_dict())
       continue;
     std::unique_ptr<RenderNode> child = InterpretNode(child_node);
diff --git a/gpu/vulkan/android/vulkan_implementation_android.cc b/gpu/vulkan/android/vulkan_implementation_android.cc
index 4645b16..15d6aa6 100644
--- a/gpu/vulkan/android/vulkan_implementation_android.cc
+++ b/gpu/vulkan/android/vulkan_implementation_android.cc
@@ -34,11 +34,14 @@
   VulkanFunctionPointers* vulkan_function_pointers =
       gpu::GetVulkanFunctionPointers();
 
-  base::NativeLibraryLoadError native_library_load_error;
-  vulkan_function_pointers->vulkan_loader_library = base::LoadNativeLibrary(
-      base::FilePath("libvulkan.so"), &native_library_load_error);
-  if (!vulkan_function_pointers->vulkan_loader_library)
-    return false;
+  {
+    base::AutoLock lock(vulkan_function_pointers->write_lock);
+    base::NativeLibraryLoadError native_library_load_error;
+    vulkan_function_pointers->vulkan_loader_library = base::LoadNativeLibrary(
+        base::FilePath("libvulkan.so"), &native_library_load_error);
+    if (!vulkan_function_pointers->vulkan_loader_library)
+      return false;
+  }
 
   return vulkan_instance_.Initialize(required_extensions, {});
 }
diff --git a/gpu/vulkan/generate_bindings.py b/gpu/vulkan/generate_bindings.py
index 2abe09c..b77fd2c 100755
--- a/gpu/vulkan/generate_bindings.py
+++ b/gpu/vulkan/generate_bindings.py
@@ -440,6 +440,11 @@
       uint32_t api_version,
       const gfx::ExtensionSet& enabled_extensions);
 
+  // The `Bind*` functions will acquires lock, so should not be called with
+  // with this lock held. Code that writes to members directly should take this
+  // lock as well.
+  base::Lock write_lock;
+
   base::NativeLibrary vulkan_loader_library = nullptr;
 
   // This is used to allow thread safe access to a given vulkan queue when
@@ -582,6 +587,7 @@
 
 bool VulkanFunctionPointers::BindUnassociatedFunctionPointers(
   PFN_vkGetInstanceProcAddr proc) {
+  base::AutoLock lock(write_lock);
 
   if (proc) {
     DCHECK(!vulkan_loader_library);
@@ -611,6 +617,7 @@
     uint32_t api_version,
     const gfx::ExtensionSet& enabled_extensions) {
   DCHECK_GE(api_version, kVulkanRequiredApiVersion);
+  base::AutoLock lock(write_lock);
 """)
 
   WriteInstanceFunctionPointerInitialization(
@@ -626,6 +633,7 @@
     uint32_t api_version,
     const gfx::ExtensionSet& enabled_extensions) {
   DCHECK_GE(api_version, kVulkanRequiredApiVersion);
+  base::AutoLock lock(write_lock);
   // Device functions
 """)
   WriteDeviceFunctionPointerInitialization(out_file, VULKAN_DEVICE_FUNCTIONS)
diff --git a/gpu/vulkan/vulkan_function_pointers.cc b/gpu/vulkan/vulkan_function_pointers.cc
index bb2317b..49b6f27 100644
--- a/gpu/vulkan/vulkan_function_pointers.cc
+++ b/gpu/vulkan/vulkan_function_pointers.cc
@@ -25,6 +25,8 @@
 
 bool VulkanFunctionPointers::BindUnassociatedFunctionPointers(
     PFN_vkGetInstanceProcAddr proc) {
+  base::AutoLock lock(write_lock);
+
   if (proc) {
     DCHECK(!vulkan_loader_library);
     vkGetInstanceProcAddr = proc;
@@ -81,6 +83,7 @@
     uint32_t api_version,
     const gfx::ExtensionSet& enabled_extensions) {
   DCHECK_GE(api_version, kVulkanRequiredApiVersion);
+  base::AutoLock lock(write_lock);
   vkCreateDevice = reinterpret_cast<PFN_vkCreateDevice>(
       vkGetInstanceProcAddr(vk_instance, "vkCreateDevice"));
   if (!vkCreateDevice) {
@@ -367,6 +370,7 @@
     uint32_t api_version,
     const gfx::ExtensionSet& enabled_extensions) {
   DCHECK_GE(api_version, kVulkanRequiredApiVersion);
+  base::AutoLock lock(write_lock);
   // Device functions
   vkAllocateCommandBuffers = reinterpret_cast<PFN_vkAllocateCommandBuffers>(
       vkGetDeviceProcAddr(vk_device, "vkAllocateCommandBuffers"));
diff --git a/gpu/vulkan/vulkan_function_pointers.h b/gpu/vulkan/vulkan_function_pointers.h
index 10c37d3..79b7adb 100644
--- a/gpu/vulkan/vulkan_function_pointers.h
+++ b/gpu/vulkan/vulkan_function_pointers.h
@@ -69,6 +69,11 @@
                                   uint32_t api_version,
                                   const gfx::ExtensionSet& enabled_extensions);
 
+  // The `Bind*` functions will acquires lock, so should not be called with
+  // with this lock held. Code that writes to members directly should take this
+  // lock as well.
+  base::Lock write_lock;
+
   base::NativeLibrary vulkan_loader_library = nullptr;
 
   // This is used to allow thread safe access to a given vulkan queue when
diff --git a/gpu/vulkan/vulkan_instance.cc b/gpu/vulkan/vulkan_instance.cc
index d4416d35..5084b91 100644
--- a/gpu/vulkan/vulkan_instance.cc
+++ b/gpu/vulkan/vulkan_instance.cc
@@ -75,6 +75,7 @@
 bool VulkanInstance::Initialize(
     const std::vector<const char*>& required_extensions,
     const std::vector<const char*>& required_layers) {
+  init_called_ = true;
   PFN_vkGetInstanceProcAddr proc = nullptr;
   if (is_from_angle_) {
     proc = gl::QueryVkGetInstanceProcAddrFromANGLE();
@@ -433,6 +434,8 @@
   }
   vk_instance_ = VK_NULL_HANDLE;
 
+  if (!init_called_)
+    return;
   VulkanFunctionPointers* vulkan_function_pointers =
       gpu::GetVulkanFunctionPointers();
   if (vulkan_function_pointers->vulkan_loader_library) {
diff --git a/gpu/vulkan/vulkan_instance.h b/gpu/vulkan/vulkan_instance.h
index d150354..2b36d96 100644
--- a/gpu/vulkan/vulkan_instance.h
+++ b/gpu/vulkan/vulkan_instance.h
@@ -54,6 +54,7 @@
 
   VkInstance owned_vk_instance_ = VK_NULL_HANDLE;
   VkInstance vk_instance_ = VK_NULL_HANDLE;
+  bool init_called_ = false;
   bool debug_report_enabled_ = false;
 #if DCHECK_IS_ON()
   VkDebugReportCallbackEXT error_callback_ = VK_NULL_HANDLE;
diff --git a/headless/test/headless_browser_browsertest.cc b/headless/test/headless_browser_browsertest.cc
index 2831464f..bfc9e75 100644
--- a/headless/test/headless_browser_browsertest.cc
+++ b/headless/test/headless_browser_browsertest.cc
@@ -619,7 +619,7 @@
 
   std::unique_ptr<base::ListValue> tracing_data = helper.TakeTracingData();
   EXPECT_TRUE(tracing_data);
-  EXPECT_LT(0u, tracing_data->GetList().size());
+  EXPECT_LT(0u, tracing_data->GetListDeprecated().size());
 }
 
 IN_PROC_BROWSER_TEST_F(HeadlessBrowserTest, WindowPrint) {
diff --git a/headless/test/headless_client_browsertest.cc b/headless/test/headless_client_browsertest.cc
index bd00dbaa..a09ff273 100644
--- a/headless/test/headless_client_browsertest.cc
+++ b/headless/test/headless_client_browsertest.cc
@@ -51,9 +51,8 @@
 
   void FinishTest(std::unique_ptr<runtime::EvaluateResult> result) {
     const base::Value* value = result->GetResult()->GetValue();
-    std::string str;
-    EXPECT_TRUE(value->GetAsString(&str));
-    EXPECT_EQ("about:blank", str);
+    EXPECT_TRUE(value->is_string());
+    EXPECT_EQ("about:blank", value->GetString());
     session_client_.reset();
     FinishAsynchronousTest();
   }
diff --git a/headless/test/headless_web_contents_browsertest.cc b/headless/test/headless_web_contents_browsertest.cc
index a35b7c6..d4442eb 100644
--- a/headless/test/headless_web_contents_browsertest.cc
+++ b/headless/test/headless_web_contents_browsertest.cc
@@ -1065,10 +1065,10 @@
   }
 
   void OnResult(std::unique_ptr<runtime::EvaluateResult> result) {
-    std::string value;
     EXPECT_TRUE(result->GetResult()->HasValue());
-    EXPECT_TRUE(result->GetResult()->GetValue()->GetAsString(&value));
-    EXPECT_EQ("0", value);
+    const base::Value* value = result->GetResult()->GetValue();
+    EXPECT_TRUE(value->is_string());
+    EXPECT_EQ("0", value->GetString());
     FinishAsynchronousTest();
   }
 };
diff --git a/infra/OWNERS b/infra/OWNERS
index d3d52be..588a02d 100644
--- a/infra/OWNERS
+++ b/infra/OWNERS
@@ -14,6 +14,7 @@
 mmoss@chromium.org
 
 # Other folks who understand the infrastructure well.
+bsheedy@chromium.org
 dpranke@google.com
 hans@chromium.org
 kbr@chromium.org
diff --git a/infra/config/dev/dev.star b/infra/config/dev/dev.star
index 15c7e5d..bb154e30 100644
--- a/infra/config/dev/dev.star
+++ b/infra/config/dev/dev.star
@@ -58,10 +58,6 @@
     ],
 )
 
-luci.builder.defaults.experiments.set({
-    # Launch Swarming tasks in "realms-aware mode", crbug.com/1136313.
-    "luci.use_realms": 100,
-})
 luci.builder.defaults.test_presentation.set(resultdb.test_presentation(grouping_keys = ["status", "v.test_suite"]))
 
 exec("//dev/swarming.star")
diff --git "a/infra/config/generated/builders/ci/Android FYI SkiaRenderer GL \050Nexus 5X\051/properties.textpb" "b/infra/config/generated/builders/ci/Android FYI SkiaRenderer GL \050Nexus 5X\051/properties.textpb"
deleted file mode 100644
index ee8f716..0000000
--- "a/infra/config/generated/builders/ci/Android FYI SkiaRenderer GL \050Nexus 5X\051/properties.textpb"
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.gpu.fyi",
-  "perf_dashboard_machine_group": "ChromiumGPUFYI",
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "chromium.gpu"
-  ]
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android FYI SkiaRenderer Vulkan \050Pixel 2\051/properties.textpb" "b/infra/config/generated/builders/ci/Android FYI SkiaRenderer Vulkan \050Pixel 2\051/properties.textpb"
deleted file mode 100644
index ee8f716..0000000
--- "a/infra/config/generated/builders/ci/Android FYI SkiaRenderer Vulkan \050Pixel 2\051/properties.textpb"
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.gpu.fyi",
-  "perf_dashboard_machine_group": "ChromiumGPUFYI",
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "chromium.gpu"
-  ]
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Dawn Release \050Intel HD 630\051/properties.textpb" "b/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Dawn Release \050Intel HD 630\051/properties.textpb"
deleted file mode 100644
index def7636..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Dawn Release \050Intel HD 630\051/properties.textpb"
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.gpu.fyi",
-  "perf_dashboard_machine_group": "ChromiumGPUFYI",
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "chromium.gpu"
-  ]
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan \050Intel HD 630\051/properties.textpb" "b/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan \050Intel HD 630\051/properties.textpb"
deleted file mode 100644
index ee8f716..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan \050Intel HD 630\051/properties.textpb"
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.gpu.fyi",
-  "perf_dashboard_machine_group": "ChromiumGPUFYI",
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "chromium.gpu"
-  ]
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan \050NVIDIA\051/properties.textpb" "b/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan \050NVIDIA\051/properties.textpb"
deleted file mode 100644
index ee8f716..0000000
--- "a/infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan \050NVIDIA\051/properties.textpb"
+++ /dev/null
@@ -1,15 +0,0 @@
-{
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.gpu.fyi",
-  "perf_dashboard_machine_group": "ChromiumGPUFYI",
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "chromium.gpu"
-  ]
-}
\ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 SkiaRenderer Dawn Release \050NVIDIA\051/properties.textpb" "b/infra/config/generated/builders/ci/Win10 FYI x64 SkiaRenderer Dawn Release \050NVIDIA\051/properties.textpb"
deleted file mode 100644
index def7636..0000000
--- "a/infra/config/generated/builders/ci/Win10 FYI x64 SkiaRenderer Dawn Release \050NVIDIA\051/properties.textpb"
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.gpu.fyi",
-  "perf_dashboard_machine_group": "ChromiumGPUFYI",
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "chromium.gpu"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-skgl-64/properties.textpb b/infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-skgl-64/properties.textpb
deleted file mode 100644
index d90599c..0000000
--- a/infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-skgl-64/properties.textpb
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-android-p-pixel-2-skv-32/properties.textpb b/infra/config/generated/builders/try/gpu-fyi-try-android-p-pixel-2-skv-32/properties.textpb
deleted file mode 100644
index d90599c..0000000
--- a/infra/config/generated/builders/try/gpu-fyi-try-android-p-pixel-2-skv-32/properties.textpb
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-linux-intel-sk-dawn-rel/properties.textpb b/infra/config/generated/builders/try/gpu-fyi-try-linux-intel-sk-dawn-rel/properties.textpb
deleted file mode 100644
index 19e0479..0000000
--- a/infra/config/generated/builders/try/gpu-fyi-try-linux-intel-sk-dawn-rel/properties.textpb
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.linux",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-linux-intel-skv/properties.textpb b/infra/config/generated/builders/try/gpu-fyi-try-linux-intel-skv/properties.textpb
deleted file mode 100644
index 19e0479..0000000
--- a/infra/config/generated/builders/try/gpu-fyi-try-linux-intel-skv/properties.textpb
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.linux",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-linux-nvidia-skv/properties.textpb b/infra/config/generated/builders/try/gpu-fyi-try-linux-nvidia-skv/properties.textpb
deleted file mode 100644
index 19e0479..0000000
--- a/infra/config/generated/builders/try/gpu-fyi-try-linux-nvidia-skv/properties.textpb
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": true,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.linux",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-sk-dawn-rel-64/properties.textpb b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-sk-dawn-rel-64/properties.textpb
deleted file mode 100644
index d4fde02b..0000000
--- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-sk-dawn-rel-64/properties.textpb
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "$build/goma": {
-    "enable_ats": false,
-    "rpc_extra_params": "?prod",
-    "server_host": "goma.chromium.org",
-    "use_luci_auth": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.win",
-  "recipe": "chromium_trybot"
-}
\ No newline at end of file
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 12177a5a..7dcbbe5a 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -882,10 +882,6 @@
         includable_only: true
       }
       builders {
-        name: "chromium/try/gpu-fyi-try-android-m-nexus-5x-skgl-64"
-        includable_only: true
-      }
-      builders {
         name: "chromium/try/gpu-fyi-try-android-m-nexus-9-64"
         includable_only: true
       }
@@ -898,10 +894,6 @@
         includable_only: true
       }
       builders {
-        name: "chromium/try/gpu-fyi-try-android-p-pixel-2-skv-32"
-        includable_only: true
-      }
-      builders {
         name: "chromium/try/gpu-fyi-try-android-pixel-6-64"
         includable_only: true
       }
@@ -942,14 +934,6 @@
         includable_only: true
       }
       builders {
-        name: "chromium/try/gpu-fyi-try-linux-intel-sk-dawn-rel"
-        includable_only: true
-      }
-      builders {
-        name: "chromium/try/gpu-fyi-try-linux-intel-skv"
-        includable_only: true
-      }
-      builders {
         name: "chromium/try/gpu-fyi-try-linux-nvidia-dbg"
         includable_only: true
       }
@@ -962,10 +946,6 @@
         includable_only: true
       }
       builders {
-        name: "chromium/try/gpu-fyi-try-linux-nvidia-skv"
-        includable_only: true
-      }
-      builders {
         name: "chromium/try/gpu-fyi-try-linux-nvidia-tsn"
         includable_only: true
       }
@@ -1058,10 +1038,6 @@
         includable_only: true
       }
       builders {
-        name: "chromium/try/gpu-fyi-try-win10-nvidia-sk-dawn-rel-64"
-        includable_only: true
-      }
-      builders {
         name: "chromium/try/gpu-fyi-try-win7-amd-rel-32"
         includable_only: true
       }
diff --git a/infra/config/generated/luci/cr-buildbucket-dev.cfg b/infra/config/generated/luci/cr-buildbucket-dev.cfg
index 54a4b24..e595ee9 100644
--- a/infra/config/generated/luci/cr-buildbucket-dev.cfg
+++ b/infra/config/generated/luci/cr-buildbucket-dev.cfg
@@ -57,10 +57,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -115,10 +111,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -174,10 +166,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -233,10 +221,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -291,10 +275,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -348,10 +328,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -406,10 +382,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -464,10 +436,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -522,10 +490,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index ca6957d..c222021 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -71,10 +71,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -143,10 +139,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -226,10 +218,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -309,10 +297,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -392,10 +376,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -475,10 +455,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -558,10 +534,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -641,10 +613,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -717,10 +685,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -803,10 +767,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -886,10 +846,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -972,10 +928,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1058,10 +1010,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1144,10 +1092,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1230,10 +1174,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1316,10 +1256,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1402,10 +1338,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1488,182 +1420,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "Android FYI SkiaRenderer GL (Nexus 5X)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Android FYI SkiaRenderer GL (Nexus 5X)/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.gpu.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "chromium.gpu"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 21600
-      build_numbers: YES
-      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "Android FYI SkiaRenderer Vulkan (Pixel 2)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Android FYI SkiaRenderer Vulkan (Pixel 2)/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.gpu.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "chromium.gpu"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 21600
-      build_numbers: YES
-      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1746,10 +1502,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1832,10 +1584,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -1918,10 +1666,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2004,10 +1748,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2090,10 +1830,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2173,10 +1909,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2259,10 +1991,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2345,10 +2073,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2431,10 +2155,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2517,10 +2237,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2603,10 +2319,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2689,10 +2401,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2775,10 +2483,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2861,10 +2565,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -2947,10 +2647,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3033,10 +2729,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3119,10 +2811,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3205,10 +2893,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3291,10 +2975,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3374,10 +3054,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3457,10 +3133,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3540,10 +3212,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3626,10 +3294,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3712,10 +3376,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3795,10 +3455,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3878,10 +3534,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -3961,10 +3613,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4044,10 +3692,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4127,10 +3771,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4210,10 +3850,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4291,10 +3927,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4372,10 +4004,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4455,10 +4083,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4538,10 +4162,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4621,10 +4241,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4704,10 +4320,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4787,10 +4399,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4870,10 +4478,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -4953,10 +4557,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5036,10 +4636,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5119,10 +4715,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5202,10 +4794,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5285,10 +4873,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5368,10 +4952,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5451,10 +5031,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5534,10 +5110,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5617,10 +5189,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5700,10 +5268,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5783,10 +5347,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5866,10 +5426,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -5949,10 +5505,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6029,10 +5581,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6109,10 +5657,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6188,10 +5732,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6268,10 +5808,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6348,10 +5884,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6434,10 +5966,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6520,10 +6048,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6606,10 +6130,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6692,10 +6212,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6778,10 +6294,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6864,10 +6376,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -6950,10 +6458,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7034,10 +6538,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7118,10 +6618,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7202,10 +6698,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7286,10 +6778,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7372,10 +6860,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7458,10 +6942,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7544,10 +7024,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7630,10 +7106,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7716,10 +7188,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7802,10 +7270,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7888,10 +7352,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -7974,10 +7434,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8058,10 +7514,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8142,10 +7594,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8228,10 +7676,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8314,10 +7758,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8400,10 +7840,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8486,10 +7922,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8572,10 +8004,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8648,10 +8076,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8724,10 +8148,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8800,10 +8220,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8876,10 +8292,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -8951,10 +8363,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9027,10 +8435,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9103,10 +8507,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9179,10 +8579,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9255,10 +8651,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9331,10 +8723,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9407,10 +8795,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9481,10 +8865,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9556,10 +8936,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9635,10 +9011,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9721,10 +9093,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9807,10 +9175,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9893,10 +9257,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -9979,10 +9339,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10065,10 +9421,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10151,10 +9503,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10237,10 +9585,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10320,10 +9664,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10406,10 +9746,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10489,10 +9825,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10575,10 +9907,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10661,10 +9989,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10747,10 +10071,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10833,10 +10153,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -10919,10 +10235,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11005,10 +10317,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11091,10 +10399,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11177,10 +10481,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11263,10 +10563,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11349,10 +10645,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11435,10 +10727,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11521,10 +10809,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11607,10 +10891,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -11693,268 +10973,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Linux FYI SkiaRenderer Dawn Release (Intel HD 630)/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.gpu.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "chromium.gpu"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 21600
-      build_numbers: YES
-      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "Linux FYI SkiaRenderer Vulkan (Intel HD 630)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan (Intel HD 630)/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.gpu.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "chromium.gpu"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 21600
-      build_numbers: YES
-      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "Linux FYI SkiaRenderer Vulkan (NVIDIA)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:2"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Linux FYI SkiaRenderer Vulkan (NVIDIA)/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.gpu.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "chromium.gpu"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 21600
-      build_numbers: YES
-      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12037,10 +11055,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12123,10 +11137,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12209,10 +11219,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12295,10 +11301,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12381,10 +11383,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12467,10 +11465,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12563,10 +11557,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12649,10 +11639,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12732,10 +11718,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12815,10 +11797,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12898,10 +11876,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -12980,10 +11954,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13062,10 +12032,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13146,10 +12112,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13231,10 +12193,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13315,10 +12273,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13399,10 +12353,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13480,10 +12430,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13562,10 +12508,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13643,10 +12585,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13729,10 +12667,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13815,10 +12749,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13901,10 +12831,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -13987,10 +12913,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14073,10 +12995,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14159,10 +13077,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14245,10 +13159,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14331,10 +13241,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14417,10 +13323,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14503,10 +13405,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14589,10 +13487,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14675,10 +13569,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14761,10 +13651,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14847,10 +13733,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -14933,10 +13815,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15019,10 +13897,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15105,10 +13979,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15178,10 +14048,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15251,10 +14117,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15337,10 +14199,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15423,10 +14281,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15509,10 +14363,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15595,10 +14445,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15681,10 +14527,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15767,10 +14609,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15853,10 +14691,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -15939,10 +14773,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16025,10 +14855,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16108,10 +14934,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16191,10 +15013,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16274,10 +15092,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16356,10 +15170,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16442,10 +15252,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16528,10 +15334,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16614,10 +15416,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16697,10 +15495,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16780,10 +15574,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16863,10 +15653,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -16949,10 +15735,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17035,10 +15817,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17121,10 +15899,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17207,10 +15981,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17293,10 +16063,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17379,10 +16145,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17465,10 +16227,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17551,10 +16309,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17637,10 +16391,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17723,10 +16473,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17809,10 +16555,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17895,10 +16637,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -17981,10 +16719,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18067,10 +16801,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18153,10 +16883,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18238,10 +16964,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18312,10 +17034,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18398,10 +17116,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18484,10 +17198,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18570,10 +17280,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18656,10 +17362,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18741,10 +17443,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18826,10 +17524,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18911,10 +17605,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -18985,10 +17675,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19071,10 +17757,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19156,10 +17838,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19242,10 +17920,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19328,10 +18002,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19414,10 +18084,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19500,10 +18166,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19586,10 +18248,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19671,10 +18329,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19745,10 +18399,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19834,10 +18484,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -19923,10 +18569,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20006,10 +18648,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20089,10 +18727,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20172,10 +18806,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20258,10 +18888,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20344,10 +18970,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20430,10 +19052,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20515,10 +19133,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20597,10 +19211,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20683,10 +19293,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20765,10 +19371,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20847,10 +19449,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -20932,10 +19530,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21017,10 +19611,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21102,10 +19692,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21188,10 +19774,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21271,10 +19853,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21355,10 +19933,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21438,10 +20012,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21524,10 +20094,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21610,10 +20176,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21696,10 +20258,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21782,10 +20340,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21868,10 +20422,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -21954,10 +20504,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22040,10 +20586,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22126,10 +20668,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22212,96 +20750,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows"
-      dimensions: "pool:luci.chromium.gpu.ci"
-      dimensions: "ssd:0"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/ci/Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.gpu.fyi",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "chromium.gpu"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22384,10 +20832,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22469,10 +20913,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22554,10 +20994,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22640,10 +21076,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22726,10 +21158,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22809,10 +21237,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22895,10 +21319,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -22981,10 +21401,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23067,10 +21483,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23153,10 +21565,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23239,10 +21647,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23325,10 +21729,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23404,10 +21804,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23490,10 +21886,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23573,10 +21965,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23656,10 +22044,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23742,10 +22126,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23825,10 +22205,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23898,10 +22274,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -23975,10 +22347,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24046,10 +22414,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24123,10 +22487,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24194,10 +22554,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24277,10 +22633,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24363,10 +22715,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24449,10 +22797,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24535,10 +22879,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24622,10 +22962,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24704,10 +23040,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24787,10 +23119,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24870,10 +23198,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -24956,10 +23280,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25036,10 +23356,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25119,10 +23435,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25202,10 +23514,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25285,10 +23593,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25371,10 +23675,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25457,10 +23757,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25543,10 +23839,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25629,10 +23921,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25715,10 +24003,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25801,10 +24085,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25887,10 +24167,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -25973,10 +24249,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26049,10 +24321,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26135,10 +24403,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26221,10 +24485,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26307,10 +24567,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26393,10 +24649,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26479,10 +24731,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26565,10 +24813,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26651,10 +24895,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26737,10 +24977,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26823,10 +25059,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26909,10 +25141,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -26994,10 +25222,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27080,10 +25304,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27166,10 +25386,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27252,10 +25468,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27335,10 +25547,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27418,10 +25626,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27504,10 +25708,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27586,10 +25786,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27774,10 +25970,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27857,10 +26049,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -27943,10 +26131,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28029,10 +26213,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28115,10 +26295,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28198,10 +26374,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28281,10 +26453,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28364,10 +26532,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28450,10 +26614,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28536,10 +26696,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28619,10 +26775,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28702,10 +26854,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28788,10 +26936,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28874,10 +27018,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -28960,10 +27100,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29046,10 +27182,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29132,10 +27264,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29215,10 +27343,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29298,10 +27422,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29382,10 +27502,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29468,10 +27584,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29554,10 +27666,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29640,10 +27748,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29717,10 +27821,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29803,10 +27903,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29886,10 +27982,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -29969,10 +28061,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30052,10 +28140,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30135,10 +28219,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30218,10 +28298,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30301,10 +28377,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30384,10 +28456,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30467,10 +28535,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30552,10 +28616,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30638,10 +28698,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30724,10 +28780,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30810,10 +28862,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30889,10 +28937,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -30960,10 +29004,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31045,10 +29085,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31134,10 +29170,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31223,10 +29255,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31308,10 +29336,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31398,10 +29422,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31484,10 +29504,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31569,10 +29585,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31658,10 +29670,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31743,10 +29751,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31832,10 +29836,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -31917,10 +29917,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32002,10 +29998,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32087,10 +30079,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32172,10 +30160,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32257,10 +30241,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32342,10 +30322,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32428,10 +30404,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32514,10 +30486,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32597,10 +30565,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32680,10 +30644,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32763,10 +30723,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32849,10 +30805,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -32926,10 +30878,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33003,10 +30951,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33074,10 +31018,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33145,10 +31085,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33216,10 +31152,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33287,10 +31219,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33370,10 +31298,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33456,10 +31380,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33542,10 +31462,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33627,10 +31543,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33710,10 +31622,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33802,10 +31710,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33885,10 +31789,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -33971,10 +31871,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34057,10 +31953,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34140,10 +32032,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34223,10 +32111,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34306,10 +32190,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34389,10 +32269,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34475,10 +32351,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34561,10 +32433,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34644,10 +32512,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34730,10 +32594,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34813,10 +32673,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34899,10 +32755,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -34982,10 +32834,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35065,10 +32913,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35151,10 +32995,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35234,10 +33074,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35320,10 +33156,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35403,10 +33235,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35486,10 +33314,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35572,10 +33396,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35655,10 +33475,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35738,10 +33554,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35821,10 +33633,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35907,10 +33715,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -35990,10 +33794,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36073,10 +33873,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36156,10 +33952,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36242,10 +34034,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36325,10 +34113,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36410,10 +34194,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36493,10 +34273,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36575,10 +34351,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36661,10 +34433,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36740,10 +34508,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36819,10 +34583,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36905,10 +34665,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -36991,10 +34747,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37077,10 +34829,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37160,10 +34908,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37246,10 +34990,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37330,10 +35070,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37414,10 +35150,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37498,10 +35230,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37584,10 +35312,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37655,10 +35379,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37729,10 +35449,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37800,10 +35516,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37885,10 +35597,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -37970,10 +35678,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38055,10 +35759,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38140,10 +35840,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38225,10 +35921,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38310,10 +36002,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38394,10 +36082,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38475,10 +36159,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38560,10 +36240,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38643,10 +36319,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38726,10 +36398,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38809,10 +36477,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38891,10 +36555,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -38973,10 +36633,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39057,10 +36713,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39140,10 +36792,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39221,10 +36869,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39302,10 +36946,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39386,10 +37026,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39467,10 +37103,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39548,10 +37180,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39629,10 +37257,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39712,10 +37336,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39795,10 +37415,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39878,10 +37494,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -39961,10 +37573,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40044,10 +37652,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40127,10 +37731,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40210,10 +37810,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40293,10 +37889,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40376,10 +37968,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40459,10 +38047,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40545,10 +38129,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40628,10 +38208,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40711,10 +38287,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40783,10 +38355,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40851,10 +38419,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -40928,10 +38492,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41005,10 +38565,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41082,10 +38638,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41165,10 +38717,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41250,10 +38798,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41335,10 +38879,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41420,10 +38960,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41506,10 +39042,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41589,10 +39121,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41672,10 +39200,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41751,10 +39275,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41830,10 +39350,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41915,10 +39431,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -41997,10 +39509,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42080,10 +39588,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42166,10 +39670,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42245,10 +39745,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42324,10 +39820,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42403,10 +39895,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42482,10 +39970,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42568,10 +40052,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42654,10 +40134,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42737,10 +40213,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42820,10 +40292,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42903,10 +40371,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -42974,10 +40438,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43045,10 +40505,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43116,10 +40572,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43187,10 +40639,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43270,10 +40718,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43353,10 +40797,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43436,10 +40876,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43519,10 +40955,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43604,10 +41036,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43689,10 +41117,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43774,10 +41198,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43856,10 +41276,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -43941,10 +41357,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44024,10 +41436,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44107,10 +41515,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44190,10 +41594,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44273,10 +41673,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44344,10 +41740,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44415,10 +41807,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44498,10 +41886,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44581,10 +41965,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44678,10 +42058,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44759,10 +42135,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44840,10 +42212,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -44921,10 +42289,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -45002,10 +42366,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -45083,10 +42443,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -45193,10 +42549,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45247,10 +42599,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -45345,10 +42693,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45398,10 +42742,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45451,10 +42791,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45504,10 +42840,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45557,10 +42889,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45610,10 +42938,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45663,10 +42987,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45716,10 +43036,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45769,10 +43085,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45822,10 +43134,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45875,10 +43183,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45928,10 +43232,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -45981,10 +43281,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46034,10 +43330,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46087,10 +43379,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46140,10 +43428,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46193,10 +43477,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46246,10 +43526,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46299,10 +43575,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46356,10 +43628,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46410,10 +43678,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46464,10 +43728,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46517,10 +43777,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46570,10 +43826,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46622,10 +43874,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46675,10 +43923,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46728,10 +43972,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46781,10 +44021,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46834,10 +44070,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46887,10 +44119,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46940,10 +44168,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -46993,10 +44217,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47046,10 +44266,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47099,10 +44315,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47153,10 +44365,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47207,10 +44415,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47261,10 +44465,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47315,10 +44515,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47369,10 +44565,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47423,10 +44615,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47476,10 +44664,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47529,10 +44713,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47585,10 +44765,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47641,10 +44817,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47695,10 +44867,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47749,10 +44917,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47803,10 +44967,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47857,10 +45017,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47910,10 +45066,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -47963,10 +45115,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -48029,10 +45177,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -48099,10 +45243,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48182,10 +45322,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48332,10 +45468,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48416,10 +45548,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48510,10 +45638,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48604,10 +45728,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48697,10 +45817,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48792,10 +45908,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48887,10 +45999,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -48974,10 +46082,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49061,10 +46165,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49155,10 +46255,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49249,10 +46345,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49351,10 +46443,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49445,10 +46533,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49539,10 +46623,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49633,10 +46713,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49727,10 +46803,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49821,10 +46893,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -49915,10 +46983,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50009,10 +47073,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50103,10 +47163,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50197,10 +47253,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50291,10 +47343,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50385,10 +47433,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50479,10 +47523,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50573,10 +47613,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50667,10 +47703,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50754,10 +47786,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50841,10 +47869,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -50935,10 +47959,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51028,10 +48048,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51123,10 +48139,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51218,10 +48230,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51311,10 +48319,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51406,10 +48410,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51501,10 +48501,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51595,10 +48591,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51689,10 +48681,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51783,10 +48771,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51877,10 +48861,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -51971,10 +48951,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52065,10 +49041,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52159,10 +49131,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52252,10 +49220,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52345,10 +49309,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52440,10 +49400,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52535,10 +49491,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52629,10 +49581,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52723,10 +49671,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52817,10 +49761,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -52911,10 +49851,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53005,10 +49941,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53099,10 +50031,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53193,10 +50121,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53287,10 +50211,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53381,10 +50301,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53475,10 +50391,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53569,10 +50481,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53663,10 +50571,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53757,10 +50661,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53851,10 +50751,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -53944,10 +50840,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54038,10 +50930,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54132,10 +51020,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54226,10 +51110,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54320,10 +51200,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54413,10 +51289,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54507,10 +51379,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54601,10 +51469,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54694,10 +51558,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54788,10 +51648,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54882,10 +51738,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -54975,10 +51827,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55069,10 +51917,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55182,10 +52026,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55266,10 +52106,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55360,10 +52196,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55454,10 +52286,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55547,10 +52375,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55641,10 +52465,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55735,10 +52555,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55829,10 +52645,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -55923,10 +52735,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56016,10 +52824,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56111,10 +52915,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56205,10 +53005,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56299,10 +53095,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56392,10 +53184,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56486,10 +53274,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56580,10 +53364,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56666,10 +53446,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56758,10 +53534,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56850,10 +53622,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -56942,10 +53710,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57034,10 +53798,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57126,10 +53886,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57218,10 +53974,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57310,10 +54062,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57402,10 +54150,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57495,10 +54239,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57582,10 +54322,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57676,10 +54412,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57771,10 +54503,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57865,10 +54593,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -57952,10 +54676,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58046,10 +54766,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58140,10 +54856,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58234,10 +54946,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58328,10 +55036,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58422,10 +55126,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58516,10 +55216,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58609,10 +55305,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58702,10 +55394,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58795,10 +55483,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58888,10 +55572,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -58978,10 +55658,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59068,100 +55744,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "gpu-fyi-try-android-m-nexus-5x-skgl-64"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.android.nexus5x.try"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/gpu-fyi-try-android-m-nexus-5x-skgl-64/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 21600
-      expiration_secs: 7200
-      caches {
-        name: "win_toolchain"
-        path: "win_toolchain"
-      }
-      build_numbers: YES
-      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59248,10 +55830,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59338,10 +55916,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59428,100 +56002,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "gpu-fyi-try-android-p-pixel-2-skv-32"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.android.pixel2.chromium.try"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/gpu-fyi-try-android-p-pixel-2-skv-32/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 21600
-      expiration_secs: 7200
-      caches {
-        name: "win_toolchain"
-        path: "win_toolchain"
-      }
-      build_numbers: YES
-      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59608,10 +56088,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59698,10 +56174,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59788,10 +56260,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59878,10 +56346,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -59968,10 +56432,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60058,10 +56518,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60148,10 +56604,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60238,10 +56690,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60328,10 +56776,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60418,190 +56862,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "gpu-fyi-try-linux-intel-sk-dawn-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.linux.intel.try"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/gpu-fyi-try-linux-intel-sk-dawn-rel/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.linux",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 21600
-      expiration_secs: 7200
-      caches {
-        name: "win_toolchain"
-        path: "win_toolchain"
-      }
-      build_numbers: YES
-      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "gpu-fyi-try-linux-intel-skv"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.linux.intel.try"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/gpu-fyi-try-linux-intel-skv/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.linux",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 21600
-      expiration_secs: 7200
-      caches {
-        name: "win_toolchain"
-        path: "win_toolchain"
-      }
-      build_numbers: YES
-      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60688,10 +56948,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60778,10 +57034,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -60868,100 +57120,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "gpu-fyi-try-linux-nvidia-skv"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-18.04"
-      dimensions: "pool:luci.chromium.gpu.linux.nvidia.try"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/gpu-fyi-try-linux-nvidia-skv/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.linux",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 21600
-      expiration_secs: 7200
-      caches {
-        name: "win_toolchain"
-        path: "win_toolchain"
-      }
-      build_numbers: YES
-      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61048,10 +57206,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61137,10 +57291,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61226,10 +57376,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61315,10 +57461,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61404,10 +57546,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61493,10 +57631,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61582,10 +57716,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61671,10 +57801,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61760,10 +57886,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61849,10 +57971,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -61938,10 +58056,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62027,10 +58141,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62116,10 +58226,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62205,10 +58311,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62295,10 +58397,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62385,10 +58483,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62475,10 +58569,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62565,10 +58655,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62655,10 +58741,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62745,10 +58827,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62835,10 +58913,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -62925,10 +58999,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63015,100 +59085,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://[^/]*blink_web_tests/.+"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-    }
-    builders {
-      name: "gpu-fyi-try-win10-nvidia-sk-dawn-rel-64"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Windows"
-      dimensions: "pool:luci.chromium.gpu.win10.nvidia.try"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-sk-dawn-rel-64/properties.textpb",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.win",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium_trybot"'
-        '}'
-      execution_timeout_secs: 21600
-      expiration_secs: 7200
-      caches {
-        name: "win_toolchain"
-        path: "win_toolchain"
-      }
-      build_numbers: YES
-      service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63195,10 +59171,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63285,10 +59257,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63375,10 +59343,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63465,10 +59429,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63555,10 +59515,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63645,10 +59601,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63734,10 +59686,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63823,10 +59771,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63913,10 +59857,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -63999,10 +59939,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64095,10 +60031,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64191,10 +60123,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64287,10 +60215,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64383,10 +60307,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64479,10 +60399,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64575,10 +60491,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64671,10 +60583,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64767,10 +60675,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64863,10 +60767,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -64959,10 +60859,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65055,10 +60951,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65151,10 +61043,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65247,10 +61135,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65340,10 +61224,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65433,10 +61313,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65527,10 +61403,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65621,10 +61493,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65714,10 +61582,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65801,10 +61665,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65894,10 +61754,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -65981,10 +61837,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66075,10 +61927,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66169,10 +62017,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66263,10 +62107,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66357,10 +62197,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66451,10 +62287,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66545,10 +62377,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66639,10 +62467,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66733,10 +62557,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66827,10 +62647,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -66921,10 +62737,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67015,10 +62827,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67109,10 +62917,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67202,10 +63006,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67296,10 +63096,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67390,10 +63186,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67484,10 +63276,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67577,10 +63365,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67672,10 +63456,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67761,10 +63541,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67849,10 +63625,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -67941,10 +63713,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68035,10 +63803,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68129,10 +63893,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68223,10 +63983,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68317,10 +64073,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68411,10 +64163,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68505,10 +64253,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68599,10 +64343,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68693,10 +64433,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68787,10 +64523,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68881,10 +64613,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -68975,10 +64703,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69069,10 +64793,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69163,10 +64883,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69249,10 +64965,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69343,10 +65055,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69437,10 +65145,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69531,10 +65235,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69625,10 +65325,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69718,10 +65414,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69813,10 +65505,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -69907,10 +65595,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70000,10 +65684,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70100,10 +65780,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70195,10 +65871,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70288,10 +65960,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70381,10 +66049,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70472,10 +66136,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70556,10 +66216,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70640,10 +66296,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70731,10 +66383,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70825,10 +66473,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -70919,10 +66563,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71012,10 +66652,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71106,10 +66742,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71200,10 +66832,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71294,10 +66922,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71388,10 +67012,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71482,10 +67102,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71576,10 +67192,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71670,10 +67282,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71764,10 +67372,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71857,10 +67461,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -71952,10 +67552,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72047,10 +67643,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72141,10 +67733,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72235,10 +67823,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72329,10 +67913,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72416,10 +67996,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72510,10 +68086,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72604,10 +68176,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72701,10 +68269,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72795,10 +68359,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72893,10 +68453,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -72987,10 +68543,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73080,10 +68632,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73175,10 +68723,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73269,10 +68813,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73363,10 +68903,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73457,10 +68993,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73551,10 +69083,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73645,10 +69173,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73738,10 +69262,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73819,10 +69339,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73913,10 +69429,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -73998,10 +69510,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74090,10 +69598,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74183,10 +69687,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74275,10 +69775,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74368,10 +69864,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74461,10 +69953,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74555,10 +70043,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74649,10 +70133,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74738,10 +70218,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74830,10 +70306,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -74922,10 +70394,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75015,10 +70483,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75108,10 +70572,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75201,10 +70661,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75294,10 +70750,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75387,10 +70839,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75481,10 +70929,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75575,10 +71019,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75668,10 +71108,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75761,10 +71197,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75854,10 +71286,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -75947,10 +71375,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76040,10 +71464,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76133,10 +71553,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76226,10 +71642,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76319,10 +71731,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76412,10 +71820,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76505,10 +71909,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76598,10 +71998,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76691,10 +72087,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76783,10 +72175,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76863,10 +72251,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -76943,10 +72327,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77037,10 +72417,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77130,10 +72506,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77211,10 +72583,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77299,10 +72667,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77386,10 +72750,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77473,10 +72833,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77567,10 +72923,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77654,10 +73006,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77741,10 +73089,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77828,10 +73172,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -77922,10 +73262,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78016,10 +73352,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78107,10 +73439,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78199,10 +73527,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78285,10 +73609,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78379,10 +73699,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78470,10 +73786,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78554,10 +73866,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78638,10 +73946,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78722,10 +74026,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78806,10 +74106,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78897,10 +74193,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -78988,10 +74280,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79082,10 +74370,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79176,10 +74460,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79270,10 +74550,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79364,10 +74640,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79458,10 +74730,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79551,10 +74819,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79646,10 +74910,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79740,10 +75000,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79833,10 +75089,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -79927,10 +75179,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80021,10 +75269,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80115,10 +75359,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80209,10 +75449,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80303,10 +75539,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80397,10 +75629,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80491,10 +75719,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80585,10 +75809,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80679,10 +75899,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80773,10 +75989,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80867,10 +76079,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -80947,10 +76155,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -81041,10 +76245,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
         bq_exports {
@@ -81137,10 +76337,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81188,10 +76384,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81239,10 +76431,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81290,10 +76478,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81341,10 +76525,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81392,10 +76572,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81443,10 +76619,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81494,10 +76666,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81545,10 +76713,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81612,10 +76776,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81663,10 +76823,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81714,10 +76870,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81765,10 +76917,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81816,10 +76964,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81867,10 +77011,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81918,10 +77058,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -81969,10 +77105,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82020,10 +77152,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82071,10 +77199,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82122,10 +77246,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82173,10 +77293,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82224,10 +77340,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82275,10 +77387,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82326,10 +77434,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82374,10 +77478,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
@@ -82422,10 +77522,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
       resultdb {
         enable: true
       }
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 0d9a106..52b58113 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -8167,11 +8167,6 @@
     short_name: "dbg"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)"
-    category: "Windows|10|x64|Nvidia"
-    short_name: "skd"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Win10 FYI x64 Release XR Perf (NVIDIA)"
     category: "Windows|10|x64|Nvidia"
     short_name: "xr"
@@ -8307,16 +8302,6 @@
     short_name: "exp"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Linux FYI SkiaRenderer Dawn Release (Intel HD 630)"
-    category: "Linux|Intel"
-    short_name: "skd"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Linux FYI SkiaRenderer Vulkan (Intel HD 630)"
-    category: "Linux|Intel"
-    short_name: "skv"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Linux FYI Release (Intel UHD 630)"
     category: "Linux|Intel"
     short_name: "uhd"
@@ -8332,11 +8317,6 @@
     short_name: "dbg"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Linux FYI SkiaRenderer Vulkan (NVIDIA)"
-    category: "Linux|Nvidia"
-    short_name: "skv"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Android FYI Release (Nexus 5)"
     category: "Android|L32"
     short_name: "N5"
@@ -8372,16 +8352,6 @@
     short_name: "P6"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Android FYI SkiaRenderer GL (Nexus 5X)"
-    category: "Android|skgl|M64"
-    short_name: "N5X"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Android FYI SkiaRenderer Vulkan (Pixel 2)"
-    category: "Android|skv|P32"
-    short_name: "P2"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/GPU FYI Android arm Builder"
     category: "Android|Builder"
     short_name: "arm"
@@ -14423,9 +14393,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-m-nexus-5x-64"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-m-nexus-5x-skgl-64"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-m-nexus-9-64"
   }
   builders {
@@ -14435,9 +14402,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-p-pixel-2-32"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-p-pixel-2-skv-32"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-pixel-6-64"
   }
   builders {
@@ -14468,12 +14432,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-sk-dawn-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-skv"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-dbg"
   }
   builders {
@@ -14483,9 +14441,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-skv"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-tsn"
   }
   builders {
@@ -14555,9 +14510,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-nvidia-rel-64"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-nvidia-sk-dawn-rel-64"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-win7-amd-rel-32"
   }
   builders {
@@ -15420,9 +15372,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-m-nexus-5x-64"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-m-nexus-5x-skgl-64"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-m-nexus-9-64"
   }
   builders {
@@ -15432,9 +15381,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-p-pixel-2-32"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-p-pixel-2-skv-32"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-android-pixel-6-64"
   }
   builders {
@@ -15709,12 +15655,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-sk-dawn-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-intel-skv"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-dbg"
   }
   builders {
@@ -15724,9 +15664,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-skv"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-linux-nvidia-tsn"
   }
   builders {
@@ -16210,9 +16147,6 @@
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-nvidia-rel-64"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/gpu-fyi-try-win10-nvidia-sk-dawn-rel-64"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/gpu-fyi-try-win7-amd-rel-32"
   }
   builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index f914882..2418562 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -244,34 +244,6 @@
   }
 }
 job {
-  id: "Android FYI SkiaRenderer GL (Nexus 5X)"
-  realm: "ci"
-  acls {
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  }
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Android FYI SkiaRenderer GL (Nexus 5X)"
-  }
-}
-job {
-  id: "Android FYI SkiaRenderer Vulkan (Pixel 2)"
-  realm: "ci"
-  acls {
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  }
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Android FYI SkiaRenderer Vulkan (Pixel 2)"
-  }
-}
-job {
   id: "Android Release (Nexus 5X)"
   realm: "ci"
   acl_sets: "ci"
@@ -1909,44 +1881,6 @@
   }
 }
 job {
-  id: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)"
-  realm: "ci"
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)"
-  }
-}
-job {
-  id: "Linux FYI SkiaRenderer Vulkan (Intel HD 630)"
-  realm: "ci"
-  acls {
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  }
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Linux FYI SkiaRenderer Vulkan (Intel HD 630)"
-  }
-}
-job {
-  id: "Linux FYI SkiaRenderer Vulkan (NVIDIA)"
-  realm: "ci"
-  acls {
-    role: TRIGGERER
-    granted_to: "chromium-ci-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
-  }
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Linux FYI SkiaRenderer Vulkan (NVIDIA)"
-  }
-}
-job {
   id: "Linux MSan Builder"
   realm: "ci"
   acl_sets: "ci"
@@ -3809,16 +3743,6 @@
   }
 }
 job {
-  id: "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)"
-  realm: "ci"
-  acl_sets: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)"
-  }
-}
-job {
   id: "Win10 FYI x86 Release (NVIDIA)"
   realm: "ci"
   acls {
@@ -7019,7 +6943,6 @@
   triggers: "Linux ChromiumOS Full"
   triggers: "Linux ChromiumOS MSan Builder"
   triggers: "Linux FYI GPU TSAN Release"
-  triggers: "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)"
   triggers: "Linux MSan Builder"
   triggers: "Linux TSan Builder"
   triggers: "Linux Viz"
@@ -7095,7 +7018,6 @@
   triggers: "Win x64 Builder (reclient compare)"
   triggers: "Win x64 Builder (reclient)"
   triggers: "Win x64 Builder (reclient)(cross)"
-  triggers: "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)"
   triggers: "Windows deterministic"
   triggers: "android-10-arm64-rel"
   triggers: "android-11-x86-rel"
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg
index cc17451..a9c25601 100644
--- a/infra/config/generated/luci/realms.cfg
+++ b/infra/config/generated/luci/realms.cfg
@@ -191,8 +191,6 @@
         values: "Android FYI Release (Pixel 2)"
         values: "Android FYI Release (Pixel 4)"
         values: "Android FYI Release (Pixel 6)"
-        values: "Android FYI SkiaRenderer GL (Nexus 5X)"
-        values: "Android FYI SkiaRenderer Vulkan (Pixel 2)"
         values: "Dawn Linux x64 DEPS Release (Intel HD 630)"
         values: "Dawn Linux x64 DEPS Release (NVIDIA)"
         values: "Dawn Linux x64 Release (Intel HD 630)"
@@ -220,8 +218,6 @@
         values: "Linux FYI Release (Intel HD 630)"
         values: "Linux FYI Release (Intel UHD 630)"
         values: "Linux FYI Release (NVIDIA)"
-        values: "Linux FYI SkiaRenderer Vulkan (Intel HD 630)"
-        values: "Linux FYI SkiaRenderer Vulkan (NVIDIA)"
         values: "Mac FYI ASAN (Intel)"
         values: "Mac FYI Debug (Intel)"
         values: "Mac FYI Experimental Release (Intel)"
diff --git a/infra/config/lib/branches.star b/infra/config/lib/branches.star
index 2f99d162..3de2a13 100644
--- a/infra/config/lib/branches.star
+++ b/infra/config/lib/branches.star
@@ -57,12 +57,36 @@
 
 _BRANCH_SELECTORS = (MAIN, STANDARD_BRANCHES, DESKTOP_EXTENDED_STABLE_BRANCHES, CROS_LTS_BRANCHES)
 
-def _matches(branch_selector):
-    """Returns whether `branch_selector` matches the project settings."""
+def _normalize_branch_selector(branch_selector):
+    """Convert provided branch selector to a set of basic selectors.
+    """
+
+    # A single basic selector was provided, return a set containing just it
     if type(branch_selector) == type(struct()):
-        branch_selectors = [branch_selector]
-    else:
-        branch_selectors = branch_selector
+        return set([branch_selector])
+
+    # The provided selector is either:
+    # * a compound selector, which are tuples of basic selectors
+    # * an iterable of arbitrary selectors
+    # Iterate over the selector, extracting the basic selectors from each
+    branch_selectors = set()
+    for s in branch_selector:
+        if type(s) == type(struct()):
+            s = [s]
+        branch_selectors = branch_selectors.union(s)
+    return branch_selectors
+
+def _matches(branch_selector):
+    """Returns whether `branch_selector` matches the project settings.
+
+    Args:
+      branch_selector: A single branch selector value or a list of branch
+        selector values.
+
+    Returns:
+      True if any of the specified branch selectors matches, False otherwise.
+    """
+    branch_selectors = _normalize_branch_selector(branch_selector)
     for b in branch_selectors:
         if b == MAIN:
             if settings.is_main:
diff --git a/infra/config/main.star b/infra/config/main.star
index eb8cb5e..7ff09e4 100755
--- a/infra/config/main.star
+++ b/infra/config/main.star
@@ -166,10 +166,6 @@
     ],
 )
 
-luci.builder.defaults.experiments.set({
-    # Launch Swarming tasks in "realms-aware mode", crbug.com/1136313.
-    "luci.use_realms": 100,
-})
 luci.builder.defaults.test_presentation.set(resultdb.test_presentation(grouping_keys = ["status", "v.test_suite"]))
 
 exec("//swarming.star")
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
index 1d18530..0349ec06 100644
--- a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
@@ -122,24 +122,6 @@
     triggered_by = ["GPU FYI Android arm64 Builder"],
 )
 
-ci.thin_tester(
-    name = "Android FYI SkiaRenderer GL (Nexus 5X)",
-    console_view_entry = consoles.console_view_entry(
-        category = "Android|skgl|M64",
-        short_name = "N5X",
-    ),
-    triggered_by = ["GPU FYI Android arm64 Builder"],
-)
-
-ci.thin_tester(
-    name = "Android FYI SkiaRenderer Vulkan (Pixel 2)",
-    console_view_entry = consoles.console_view_entry(
-        category = "Android|skv|P32",
-        short_name = "P2",
-    ),
-    triggered_by = ["GPU FYI Android arm Builder"],
-)
-
 ci.gpu.linux_builder(
     name = "ChromeOS FYI Release (amd64-generic)",
     # Runs a lot of tests + VMs are slower than real hardware, so increase the
@@ -231,15 +213,6 @@
     reclient_instance = rbe_instance.DEFAULT,
 )
 
-# Builder + tester.
-ci.gpu.linux_builder(
-    name = "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)",
-    console_view_entry = consoles.console_view_entry(
-        category = "Linux|Intel",
-        short_name = "skd",
-    ),
-)
-
 ci.gpu.mac_builder(
     name = "GPU FYI Mac Builder",
     console_view_entry = consoles.console_view_entry(
@@ -360,24 +333,6 @@
 )
 
 ci.thin_tester(
-    name = "Linux FYI SkiaRenderer Vulkan (Intel HD 630)",
-    console_view_entry = consoles.console_view_entry(
-        category = "Linux|Intel",
-        short_name = "skv",
-    ),
-    triggered_by = ["GPU FYI Linux Builder"],
-)
-
-ci.thin_tester(
-    name = "Linux FYI SkiaRenderer Vulkan (NVIDIA)",
-    console_view_entry = consoles.console_view_entry(
-        category = "Linux|Nvidia",
-        short_name = "skv",
-    ),
-    triggered_by = ["GPU FYI Linux Builder"],
-)
-
-ci.thin_tester(
     name = "Mac FYI Debug (Intel)",
     console_view_entry = consoles.console_view_entry(
         category = "Mac|Intel",
@@ -589,15 +544,6 @@
     triggered_by = ["GPU FYI XR Win x64 Builder"],
 )
 
-# Builder + tester.
-gpu_fyi_windows_builder(
-    name = "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)",
-    console_view_entry = consoles.console_view_entry(
-        category = "Windows|10|x64|Nvidia",
-        short_name = "skd",
-    ),
-)
-
 ci.thin_tester(
     name = "Win10 FYI x86 Release (NVIDIA)",
     console_view_entry = consoles.console_view_entry(
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star
index 6ade4c8..e285ed0 100644
--- a/infra/config/subprojects/chromium/gpu.try.star
+++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -63,11 +63,6 @@
 )
 
 gpu_android_builder(
-    name = "gpu-fyi-try-android-m-nexus-5x-skgl-64",
-    pool = "luci.chromium.gpu.android.nexus5x.try",
-)
-
-gpu_android_builder(
     name = "gpu-fyi-try-android-m-nexus-9-64",
     pool = "luci.chromium.gpu.android.nexus9.try",
 )
@@ -83,11 +78,6 @@
 )
 
 gpu_android_builder(
-    name = "gpu-fyi-try-android-p-pixel-2-skv-32",
-    pool = "luci.chromium.gpu.android.pixel2.chromium.try",
-)
-
-gpu_android_builder(
     name = "gpu-fyi-try-android-r-pixel-4-32",
     pool = "luci.chromium.gpu.android.pixel4.try",
 )
@@ -165,16 +155,6 @@
 )
 
 gpu_linux_builder(
-    name = "gpu-fyi-try-linux-intel-sk-dawn-rel",
-    pool = "luci.chromium.gpu.linux.intel.try",
-)
-
-gpu_linux_builder(
-    name = "gpu-fyi-try-linux-intel-skv",
-    pool = "luci.chromium.gpu.linux.intel.try",
-)
-
-gpu_linux_builder(
     name = "gpu-fyi-try-linux-nvidia-dbg",
     pool = "luci.chromium.gpu.linux.nvidia.try",
 )
@@ -190,11 +170,6 @@
 )
 
 gpu_linux_builder(
-    name = "gpu-fyi-try-linux-nvidia-skv",
-    pool = "luci.chromium.gpu.linux.nvidia.try",
-)
-
-gpu_linux_builder(
     name = "gpu-fyi-try-linux-nvidia-tsn",
     pool = "luci.chromium.gpu.linux.nvidia.try",
 )
@@ -347,11 +322,6 @@
 )
 
 gpu_win_builder(
-    name = "gpu-fyi-try-win10-nvidia-sk-dawn-rel-64",
-    pool = "luci.chromium.gpu.win10.nvidia.try",
-)
-
-gpu_win_builder(
     name = "gpu-fyi-try-win10-nvidia-rel-32",
     pool = "luci.chromium.gpu.win10.nvidia.try",
 )
diff --git a/ios/build/bots/scripts/gtest_utils.py b/ios/build/bots/scripts/gtest_utils.py
index e64f7a2..bde3850 100644
--- a/ios/build/bots/scripts/gtest_utils.py
+++ b/ios/build/bots/scripts/gtest_utils.py
@@ -21,6 +21,8 @@
 TEST_TIMEOUT_LABEL = 'TIMEOUT'
 TEST_WARNING_LABEL = 'WARNING'
 
+DID_NOT_COMPLETE = 'Did not complete.'
+
 
 class GTestResult(object):
   """A result of gtest.
@@ -126,13 +128,13 @@
     for test, log_lines in self._failed_tests.items():
       # A test with no output would have crashed. No output is replaced
       # by the GTestLogParser by a sentence indicating non-completion.
-      if 'Did not complete.' in log_lines:
+      if DID_NOT_COMPLETE in log_lines:
         self._crashed = True
         self._crashed_test = test
 
     # A test marked as flaky may also have crashed the app.
     for test, log_lines in self._flaked_tests.items():
-      if 'Did not complete.' in log_lines:
+      if DID_NOT_COMPLETE in log_lines:
         self._crashed = True
         self._crashed_test = test
 
@@ -337,9 +339,17 @@
     Called at the end to add unfinished tests and crash status for
         self._result_collection.
     """
+    # Remaining logs after crash before exit.
+    raw_remaining_logs = self._failure_description
     for test in self.RunningTests():
+      self._test_status[test][1].extend(
+          ['Potential test logs from crash until the end of test program:'])
+      self._test_status[test][1].extend(raw_remaining_logs)
       self._result_collection.add_test_result(
-          TestResult(test, TestStatus.CRASH, test_log='Did not complete.'))
+          TestResult(
+              test,
+              TestStatus.CRASH,
+              test_log='\n'.join(self._test_status[test][1])))
       self._result_collection.crashed = True
 
     if not self.completed:
@@ -468,7 +478,7 @@
                   TestStatus.ABORT,
                   test_log='\n'.join(self._failure_description)))
       test_name = results.group(1)
-      self._test_status[test_name] = ('started', ['Did not complete.'])
+      self._test_status[test_name] = ('started', [DID_NOT_COMPLETE])
       self._current_test = test_name
       if self.retrying_failed:
         self._failure_description = self._test_status[test_name][1]
diff --git a/ios/build/bots/scripts/gtest_utils_test.py b/ios/build/bots/scripts/gtest_utils_test.py
index c8b6027..f61981b 100755
--- a/ios/build/bots/scripts/gtest_utils_test.py
+++ b/ios/build/bots/scripts/gtest_utils_test.py
@@ -19,6 +19,7 @@
 FAILS_FAILURES = ['SomeOtherTest.FAILS_Bar']
 FLAKY_FAILURES = ['SomeOtherTest.FLAKY_Baz']
 
+CRASH_MESSAGE = ['Oops, this test crashed!']
 TIMEOUT_MESSAGE = 'Killed (timed out).'
 
 RELOAD_ERRORS = (r'C:\b\slave\chrome-release-snappy\build\chrome\browser'
@@ -608,7 +609,11 @@
     self.assertEqual(0, parser.FlakyTests())
 
     test_name = 'HunspellTest.Crashes'
-    self.assertEqual('\n'.join(['%s: ' % test_name, 'Did not complete.']),
+    expected_log_lines = [
+        'Did not complete.',
+        'Potential test logs from crash until the end of test program:'
+    ] + CRASH_MESSAGE
+    self.assertEqual('\n'.join(['%s: ' % test_name] + expected_log_lines),
                      '\n'.join(parser.FailureDescription(test_name)))
     self.assertEqual(['UNKNOWN'], parser.TriesForTest(test_name))
 
@@ -619,7 +624,8 @@
       covered = False
       if result.name == 'HunspellTest.Crashes':
         covered = True
-        self.assertEqual('\n'.join(['Did not complete.']), result.test_log)
+        self.assertEqual('\n'.join(expected_log_lines), result.test_log)
+        self.assertEqual(TestStatus.CRASH, result.status)
     self.assertTrue(covered)
 
   def testGTestLogParserSharing(self):
@@ -746,7 +752,11 @@
     self.assertEqual(0, parser.FlakyTests())
 
     test_name = 'HunspellTest.Crashes'
-    self.assertEqual('\n'.join(['%s: ' % test_name, 'Did not complete.']),
+    expected_log_lines = [
+        'Did not complete.',
+        'Potential test logs from crash until the end of test program:'
+    ] + CRASH_MESSAGE
+    self.assertEqual('\n'.join(['%s: ' % test_name] + expected_log_lines),
                      '\n'.join(parser.FailureDescription(test_name)))
     self.assertEqual(['UNKNOWN'], parser.TriesForTest(test_name))
 
@@ -757,7 +767,8 @@
       covered = False
       if result.name == 'HunspellTest.Crashes':
         covered = True
-        self.assertEqual('\n'.join(['Did not complete.']), result.test_log)
+        self.assertEqual('\n'.join(expected_log_lines), result.test_log)
+        self.assertEqual(TestStatus.CRASH, result.status)
     self.assertTrue(covered)
 
   def testGTestLogParserMixedStdout(self):
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index b18d818..a11efd8 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -906,6 +906,15 @@
       <message name="IDS_IOS_FACETIME_BUTTON" desc="Text in the confirmation dialog button that will initiate a FaceTime call for the presented number. [Length: 10em] [iOS only]">
         FaceTime
       </message>
+      <message name="IDS_IOS_FEED_SORT_ACCESSIBILITY_LABEL" desc="The accessibility label for the Following feed header's sort button.">
+        Sort button for Following feed.
+      </message>
+      <message name="IDS_IOS_FEED_SORT_LATEST" desc="Sort by latest label text in feed sort menu.">
+        Sort by Latest
+      </message>
+      <message name="IDS_IOS_FEED_SORT_PUBLISHER" desc="Sort by publisher label text in feed sort menu.">
+        Sort by Publisher
+      </message>
       <message name="IDS_IOS_FOLLOWING_FEED_TITLE" desc="The title in the Following feed header label.">
         Following
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_ACCESSIBILITY_LABEL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_ACCESSIBILITY_LABEL.png.sha1
new file mode 100644
index 0000000..97d46357
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_ACCESSIBILITY_LABEL.png.sha1
@@ -0,0 +1 @@
+eefe165151e1f864b73a48d71b17634bf5271418
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_LATEST.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_LATEST.png.sha1
new file mode 100644
index 0000000..97d46357
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_LATEST.png.sha1
@@ -0,0 +1 @@
+eefe165151e1f864b73a48d71b17634bf5271418
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_PUBLISHER.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_PUBLISHER.png.sha1
new file mode 100644
index 0000000..97d46357
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_FEED_SORT_PUBLISHER.png.sha1
@@ -0,0 +1 @@
+eefe165151e1f864b73a48d71b17634bf5271418
\ No newline at end of file
diff --git a/ios/chrome/browser/autofill/automation/automation_action.mm b/ios/chrome/browser/autofill/automation/automation_action.mm
index 949ecfe..260c1e0 100644
--- a/ios/chrome/browser/autofill/automation/automation_action.mm
+++ b/ios/chrome/browser/autofill/automation/automation_action.mm
@@ -293,7 +293,8 @@
       "assertions", base::Value::Type::LIST));
   GREYAssert(assertionsValue, @"Assertions key is missing in action.");
 
-  base::Value::ConstListView assertionsValues(assertionsValue->GetList());
+  base::Value::ConstListView assertionsValues(
+      assertionsValue->GetListDeprecated());
   GREYAssert(assertionsValues.size(), @"Assertions list is empty.");
 
   std::vector<std::string> state_assertions;
diff --git a/ios/chrome/browser/autofill/automation/automation_app_interface.mm b/ios/chrome/browser/autofill/automation/automation_app_interface.mm
index 228df9fb..4af0402 100644
--- a/ios/chrome/browser/autofill/automation/automation_app_interface.mm
+++ b/ios/chrome/browser/autofill/automation/automation_app_interface.mm
@@ -86,7 +86,8 @@
   autofill::CreditCard credit_card(base::GenerateGUID(),
                                    "https://www.example.com/");
 
-  base::Value::ConstListView profile_entries_list = autofill_profile->GetList();
+  base::Value::ConstListView profile_entries_list =
+      autofill_profile->GetListDeprecated();
 
   // For each type-value dictionary in the autofill profile list, validate it,
   // then add it to the appropriate profile.
diff --git a/ios/chrome/browser/autofill/automation/automation_egtest.mm b/ios/chrome/browser/autofill/automation/automation_egtest.mm
index ead316da..012704f 100644
--- a/ios/chrome/browser/autofill/automation/automation_egtest.mm
+++ b/ios/chrome/browser/autofill/automation/automation_egtest.mm
@@ -122,7 +122,7 @@
       recipeRoot.FindKeyOfType("actions", base::Value::Type::LIST);
   GREYAssert(actionValue, @"Test file is missing actions.");
 
-  base::Value::ConstListView actionsValues(actionValue->GetList());
+  base::Value::ConstListView actionsValues(actionValue->GetListDeprecated());
   GREYAssert(actionsValues.size(), @"Test file has empty actions.");
 
   _actions = [[NSMutableArray alloc] initWithCapacity:actionsValues.size()];
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 6f9d5ca..93545ea 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -789,6 +789,10 @@
      flag_descriptions::kSingleCellContentSuggestionsName,
      flag_descriptions::kSingleCellContentSuggestionsDescription,
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(kSingleCellContentSuggestions)},
+    {"content-suggestions-header-migration",
+     flag_descriptions::kContentSuggestionsHeaderMigrationName,
+     flag_descriptions::kContentSuggestionsHeaderMigrationDescription,
+     flags_ui::kOsIos, FEATURE_VALUE_TYPE(kContentSuggestionsHeaderMigration)},
 };
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index cb0e6d8..b758b51 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -77,6 +77,12 @@
 const char kCommercePriceTrackingDescription[] =
     "Allows users to track product prices through Chrome.";
 
+const char kContentSuggestionsHeaderMigrationName[] =
+    "Content Suggestions header migration";
+const char kContentSuggestionsHeaderMigrationDescription[] =
+    "When enabled, the Content Suggestions header will be logically moved to "
+    "the Discover feed ScrollView";
+
 const char kContextMenuActionsRefreshName[] = "Context menu actions refresh";
 const char kContextMenuActionsRefreshDescription[] =
     "When enabled, context menu actions are updated";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index c70deed..f0977b0d 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -68,6 +68,11 @@
 extern const char kCommercePriceTrackingName[];
 extern const char kCommercePriceTrackingDescription[];
 
+// Title and description for the flag that moves the Content Suggestions header
+// to the Discover feed ScrollView.
+extern const char kContentSuggestionsHeaderMigrationName[];
+extern const char kContentSuggestionsHeaderMigrationDescription[];
+
 // Title and description for the flag to enable context menu actions refresh.
 extern const char kContextMenuActionsRefreshName[];
 extern const char kContextMenuActionsRefreshDescription[];
diff --git a/ios/chrome/browser/follow/follow_java_script_feature.mm b/ios/chrome/browser/follow/follow_java_script_feature.mm
index cf07fe4..859d837 100644
--- a/ios/chrome/browser/follow/follow_java_script_feature.mm
+++ b/ios/chrome/browser/follow/follow_java_script_feature.mm
@@ -69,7 +69,7 @@
     return;
 
   NSMutableArray* rss_links = [[NSMutableArray alloc] init];
-  for (const auto& link : response->GetList()) {
+  for (const auto& link : response->GetListDeprecated()) {
     if (link.is_string()) {
       [rss_links addObject:[NSURL URLWithString:base::SysUTF8ToNSString(
                                                     *link.GetIfString())]];
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
index b2b2e58..9f1ee47 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -290,8 +290,7 @@
 PasswordManagerMetricsRecorder*
 IOSChromePasswordManagerClient::GetMetricsRecorder() {
   if (!metrics_recorder_) {
-    metrics_recorder_.emplace(GetUkmSourceId(),
-                              /*navigation_metric_recorder=*/nullptr);
+    metrics_recorder_.emplace(GetUkmSourceId());
   }
   return base::OptionalOrNullptr(metrics_recorder_);
 }
diff --git a/ios/chrome/browser/signin/chrome_account_manager_service.mm b/ios/chrome/browser/signin/chrome_account_manager_service.mm
index 8509b126..9c9dc9d 100644
--- a/ios/chrome/browser/signin/chrome_account_manager_service.mm
+++ b/ios/chrome/browser/signin/chrome_account_manager_service.mm
@@ -154,7 +154,8 @@
 PatternAccountRestriction PatternAccountRestrictionFromPreference(
     PrefService* pref_service) {
   auto maybe_restriction = PatternAccountRestrictionFromValue(
-      pref_service->GetList(prefs::kRestrictAccountsToPatterns)->GetList());
+      pref_service->GetList(prefs::kRestrictAccountsToPatterns)
+          ->GetListDeprecated());
   return *std::move(maybe_restriction);
 }
 
diff --git a/ios/chrome/browser/signin/pattern_account_restriction.mm b/ios/chrome/browser/signin/pattern_account_restriction.mm
index 79c71a3..7015244 100644
--- a/ios/chrome/browser/signin/pattern_account_restriction.mm
+++ b/ios/chrome/browser/signin/pattern_account_restriction.mm
@@ -82,7 +82,7 @@
   if (!value->is_list())
     return false;
 
-  for (const base::Value& item : value->GetList()) {
+  for (const base::Value& item : value->GetListDeprecated()) {
     if (!item.is_string())
       return false;
     auto maybe_pattern = PatternFromString(item.GetString());
diff --git a/ios/chrome/browser/signin/user_approved_account_list_manager.mm b/ios/chrome/browser/signin/user_approved_account_list_manager.mm
index 7b61866..6cdae11 100644
--- a/ios/chrome/browser/signin/user_approved_account_list_manager.mm
+++ b/ios/chrome/browser/signin/user_approved_account_list_manager.mm
@@ -25,7 +25,7 @@
   const base::Value* accounts_pref =
       pref_service_->GetList(prefs::kSigninLastAccounts);
   std::vector<CoreAccountId> accounts;
-  for (const auto& value : accounts_pref->GetList()) {
+  for (const auto& value : accounts_pref->GetListDeprecated()) {
     DCHECK(value.is_string());
     DCHECK(!value.GetString().empty());
     accounts.push_back(CoreAccountId::FromString(value.GetString()));
diff --git a/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm b/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm
index ccbf324..6d4d076 100644
--- a/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm
+++ b/ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.mm
@@ -39,7 +39,7 @@
 bool IsRestrictAccountsToPatternsEnabled() {
   const base::Value* value = GetApplicationContext()->GetLocalState()->GetList(
       prefs::kRestrictAccountsToPatterns);
-  return !value->GetList().empty();
+  return !value->GetListDeprecated().empty();
 }
 
 // TODO(crbug.com/1244632): Use the Authentication Service sign-in status API
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h
index 25e23e3e..09a496f9 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h
@@ -18,6 +18,10 @@
 // Feature to use one cell for Content Suggestions
 extern const base::Feature kSingleCellContentSuggestions;
 
+// Feature to move the Content Suggestions header view into the Discover
+// ScrollView.
+extern const base::Feature kContentSuggestionsHeaderMigration;
+
 // A parameter to indicate whether the native UI is enabled for the discover
 // feed.
 extern const char kDiscoverFeedIsNativeUIEnabled[];
@@ -31,4 +35,7 @@
 // Whether the single cell content suggestions feature is enabled.
 bool IsSingleCellContentSuggestionsEnabled();
 
+// Whether the Content Suggestions header migration feature is enabled.
+bool IsContentSuggestionsHeaderMigrationEnabled();
+
 #endif  // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_FEATURE_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm
index 8b34601..0c515c1a 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm
@@ -19,6 +19,10 @@
 const base::Feature kSingleCellContentSuggestions{
     "SingleCellContentSuggestions", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Feature disabled by default.
+const base::Feature kContentSuggestionsHeaderMigration{
+    "ContentSuggestionsHeaderMigration", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // A parameter to indicate whether the native UI is enabled for the discover
 // feed.
 const char kDiscoverFeedIsNativeUIEnabled[] = "DiscoverFeedIsNativeUIEnabled";
@@ -34,3 +38,7 @@
 bool IsSingleCellContentSuggestionsEnabled() {
   return base::FeatureList::IsEnabled(kSingleCellContentSuggestions);
 }
+
+bool IsContentSuggestionsHeaderMigrationEnabled() {
+  return base::FeatureList::IsEnabled(kContentSuggestionsHeaderMigration);
+}
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 169edce..7f43386 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -995,7 +995,7 @@
 
   // The feed header button may be offscreen, so scroll to find it if needed.
   id<GREYMatcher> headerButton =
-      grey_allOf(grey_accessibilityID(kNTPFeedHeaderButtonIdentifier),
+      grey_allOf(grey_accessibilityID(kNTPFeedHeaderMenuButtonIdentifier),
                  grey_sufficientlyVisible(), nil);
   [[[EarlGrey selectElementWithMatcher:headerButton]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 100.0f)
@@ -1017,7 +1017,7 @@
 
   // The feed header button may be offscreen, so scroll to find it if needed.
   id<GREYMatcher> headerButton =
-      grey_allOf(grey_accessibilityID(kNTPFeedHeaderButtonIdentifier),
+      grey_allOf(grey_accessibilityID(kNTPFeedHeaderMenuButtonIdentifier),
                  grey_sufficientlyVisible(), nil);
   [[[EarlGrey selectElementWithMatcher:headerButton]
          usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, 100.0f)
diff --git a/ios/chrome/browser/ui/ntp/feed_header_view_controller.mm b/ios/chrome/browser/ui/ntp/feed_header_view_controller.mm
index 51f7e13..48dc8e2 100644
--- a/ios/chrome/browser/ui/ntp/feed_header_view_controller.mm
+++ b/ios/chrome/browser/ui/ntp/feed_header_view_controller.mm
@@ -21,9 +21,9 @@
 // Leading margin for title label. Its used to align with the Card leading
 // margin.
 const CGFloat kTitleHorizontalMargin = 19;
-// Trailing margin for menu button. Its used to align with the Card trailing
-// margin.
-const CGFloat kMenuButtonHorizontalMargin = 14;
+// Trailing/leading margins for header buttons. Its used to align with the card
+// margins.
+const CGFloat kButtonHorizontalMargin = 14;
 // Font size for label text in header.
 const CGFloat kDiscoverFeedTitleFontSize = 16;
 // Insets for header menu button.
@@ -41,7 +41,15 @@
 const CGFloat kHeaderSegmentWidth = 150;
 // The height and width of the header menu button. Based on the default
 // UISegmentedControl height.
-const CGFloat kMenuButtonSize = 28;
+const CGFloat kButtonSize = 28;
+// Duration of the fade animation when the sort button appears/disappears.
+const CGFloat kSortButtonAnimationDuration = 0.3;
+
+// Image names for feed header icons.
+NSString* kMenuIcon = @"ellipsis";
+NSString* kSortIcon = @"arrow.up.arrow.down";
+// TODO(crbug.com/1277974): Remove this when Web Channels is launched.
+NSString* kDiscoverMenuIcon = @"infobar_settings_icon";
 }
 
 @interface FeedHeaderViewController ()
@@ -56,6 +64,9 @@
 // Redefined to not be readonly.
 @property(nonatomic, strong) UIButton* menuButton;
 
+// Button for sorting feed content. Only used for Following feed.
+@property(nonatomic, strong) UIButton* sortButton;
+
 // Segmented control for toggling between the two feeds.
 @property(nonatomic, strong) UISegmentedControl* segmentedControl;
 
@@ -96,6 +107,10 @@
   if (IsWebChannelsEnabled()) {
     self.segmentedControl = [self createSegmentedControl];
     [self.container addSubview:self.segmentedControl];
+
+    self.sortButton = [self createSortButton];
+    self.sortButton.menu = [self createSortMenu];
+    [self.container addSubview:self.sortButton];
   } else {
     self.titleLabel = [self createTitleLabel];
     [self.container addSubview:self.titleLabel];
@@ -119,22 +134,48 @@
 
 #pragma mark - Private
 
+// Creates sort menu with its content.
+- (UIMenu*)createSortMenu {
+  NSMutableArray<UIAction*>* sortActions = [NSMutableArray array];
+
+  UIAction* sortByPublisherAction = [UIAction
+      actionWithTitle:l10n_util::GetNSString(IDS_IOS_FEED_SORT_PUBLISHER)
+                image:nil
+           identifier:nil
+              handler:^(UIAction* action){
+                  // TODO(crbug.com/1277974): Handle selected sorting.
+              }];
+  // TODO(crbug.com/1277974): Set the active state based on selected sorting.
+  sortByPublisherAction.state = UIMenuElementStateOn;
+  [sortActions addObject:sortByPublisherAction];
+
+  UIAction* sortByLatestAction =
+      [UIAction actionWithTitle:l10n_util::GetNSString(IDS_IOS_FEED_SORT_LATEST)
+                          image:nil
+                     identifier:nil
+                        handler:^(UIAction* action){
+                            // TODO(crbug.com/1277974): Handle selected sorting.
+                        }];
+  [sortActions addObject:sortByLatestAction];
+
+  return [UIMenu menuWithTitle:@"" children:sortActions];
+}
+
 // Configures the feed header's menu button.
 - (void)configureMenuButton:(UIButton*)menuButton {
   menuButton.translatesAutoresizingMaskIntoConstraints = NO;
-  menuButton.accessibilityIdentifier = kNTPFeedHeaderButtonIdentifier;
+  menuButton.accessibilityIdentifier = kNTPFeedHeaderMenuButtonIdentifier;
   menuButton.accessibilityLabel =
       l10n_util::GetNSString(IDS_IOS_DISCOVER_FEED_MENU_ACCESSIBILITY_LABEL);
   if (IsWebChannelsEnabled()) {
-    // TODO(crbug.com/1275271): Confirm that this is the correct asset.
-    [menuButton setImage:[UIImage systemImageNamed:@"ellipsis"]
+    [menuButton setImage:[UIImage systemImageNamed:kMenuIcon]
                 forState:UIControlStateNormal];
     menuButton.backgroundColor = [UIColor colorNamed:kGrey100Color];
     menuButton.clipsToBounds = YES;
-    menuButton.layer.cornerRadius = kMenuButtonSize / 2;
+    menuButton.layer.cornerRadius = kButtonSize / 2;
   } else {
     [menuButton
-        setImage:[[UIImage imageNamed:@"infobar_settings_icon"]
+        setImage:[[UIImage imageNamed:kDiscoverMenuIcon]
                      imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]
         forState:UIControlStateNormal];
     menuButton.tintColor = [UIColor colorNamed:kGrey600Color];
@@ -144,6 +185,28 @@
   }
 }
 
+// Configures and returns the feed header's sorting button.
+- (UIButton*)createSortButton {
+  DCHECK(IsWebChannelsEnabled());
+
+  UIButton* sortButton = [[UIButton alloc] init];
+
+  sortButton.translatesAutoresizingMaskIntoConstraints = NO;
+  sortButton.accessibilityIdentifier = kNTPFeedHeaderSortButtonIdentifier;
+  sortButton.accessibilityLabel =
+      l10n_util::GetNSString(IDS_IOS_FEED_SORT_ACCESSIBILITY_LABEL);
+  [sortButton setImage:[UIImage systemImageNamed:kSortIcon]
+              forState:UIControlStateNormal];
+  sortButton.showsMenuAsPrimaryAction = YES;
+
+  // The sort button is only visible if the Following feed is selected.
+  // TODO(crbug.com/1277974): Determine if the button should show when the feed
+  // is hidden.
+  sortButton.alpha = self.selectedFeed == FeedType::kFollowingFeed ? 1 : 0;
+
+  return sortButton;
+}
+
 // Configures and returns the feed header's title label.
 - (UILabel*)createTitleLabel {
   UILabel* titleLabel = [[UILabel alloc] init];
@@ -161,7 +224,6 @@
 // Configures and returns the segmented control for toggling between feeds.
 - (UISegmentedControl*)createSegmentedControl {
   // Create segmented control with labels.
-  // TODO(crbug.com/1275271): Create string properly.
   NSArray* headerLabels = [NSArray
       arrayWithObjects:l10n_util::GetNSString(IDS_IOS_DISCOVER_FEED_TITLE),
                        l10n_util::GetNSString(IDS_IOS_FOLLOWING_FEED_TITLE),
@@ -207,21 +269,30 @@
                                       self.view.frame.size.width)],
     [self.menuButton.trailingAnchor
         constraintEqualToAnchor:self.container.trailingAnchor
-                       constant:-kMenuButtonHorizontalMargin],
+                       constant:-kButtonHorizontalMargin],
     [self.menuButton.centerYAnchor
         constraintEqualToAnchor:self.container.centerYAnchor],
   ]];
   if (IsWebChannelsEnabled()) {
-    // Anchor segmented control.
     [NSLayoutConstraint activateConstraints:@[
       [self.view.heightAnchor
           constraintEqualToConstant:kWebChannelsHeaderHeight],
+      // Anchor segmented control.
       [self.segmentedControl.centerXAnchor
           constraintEqualToAnchor:self.container.centerXAnchor],
       [self.segmentedControl.centerYAnchor
           constraintEqualToAnchor:self.container.centerYAnchor],
-      [self.menuButton.heightAnchor constraintEqualToConstant:kMenuButtonSize],
-      [self.menuButton.widthAnchor constraintEqualToConstant:kMenuButtonSize],
+      // Set menu button size.
+      [self.menuButton.heightAnchor constraintEqualToConstant:kButtonSize],
+      [self.menuButton.widthAnchor constraintEqualToConstant:kButtonSize],
+      // Anchor sort button and set size.
+      [self.sortButton.heightAnchor constraintEqualToConstant:kButtonSize],
+      [self.sortButton.widthAnchor constraintEqualToConstant:kButtonSize],
+      [self.sortButton.leadingAnchor
+          constraintEqualToAnchor:self.container.leadingAnchor
+                         constant:kButtonHorizontalMargin],
+      [self.sortButton.centerYAnchor
+          constraintEqualToAnchor:self.container.centerYAnchor],
     ]];
   } else {
     // Anchors title label.
@@ -239,16 +310,25 @@
   }
 }
 
+// Handles a new feed being selected from the header.
 - (void)onSegmentSelected:(UISegmentedControl*)segmentedControl {
   switch (segmentedControl.selectedSegmentIndex) {
-    case 0:
+    case static_cast<NSInteger>(FeedType::kDiscoverFeed): {
       [self.feedControlDelegate handleFeedSelected:FeedType::kDiscoverFeed];
+      [UIView animateWithDuration:kSortButtonAnimationDuration
+                       animations:^{
+                         self.sortButton.alpha = 0;
+                       }];
       break;
-    case 1:
+    }
+    case static_cast<NSInteger>(FeedType::kFollowingFeed): {
       [self.feedControlDelegate handleFeedSelected:FeedType::kFollowingFeed];
+      [UIView animateWithDuration:kSortButtonAnimationDuration
+                       animations:^{
+                         self.sortButton.alpha = 1;
+                       }];
       break;
-    default:
-      return;
+    }
   }
 }
 
diff --git a/ios/chrome/browser/ui/ntp/feed_menu_commands.h b/ios/chrome/browser/ui/ntp/feed_menu_commands.h
index 4df28874..2d0d075 100644
--- a/ios/chrome/browser/ui/ntp/feed_menu_commands.h
+++ b/ios/chrome/browser/ui/ntp/feed_menu_commands.h
@@ -8,7 +8,7 @@
 // Protocol for actions relating to the NTP feed top-level control menu.
 @protocol FeedMenuCommands
 
-// Opens Discover feed control menu.
+// Opens feed control menu.
 - (void)openFeedMenu;
 
 @end
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_constants.h b/ios/chrome/browser/ui/ntp/new_tab_page_constants.h
index 5ecabe6..a0e1ecdb 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_constants.h
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_constants.h
@@ -20,6 +20,9 @@
 extern NSString* const kNTPIncognitoViewIdentifier;
 
 // Represents the menu button of the feed header.
-extern NSString* const kNTPFeedHeaderButtonIdentifier;
+extern NSString* const kNTPFeedHeaderMenuButtonIdentifier;
+
+// Represents the sort button of the feed header.
+extern NSString* const kNTPFeedHeaderSortButtonIdentifier;
 
 #endif  // IOS_CHROME_BROWSER_UI_NTP_NEW_TAB_PAGE_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_constants.mm b/ios/chrome/browser/ui/ntp/new_tab_page_constants.mm
index 36ca4b6..be72310 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_constants.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_constants.mm
@@ -12,5 +12,8 @@
 
 NSString* const kNTPIncognitoViewIdentifier = @"kNTPIncognitoViewIdentifier";
 
-NSString* const kNTPFeedHeaderButtonIdentifier =
-    @"kNTPFeedHeaderButtonIdentifier";
+NSString* const kNTPFeedHeaderMenuButtonIdentifier =
+    @"kNTPFeedHeaderMenuButtonIdentifier";
+
+NSString* const kNTPFeedHeaderSortButtonIdentifier =
+    @"kNTPFeedHeaderSortButtonIdentifier";
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
index a9ddad1..6f26776 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
@@ -30,6 +30,7 @@
 #import "ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_views.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_mediator.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
+#include "ios/chrome/browser/ui/omnibox/omnibox_text_field_paste_delegate.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_util.h"
 #include "ios/chrome/browser/ui/omnibox/omnibox_view_controller.h"
 #include "ios/chrome/browser/ui/omnibox/omnibox_view_ios.h"
@@ -56,6 +57,9 @@
 // The mediator for the omnibox.
 @property(nonatomic, strong) OmniboxMediator* mediator;
 
+// The paste delegate for the omnibox that prevents multipasting.
+@property(nonatomic, strong) OmniboxTextFieldPasteDelegate* pasteDelegate;
+
 @end
 
 @implementation OmniboxCoordinator {
@@ -100,6 +104,8 @@
   _editView = std::make_unique<OmniboxViewIOS>(
       self.textField, self.editController, self.mediator,
       self.browser->GetBrowserState(), focuser);
+  self.pasteDelegate = [[OmniboxTextFieldPasteDelegate alloc] init];
+  [self.textField setPasteDelegate:self.pasteDelegate];
 
   self.viewController.textChangeDelegate = _editView.get();
 
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h
index a8a255b..982a149a9 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h
+++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.h
@@ -24,7 +24,6 @@
 class WebOmniboxEditController;
 struct AutocompleteMatch;
 @class OmniboxTextFieldIOS;
-@class OmniboxTextFieldPasteDelegate;
 @protocol OmniboxCommands;
 
 // iOS implementation of OmniBoxView.  Wraps a UITextField and
@@ -198,7 +197,6 @@
 
   OmniboxTextFieldIOS* field_;
 
-  OmniboxTextFieldPasteDelegate* paste_delegate_;
   WebOmniboxEditController* controller_;  // weak, owns us
   __weak id<OmniboxLeftImageConsumer> left_image_consumer_;
   // Focuser, used to transition the location bar to focused/defocused state as
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
index bb0cc2c..70a6952 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_view_ios.mm
@@ -26,7 +26,6 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/ui/commands/omnibox_commands.h"
 #include "ios/chrome/browser/ui/omnibox/chrome_omnibox_client_ios.h"
-#include "ios/chrome/browser/ui/omnibox/omnibox_text_field_paste_delegate.h"
 #import "ios/chrome/browser/ui/omnibox/omnibox_util.h"
 #include "ios/chrome/browser/ui/omnibox/web_omnibox_edit_controller.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
@@ -66,9 +65,6 @@
       ignore_popup_updates_(false),
       popup_provider_(nullptr) {
   DCHECK(field_);
-
-  paste_delegate_ = [[OmniboxTextFieldPasteDelegate alloc] init];
-  [field_ setPasteDelegate:paste_delegate_];
 }
 
 OmniboxViewIOS::~OmniboxViewIOS() = default;
diff --git a/ios/chrome/browser/ui/text_fragments/BUILD.gn b/ios/chrome/browser/ui/text_fragments/BUILD.gn
index de4a81b..7067857 100644
--- a/ios/chrome/browser/ui/text_fragments/BUILD.gn
+++ b/ios/chrome/browser/ui/text_fragments/BUILD.gn
@@ -11,9 +11,11 @@
   ]
   deps = [
     "//components/shared_highlighting/core/common",
+    "//components/shared_highlighting/ios",
     "//ios/chrome/app/strings:ios_strings_grit",
     "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/ui/alert_coordinator",
+    "//ios/chrome/browser/ui/commands:commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/web_state_list",
     "//ios/web/public/text_fragments",
@@ -33,6 +35,7 @@
     "//base",
     "//base/test:test_support",
     "//components/shared_highlighting/core/common",
+    "//components/shared_highlighting/ios",
     "//ios/chrome/app/strings:ios_strings_grit",
     "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/test:eg_test_support+eg2",
diff --git a/ios/chrome/browser/ui/text_fragments/text_fragments_coordinator.mm b/ios/chrome/browser/ui/text_fragments/text_fragments_coordinator.mm
index d9c0ab8..5e1a087 100644
--- a/ios/chrome/browser/ui/text_fragments/text_fragments_coordinator.mm
+++ b/ios/chrome/browser/ui/text_fragments/text_fragments_coordinator.mm
@@ -6,14 +6,19 @@
 
 #import <memory>
 
+#import "components/shared_highlighting/ios/shared_highlighting_constants.h"
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
+#import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/commands/open_new_tab_command.h"
 #import "ios/chrome/browser/ui/text_fragments/text_fragments_mediator.h"
 #import "ios/chrome/browser/web_state_list/web_state_dependency_installer_bridge.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/web/public/text_fragments/text_fragments_manager.h"
 #import "ios/web/public/web_state.h"
 #import "ui/base/l10n/l10n_util.h"
+#import "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -62,11 +67,19 @@
 
   // TODO(crbug.com/1281931): The Learn More and Reshare options are currently
   //     no-ops. This functionality will be implemented in a follow-up patch.
-  [actionSheet addItemWithTitle:l10n_util::GetNSString(
-                                    IDS_IOS_SHARED_HIGHLIGHT_LEARN_MORE)
-                         action:^{
-                         }
-                          style:UIAlertActionStyleDefault];
+  [actionSheet
+      addItemWithTitle:l10n_util::GetNSString(
+                           IDS_IOS_SHARED_HIGHLIGHT_LEARN_MORE)
+                action:^{
+                  id<ApplicationCommands> handler =
+                      HandlerForProtocol(self.browser->GetCommandDispatcher(),
+                                         ApplicationCommands);
+                  [handler openURLInNewTab:[OpenNewTabCommand
+                                               commandWithURLFromChrome:
+                                                   GURL(shared_highlighting::
+                                                            kLearnMoreUrl)]];
+                }
+                 style:UIAlertActionStyleDefault];
   [actionSheet
       addItemWithTitle:l10n_util::GetNSString(IDS_IOS_SHARED_HIGHLIGHT_RESHARE)
                 action:^{
diff --git a/ios/chrome/browser/ui/text_fragments/text_fragments_egtest.mm b/ios/chrome/browser/ui/text_fragments/text_fragments_egtest.mm
index f10f3d8..d60de52 100644
--- a/ios/chrome/browser/ui/text_fragments/text_fragments_egtest.mm
+++ b/ios/chrome/browser/ui/text_fragments/text_fragments_egtest.mm
@@ -4,6 +4,7 @@
 
 #import "base/test/ios/wait_util.h"
 #import "components/shared_highlighting/core/common/shared_highlighting_features.h"
+#import "components/shared_highlighting/ios/shared_highlighting_constants.h"
 #import "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
@@ -132,4 +133,21 @@
   [ChromeEarlGrey waitForWebStateContainingElement:selector];
 }
 
+- (void)testLearnMore {
+  [ChromeEarlGrey loadURL:self.testServer->GetURL(kURLWithFragment)];
+  [ChromeEarlGrey waitForWebStateContainingText:kTestPageTextSample];
+
+  ClickMarkAndWaitForMenu();
+  [[EarlGrey selectElementWithMatcher:grey_text(l10n_util::GetNSString(
+                                          IDS_IOS_SHARED_HIGHLIGHT_LEARN_MORE))]
+      performAction:grey_tap()];
+
+  [ChromeEarlGrey waitForMainTabCount:2];
+
+  // Compare only the host; the path could change upon opening.
+  GREYAssertEqual([ChromeEarlGrey webStateLastCommittedURL].host(),
+                  GURL(shared_highlighting::kLearnMoreUrl).host(),
+                  @"Did not open correct Learn More URL.");
+}
+
 @end
diff --git a/ios/chrome/browser/ui/webui/download_internals_ui.cc b/ios/chrome/browser/ui/webui/download_internals_ui.cc
index e96eac92..99d47fc 100644
--- a/ios/chrome/browser/ui/webui/download_internals_ui.cc
+++ b/ios/chrome/browser/ui/webui/download_internals_ui.cc
@@ -121,8 +121,9 @@
     if (!download_service_)
       return;
 
-    CHECK_GT(args->GetList().size(), 1u) << "Missing argument download URL.";
-    GURL url = GURL(args->GetList()[1].GetString());
+    CHECK_GT(args->GetListDeprecated().size(), 1u)
+        << "Missing argument download URL.";
+    GURL url = GURL(args->GetListDeprecated()[1].GetString());
     if (!url.is_valid()) {
       LOG(WARNING) << "Can't parse download URL, try to enter a valid URL.";
       return;
diff --git a/ios/chrome/browser/ui/webui/flags_ui.mm b/ios/chrome/browser/ui/webui/flags_ui.mm
index 5f14949..c00747c 100644
--- a/ios/chrome/browser/ui/webui/flags_ui.mm
+++ b/ios/chrome/browser/ui/webui/flags_ui.mm
@@ -125,8 +125,8 @@
 void FlagsDOMHandler::HandleRequestExperimentalFeatures(
     const base::ListValue* args) {
   DCHECK(flags_storage_);
-  DCHECK(!args->GetList().empty());
-  const base::Value& callback_id = args->GetList()[0];
+  DCHECK(!args->GetListDeprecated().empty());
+  const base::Value& callback_id = args->GetListDeprecated()[0];
 
   std::vector<base::Value> supported_features;
   std::vector<base::Value> unsupported_features;
@@ -152,7 +152,7 @@
 
 void FlagsDOMHandler::HandleEnableExperimentalFeatureMessage(
     const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   DCHECK(flags_storage_);
   DCHECK_EQ(2u, args_list.size());
   if (args_list.size() != 2)
diff --git a/ios/chrome/browser/ui/webui/gcm/gcm_internals_ui.cc b/ios/chrome/browser/ui/webui/gcm/gcm_internals_ui.cc
index 2e450f8..a14ab94 100644
--- a/ios/chrome/browser/ui/webui/gcm/gcm_internals_ui.cc
+++ b/ios/chrome/browser/ui/webui/gcm/gcm_internals_ui.cc
@@ -79,7 +79,7 @@
 }
 
 void GcmInternalsUIMessageHandler::RequestAllInfo(const base::ListValue* args) {
-  auto args_list = args->GetList();
+  auto args_list = args->GetListDeprecated();
   if (args_list.size() != 1 || !args_list[0].is_bool()) {
     NOTREACHED();
     return;
@@ -106,7 +106,7 @@
 }
 
 void GcmInternalsUIMessageHandler::SetRecording(const base::ListValue* args) {
-  auto args_list = args->GetList();
+  auto args_list = args->GetListDeprecated();
   if (args_list.size() != 1 || !args_list[0].is_bool()) {
     NOTREACHED();
     return;
diff --git a/ios/chrome/browser/ui/webui/inspect/inspect_ui.mm b/ios/chrome/browser/ui/webui/inspect/inspect_ui.mm
index b192c13..fe8ec92a 100644
--- a/ios/chrome/browser/ui/webui/inspect/inspect_ui.mm
+++ b/ios/chrome/browser/ui/webui/inspect/inspect_ui.mm
@@ -95,7 +95,7 @@
 }
 
 void InspectDOMHandler::HandleSetLoggingEnabled(const base::ListValue* args) {
-  auto args_list = args->GetList();
+  auto args_list = args->GetListDeprecated();
   if (args_list.size() != 1) {
     NOTREACHED();
     return;
diff --git a/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm b/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm
index a0b8db39..930d48f 100644
--- a/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm
+++ b/ios/chrome/browser/ui/webui/net_export/net_export_ui.mm
@@ -134,7 +134,7 @@
 void NetExportMessageHandler::OnStartNetLog(const base::ListValue* list) {
   DCHECK_CURRENTLY_ON(web::WebThread::UI);
 
-  base::Value::ConstListView params = list->GetList();
+  base::Value::ConstListView params = list->GetListDeprecated();
 
   // Determine the capture mode.
   net::NetLogCaptureMode capture_mode = net::NetLogCaptureMode::kDefault;
diff --git a/ios/chrome/browser/ui/webui/signin_internals_ui_ios.cc b/ios/chrome/browser/ui/webui/signin_internals_ui_ios.cc
index e86c366..2984d9f 100644
--- a/ios/chrome/browser/ui/webui/signin_internals_ui_ios.cc
+++ b/ios/chrome/browser/ui/webui/signin_internals_ui_ios.cc
@@ -67,7 +67,7 @@
 
 void SignInInternalsHandlerIOS::HandleGetSignInInfo(
     const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   CHECK_GE(args_list.size(), 1u);
   std::string callback_id = args_list[0].GetString();  // CHECKs if non-string.
   base::Value callback(callback_id);
diff --git a/ios/chrome/browser/ui/webui/ukm_internals_ui.mm b/ios/chrome/browser/ui/webui/ukm_internals_ui.mm
index 7d05d54..f7097c5 100644
--- a/ios/chrome/browser/ui/webui/ukm_internals_ui.mm
+++ b/ios/chrome/browser/ui/webui/ukm_internals_ui.mm
@@ -65,7 +65,7 @@
 }
 
 void UkmMessageHandler::HandleRequestUkmData(const base::ListValue* args) {
-  base::Value::ConstListView args_list = args->GetList();
+  base::Value::ConstListView args_list = args->GetListDeprecated();
   base::Value ukm_debug_data =
       ukm::debug::UkmDebugDataExtractor::GetStructuredData(ukm_service_);
 
diff --git a/ios/chrome/browser/ui/webui/user_actions_handler.mm b/ios/chrome/browser/ui/webui/user_actions_handler.mm
index 58c6c4a..09293033 100644
--- a/ios/chrome/browser/ui/webui/user_actions_handler.mm
+++ b/ios/chrome/browser/ui/webui/user_actions_handler.mm
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/metrics/user_metrics.h"
+#include "base/time/time.h"
 #include "base/values.h"
 #include "ios/web/public/webui/web_ui_ios.h"
 
diff --git a/ios/chrome/browser/ui/webui/version_handler.cc b/ios/chrome/browser/ui/webui/version_handler.cc
index c94e91292..b335fb3 100644
--- a/ios/chrome/browser/ui/webui/version_handler.cc
+++ b/ios/chrome/browser/ui/webui/version_handler.cc
@@ -25,8 +25,8 @@
 
 void VersionHandler::HandleRequestVariationInfo(const base::ListValue* args) {
   // Respond with the variations info immediately.
-  CHECK_EQ(2U, args->GetList().size());
-  std::string callback_id = args->GetList()[0].GetString();
+  CHECK_EQ(2U, args->GetListDeprecated().size());
+  std::string callback_id = args->GetListDeprecated()[0].GetString();
 
   base::Value response(base::Value::Type::DICTIONARY);
   response.SetKey(version_ui::kKeyVariationsList,
diff --git a/ios/chrome/test/app/sync_test_util.mm b/ios/chrome/test/app/sync_test_util.mm
index d088d8e3..d2604c8e 100644
--- a/ios/chrome/test/app/sync_test_util.mm
+++ b/ios/chrome/test/app/sync_test_util.mm
@@ -141,7 +141,7 @@
   if (!entities->GetList(model_type_string, &entity_list)) {
     return 0;
   }
-  return entity_list->GetList().size();
+  return entity_list->GetListDeprecated().size();
 }
 
 BOOL VerifyNumberOfSyncEntitiesWithName(syncer::ModelType type,
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 26fcb58..e4b13bb 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-2b32fe92f8bb0c71d103f80691eae45cf34d95bc
\ No newline at end of file
+83dbbd2f52069cc70b6e157420a6bc246f55b3ac
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 54631fd..cc3bd7b 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-6d4b62b7f72c3171de069569f3bfb003b262d564
\ No newline at end of file
+39267668c68f3bbc909380083bacb6ea722850c8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index abceb86..387160d 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-c0849d64e03e04749695196f65e8c8eb53654de1
\ No newline at end of file
+c82e081727f496494767c82dfe1ed58651c073cf
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index ec05d42..8fcefeb 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-4f329587e6c4da681880ecb3dc1bf36266225fbf
\ No newline at end of file
+ae4b4f75a0328c2ba662f6f1adf467e497703036
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
index 29c294c2..bb361fcc 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-6b04c3df9e4e72159401508a93f0309033da7da7
\ No newline at end of file
+a898dff0cb9edee7b210c7b2057f10753839d9b0
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
index c6ebb1e8..1aa3c67 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-e8f9fae1b6c0f60fe8bbc8c1aec57049b0dfc5a0
\ No newline at end of file
+2f265f1b75394f0d725e7bfe5b10d2cc63352a93
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 0a0bd952..be288a5 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-ab81bc05f4477bfb1d9e30d199068ad31fbeac70
\ No newline at end of file
+1f392a7b5cfe17e4fe815f0a76b6cf3188d3294a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 7b284e3..982665f7 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-8f6a4009431e5483c33015cec51047dd2a27f51a
\ No newline at end of file
+081b61bb5d0c3a66f6b223bba35d514256682acb
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 1e4454e..5904bd7 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-5a8e2791c402ecf38a297c615a60a29999d38daf
\ No newline at end of file
+4b59603a0fec87f758bded79c7d808ecf15c51c5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 76d958a1..41fbea4 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-aaeec9f5870eec34a87135e3f3adfe969ee4c812
\ No newline at end of file
+f1f9b6559310777b54dac13df64358457c53eeec
\ No newline at end of file
diff --git a/ios/web/favicon/favicon_java_script_feature.mm b/ios/web/favicon/favicon_java_script_feature.mm
index 7ad3be7..63721f75 100644
--- a/ios/web/favicon/favicon_java_script_feature.mm
+++ b/ios/web/favicon/favicon_java_script_feature.mm
@@ -61,7 +61,7 @@
   const GURL url = message.request_url().value();
 
   std::vector<FaviconURL> urls;
-  if (!ExtractFaviconURL(message.body()->GetList(), url, &urls))
+  if (!ExtractFaviconURL(message.body()->GetListDeprecated(), url, &urls))
     return;
 
   if (!urls.empty())
diff --git a/ios/web/js_messaging/web_frame_impl_unittest.mm b/ios/web/js_messaging/web_frame_impl_unittest.mm
index 15284e02..102c14f 100644
--- a/ios/web/js_messaging/web_frame_impl_unittest.mm
+++ b/ios/web/js_messaging/web_frame_impl_unittest.mm
@@ -318,8 +318,10 @@
       parsed_function_result.value().FindKeyOfType("parameters",
                                                    base::Value::Type::LIST);
   ASSERT_TRUE(decrypted_parameters);
-  ASSERT_EQ(function_params.size(), decrypted_parameters->GetList().size());
-  EXPECT_EQ(plaintext_param, decrypted_parameters->GetList()[0].GetString());
+  ASSERT_EQ(function_params.size(),
+            decrypted_parameters->GetListDeprecated().size());
+  EXPECT_EQ(plaintext_param,
+            decrypted_parameters->GetListDeprecated()[0].GetString());
 
   absl::optional<base::Value> parsed_message_result =
       base::JSONReader::Read(message_plaintext, false);
diff --git a/ios/web/js_messaging/web_view_js_utils_unittest.mm b/ios/web/js_messaging/web_view_js_utils_unittest.mm
index 1382c42..695a6d5 100644
--- a/ios/web/js_messaging/web_view_js_utils_unittest.mm
+++ b/ios/web/js_messaging/web_view_js_utils_unittest.mm
@@ -108,7 +108,7 @@
 
   std::unique_ptr<base::Value> value(web::ValueResultFromWKResult(test_array));
   ASSERT_TRUE(value->is_list());
-  base::Value::ConstListView list = value->GetList();
+  base::Value::ConstListView list = value->GetListDeprecated();
 
   size_t list_size = 3;
   ASSERT_EQ(list_size, list.size());
@@ -182,7 +182,7 @@
   absl::optional<base::Value::ConstListView> inner_list;
 
   ASSERT_TRUE(value->is_list());
-  current_list = value->GetList();
+  current_list = value->GetListDeprecated();
 
   for (int current_depth = 0; current_depth <= kMaximumParsingRecursionDepth;
        current_depth++) {
diff --git a/ios/web/navigation/wk_navigation_util_unittest.mm b/ios/web/navigation/wk_navigation_util_unittest.mm
index 774fc07..1a80bef 100644
--- a/ios/web/navigation/wk_navigation_util_unittest.mm
+++ b/ios/web/navigation/wk_navigation_util_unittest.mm
@@ -172,9 +172,10 @@
       base::Value* urls_value = value_with_error.value->FindKey("urls");
       if (num_items > kMaxSessionSize) {
         ASSERT_EQ(kMaxSessionSize,
-                  static_cast<int>(urls_value->GetList().size()));
+                  static_cast<int>(urls_value->GetListDeprecated().size()));
       } else {
-        ASSERT_EQ(num_items, static_cast<int>(urls_value->GetList().size()));
+        ASSERT_EQ(num_items,
+                  static_cast<int>(urls_value->GetListDeprecated().size()));
       }
     }
   }
@@ -204,12 +205,12 @@
   base::Value* titles_value = value_with_error.value->FindKey("titles");
   ASSERT_TRUE(titles_value);
   ASSERT_TRUE(titles_value->is_list());
-  ASSERT_EQ(kItemCount, titles_value->GetList().size());
+  ASSERT_EQ(kItemCount, titles_value->GetListDeprecated().size());
 
   base::Value* urls_value = value_with_error.value->FindKey("urls");
   ASSERT_TRUE(urls_value);
   ASSERT_TRUE(urls_value->is_list());
-  ASSERT_EQ(kItemCount, urls_value->GetList().size());
+  ASSERT_EQ(kItemCount, urls_value->GetListDeprecated().size());
 }
 
 // Verifies that large session can be stored in NSURL and that extra items
@@ -239,17 +240,20 @@
   ASSERT_TRUE(titles_value);
   ASSERT_TRUE(titles_value->is_list());
   ASSERT_EQ(static_cast<size_t>(kMaxSessionSize),
-            titles_value->GetList().size());
-  ASSERT_EQ("Test0", titles_value->GetList()[0].GetString());
-  ASSERT_EQ("Test74", titles_value->GetList()[kMaxSessionSize - 1].GetString());
+            titles_value->GetListDeprecated().size());
+  ASSERT_EQ("Test0", titles_value->GetListDeprecated()[0].GetString());
+  ASSERT_EQ("Test74",
+            titles_value->GetListDeprecated()[kMaxSessionSize - 1].GetString());
 
   base::Value* urls_value = value_with_error.value->FindKey("urls");
   ASSERT_TRUE(urls_value);
   ASSERT_TRUE(urls_value->is_list());
-  ASSERT_EQ(static_cast<size_t>(kMaxSessionSize), urls_value->GetList().size());
-  ASSERT_EQ("http://www.0.com/", urls_value->GetList()[0].GetString());
+  ASSERT_EQ(static_cast<size_t>(kMaxSessionSize),
+            urls_value->GetListDeprecated().size());
+  ASSERT_EQ("http://www.0.com/",
+            urls_value->GetListDeprecated()[0].GetString());
   ASSERT_EQ("http://www.74.com/",
-            urls_value->GetList()[kMaxSessionSize - 1].GetString());
+            urls_value->GetListDeprecated()[kMaxSessionSize - 1].GetString());
 
   // Verify the offset is correct.
   ASSERT_EQ(1 - kMaxSessionSize,
@@ -283,18 +287,20 @@
   ASSERT_TRUE(titles_value);
   ASSERT_TRUE(titles_value->is_list());
   ASSERT_EQ(static_cast<size_t>(kMaxSessionSize),
-            titles_value->GetList().size());
-  ASSERT_EQ("Test150", titles_value->GetList()[0].GetString());
+            titles_value->GetListDeprecated().size());
+  ASSERT_EQ("Test150", titles_value->GetListDeprecated()[0].GetString());
   ASSERT_EQ("Test224",
-            titles_value->GetList()[kMaxSessionSize - 1].GetString());
+            titles_value->GetListDeprecated()[kMaxSessionSize - 1].GetString());
 
   base::Value* urls_value = value_with_error.value->FindKey("urls");
   ASSERT_TRUE(urls_value);
   ASSERT_TRUE(urls_value->is_list());
-  ASSERT_EQ(static_cast<size_t>(kMaxSessionSize), urls_value->GetList().size());
-  ASSERT_EQ("http://www.150.com/", urls_value->GetList()[0].GetString());
+  ASSERT_EQ(static_cast<size_t>(kMaxSessionSize),
+            urls_value->GetListDeprecated().size());
+  ASSERT_EQ("http://www.150.com/",
+            urls_value->GetListDeprecated()[0].GetString());
   ASSERT_EQ("http://www.224.com/",
-            urls_value->GetList()[kMaxSessionSize - 1].GetString());
+            urls_value->GetListDeprecated()[kMaxSessionSize - 1].GetString());
 
   // Verify the offset is correct.
   ASSERT_EQ(0, value_with_error.value->FindKey("offset")->GetInt());
@@ -328,18 +334,20 @@
   ASSERT_TRUE(titles_value);
   ASSERT_TRUE(titles_value->is_list());
   ASSERT_EQ(static_cast<size_t>(kMaxSessionSize),
-            titles_value->GetList().size());
-  ASSERT_EQ("Test38", titles_value->GetList()[0].GetString());
+            titles_value->GetListDeprecated().size());
+  ASSERT_EQ("Test38", titles_value->GetListDeprecated()[0].GetString());
   ASSERT_EQ("Test112",
-            titles_value->GetList()[kMaxSessionSize - 1].GetString());
+            titles_value->GetListDeprecated()[kMaxSessionSize - 1].GetString());
 
   base::Value* urls_value = value_with_error.value->FindKey("urls");
   ASSERT_TRUE(urls_value);
   ASSERT_TRUE(urls_value->is_list());
-  ASSERT_EQ(static_cast<size_t>(kMaxSessionSize), urls_value->GetList().size());
-  ASSERT_EQ("http://www.38.com/", urls_value->GetList()[0].GetString());
+  ASSERT_EQ(static_cast<size_t>(kMaxSessionSize),
+            urls_value->GetListDeprecated().size());
+  ASSERT_EQ("http://www.38.com/",
+            urls_value->GetListDeprecated()[0].GetString());
   ASSERT_EQ("http://www.112.com/",
-            urls_value->GetList()[kMaxSessionSize - 1].GetString());
+            urls_value->GetListDeprecated()[kMaxSessionSize - 1].GetString());
 
   // Verify the offset is correct.
   ASSERT_EQ((1 - kMaxSessionSize) / 2,
diff --git a/ios/web/webui/mojo_facade.h b/ios/web/webui/mojo_facade.h
index 0fd25c1c..162f5f3 100644
--- a/ios/web/webui/mojo_facade.h
+++ b/ios/web/webui/mojo_facade.h
@@ -5,6 +5,8 @@
 #ifndef IOS_WEB_WEBUI_MOJO_FACADE_H_
 #define IOS_WEB_WEBUI_MOJO_FACADE_H_
 
+#include <objc/objc.h>
+
 #include <map>
 #include <memory>
 #include <string>
diff --git a/ios/web/webui/mojo_facade.mm b/ios/web/webui/mojo_facade.mm
index 3ea9d20..02b033b 100644
--- a/ios/web/webui/mojo_facade.mm
+++ b/ios/web/webui/mojo_facade.mm
@@ -140,7 +140,7 @@
 
   int flags = MOJO_WRITE_MESSAGE_FLAG_NONE;
 
-  const auto& handles_list_storage = handles_list->GetList();
+  const auto& handles_list_storage = handles_list->GetListDeprecated();
   std::vector<MojoHandle> handles(handles_list_storage.size());
   for (size_t i = 0; i < handles_list_storage.size(); i++) {
     int one_handle = handles_list_storage[i].GetInt();
diff --git a/ios/web/webui/web_ui_ios_message_handler.cc b/ios/web/webui/web_ui_ios_message_handler.cc
index d39459a..3ce6092 100644
--- a/ios/web/webui/web_ui_ios_message_handler.cc
+++ b/ios/web/webui/web_ui_ios_message_handler.cc
@@ -13,7 +13,7 @@
 
 bool WebUIIOSMessageHandler::ExtractIntegerValue(const base::ListValue* value,
                                                  int* out_int) {
-  const base::Value& single_element = value->GetList()[0];
+  const base::Value& single_element = value->GetListDeprecated()[0];
   absl::optional<double> double_value = single_element.GetIfDouble();
   if (double_value) {
     *out_int = static_cast<int>(*double_value);
@@ -25,7 +25,7 @@
 
 bool WebUIIOSMessageHandler::ExtractDoubleValue(const base::ListValue* value,
                                                 double* out_value) {
-  const base::Value& single_element = value->GetList()[0];
+  const base::Value& single_element = value->GetListDeprecated()[0];
   absl::optional<double> double_value = single_element.GetIfDouble();
   if (double_value) {
     *out_value = *double_value;
@@ -37,7 +37,7 @@
 
 std::u16string WebUIIOSMessageHandler::ExtractStringValue(
     const base::ListValue* value) {
-  base::Value::ConstListView value_list = value->GetList();
+  base::Value::ConstListView value_list = value->GetListDeprecated();
   if (!value_list.empty() && value_list[0].is_string())
     return base::UTF8ToUTF16(value_list[0].GetString());
   NOTREACHED();
diff --git a/ios/web_view/internal/cwv_flags.mm b/ios/web_view/internal/cwv_flags.mm
index bbcea58..6e90005 100644
--- a/ios/web_view/internal/cwv_flags.mm
+++ b/ios/web_view/internal/cwv_flags.mm
@@ -137,7 +137,7 @@
       const base::Value* options = supportedFeature.FindListKey("options");
       DCHECK(options);
 
-      for (const base::Value& option : options->GetList()) {
+      for (const base::Value& option : options->GetListDeprecated()) {
         DCHECK(option.is_dict());
 
         const std::string* internalName = option.FindStringKey("internal_name");
diff --git a/ipc/ipc_message_utils.cc b/ipc/ipc_message_utils.cc
index 73f51c9..b80fe75 100644
--- a/ipc/ipc_message_utils.cc
+++ b/ipc/ipc_message_utils.cc
@@ -135,8 +135,8 @@
     }
     case base::Value::Type::LIST: {
       const base::ListValue* list = static_cast<const base::ListValue*>(value);
-      WriteParam(m, base::checked_cast<int>(list->GetList().size()));
-      for (const auto& entry : list->GetList()) {
+      WriteParam(m, base::checked_cast<int>(list->GetListDeprecated().size()));
+      for (const auto& entry : list->GetListDeprecated()) {
         WriteValue(m, &entry, recursion + 1);
       }
       break;
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 3a544df..ff53e10 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -284,8 +284,6 @@
     "sinc_resampler.h",
     "status.cc",
     "status.h",
-    "status_codes.cc",
-    "status_codes.h",
     "stream_parser.cc",
     "stream_parser.h",
     "stream_parser_buffer.cc",
diff --git a/media/base/bitrate.cc b/media/base/bitrate.cc
index 36132e7c..bc904df 100644
--- a/media/base/bitrate.cc
+++ b/media/base/bitrate.cc
@@ -8,6 +8,13 @@
 
 namespace media {
 
+// static
+Bitrate Bitrate::VariableBitrate(uint32_t target_bitrate,
+                                 uint32_t peak_bitrate) {
+  DCHECK_GE(peak_bitrate, target_bitrate);
+  return Bitrate(Mode::kVariable, target_bitrate, peak_bitrate);
+}
+
 bool Bitrate::operator==(const Bitrate& right) const {
   return (this->mode_ == right.mode_) && (this->target_ == right.target_) &&
          (this->peak_ == right.peak_);
diff --git a/media/base/bitrate.h b/media/base/bitrate.h
index de36a6f4..1d18962 100644
--- a/media/base/bitrate.h
+++ b/media/base/bitrate.h
@@ -26,13 +26,33 @@
   constexpr Bitrate(const Bitrate& other) = default;
   constexpr Bitrate& operator=(const Bitrate& other) = default;
 
+  // Do not use int or uint64_t variations of these. If you have a signed
+  // or 64-bit value you want to use as input, you must explicitly convert to
+  // uint32_t before calling. This is intended to prevent implicit and unsafe
+  // type conversion.
   static constexpr Bitrate ConstantBitrate(uint32_t target_bitrate) {
-    return Bitrate(Mode::kConstant, target_bitrate, 0u);
+    return Bitrate(Mode::kConstant, target_bitrate, 0);
   }
-  static constexpr Bitrate VariableBitrate(uint32_t target_bitrate,
-                                           uint32_t peak_bitrate) {
-    return Bitrate(Mode::kVariable, target_bitrate, peak_bitrate);
-  }
+  static Bitrate VariableBitrate(uint32_t target_bitrate,
+                                 uint32_t peak_bitrate);
+
+  // Deleted variants: you must SAFELY convert to uint32_t before calling.
+  // See base/numerics/safe_conversions.h for functions to safely convert
+  // between types.
+  static Bitrate ConstantBitrate(int target_bitrate) = delete;
+  static Bitrate VariableBitrate(int target_bitrate, int peak_bitrate) = delete;
+  static Bitrate VariableBitrate(int target_bitrate,
+                                 uint32_t peak_bitrate) = delete;
+  static Bitrate VariableBitrate(uint32_t target_bitrate,
+                                 int peak_bitrate) = delete;
+  static Bitrate ConstantBitrate(uint64_t target_bitrate) = delete;
+  static Bitrate VariableBitrate(uint64_t target_bitrate,
+                                 uint64_t peak_bitrate) = delete;
+  static Bitrate VariableBitrate(uint64_t target_bitrate,
+                                 uint32_t peak_bitrate) = delete;
+  static Bitrate VariableBitrate(uint32_t target_bitrate,
+                                 uint64_t peak_bitrate) = delete;
+
   bool operator==(const Bitrate& right) const;
   bool operator!=(const Bitrate& right) const;
 
diff --git a/media/base/decoder.h b/media/base/decoder.h
index 9afc7d9..b0705fe 100644
--- a/media/base/decoder.h
+++ b/media/base/decoder.h
@@ -5,6 +5,7 @@
 #ifndef MEDIA_BASE_DECODER_H_
 #define MEDIA_BASE_DECODER_H_
 
+#include <ostream>
 #include <string>
 
 #include "media/base/media_export.h"
diff --git a/media/base/decoder_status.h b/media/base/decoder_status.h
index edd2de6..209d4b20 100644
--- a/media/base/decoder_status.h
+++ b/media/base/decoder_status.h
@@ -40,7 +40,7 @@
     kCantChangeCodec = 204,
     kFailedToCreateDecoder = 205,
   };
-  static constexpr StatusGroupType Group() { return "DecoderStatusCodes"; }
+  static constexpr StatusGroupType Group() { return "DecoderStatus"; }
   static constexpr Codes DefaultEnumValue() { return Codes::kOk; }
 };
 
diff --git a/media/base/encoder_status.h b/media/base/encoder_status.h
index 3ec701c..36cb0390 100644
--- a/media/base/encoder_status.h
+++ b/media/base/encoder_status.h
@@ -21,8 +21,11 @@
     kEncoderInitializationError = 7,
     kEncoderFailedFlush = 8,
     kEncoderMojoConnectionError = 9,
+    kUnsupportedFrameFormat = 10,
+    kScalingError = 11,
+    kFormatConversionError = 12,
   };
-  static constexpr StatusGroupType Group() { return "EncoderStatusCodes"; }
+  static constexpr StatusGroupType Group() { return "EncoderStatus"; }
   static constexpr Codes DefaultEnumValue() { return Codes::kOk; }
 };
 
diff --git a/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h
index 4054f53..aa5e11a 100644
--- a/media/base/ipc/media_param_traits_macros.h
+++ b/media/base/ipc/media_param_traits_macros.h
@@ -30,7 +30,6 @@
 #include "media/base/overlay_info.h"
 #include "media/base/pipeline_status.h"
 #include "media/base/sample_format.h"
-#include "media/base/status_codes.h"
 #include "media/base/subsample_entry.h"
 #include "media/base/supported_video_decoder_config.h"
 #include "media/base/video_codecs.h"
@@ -141,8 +140,6 @@
 IPC_ENUM_TRAITS_MAX_VALUE(media::container_names::MediaContainerName,
                           media::container_names::CONTAINER_MAX)
 
-IPC_ENUM_TRAITS_MAX_VALUE(media::StatusCode, media::StatusCode::kMaxValue)
-
 #if BUILDFLAG(ENABLE_MEDIA_DRM_STORAGE)
 IPC_ENUM_TRAITS_MIN_MAX_VALUE(media::MediaDrmKeyType,
                               media::MediaDrmKeyType::MIN,
diff --git a/media/base/media_serializers.h b/media/base/media_serializers.h
index b44da27..2147aca 100644
--- a/media/base/media_serializers.h
+++ b/media/base/media_serializers.h
@@ -16,7 +16,6 @@
 #include "media/base/media_serializers_base.h"
 #include "media/base/renderer_factory_selector.h"
 #include "media/base/status.h"
-#include "media/base/status_codes.h"
 #include "media/base/text_track_config.h"
 #include "media/base/video_decoder_config.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -431,14 +430,6 @@
   }
 };
 
-// enum (simple)
-template <>
-struct MediaSerializer<StatusCode> {
-  static inline base::Value Serialize(StatusCode code) {
-    return base::Value(static_cast<int>(code));
-  }
-};
-
 // Class (complex)
 template <typename T>
 struct MediaSerializer<TypedStatus<T>> {
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 6d425d6..1a5b9274 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -305,6 +305,11 @@
 const base::Feature kMediaCapabilitiesWithParameters{
     "MediaCapabilitiesWithParameters", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Used to set a few tunable parameters for the WebRTC Media Capabilities
+// implementation.
+const base::Feature kWebrtcMediaCapabilitiesParameters{
+    "WebrtcMediaCapabilitiesParameters", base::FEATURE_ENABLED_BY_DEFAULT};
+
 // Display the Cast overlay button on the media controls.
 const base::Feature kMediaCastOverlayButton{"MediaCastOverlayButton",
                                             base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 3caa026d..77e5a97e 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -205,6 +205,7 @@
 MEDIA_EXPORT extern const base::Feature kVideoBlitColorAccuracy;
 MEDIA_EXPORT extern const base::Feature kVp9kSVCHWDecoding;
 MEDIA_EXPORT extern const base::Feature kWakeLockOptimisationHiddenMuted;
+MEDIA_EXPORT extern const base::Feature kWebrtcMediaCapabilitiesParameters;
 MEDIA_EXPORT extern const base::Feature kResolutionBasedDecoderPriority;
 MEDIA_EXPORT extern const base::Feature kForceHardwareVideoDecoders;
 MEDIA_EXPORT extern const base::Feature kForceHardwareAudioDecoders;
diff --git a/media/base/status.h b/media/base/status.h
index 40b3377..65448f8 100644
--- a/media/base/status.h
+++ b/media/base/status.h
@@ -16,7 +16,6 @@
 #include "base/values.h"
 #include "media/base/media_export.h"
 #include "media/base/media_serializers_base.h"
-#include "media/base/status_codes.h"
 
 // Mojo namespaces for serialization friend declarations.
 namespace mojo {
@@ -460,18 +459,6 @@
   return status != code;
 }
 
-// Define TypedStatus<StatusCode> as Status in the media namespace for
-// backwards compatibility. Also define StatusOr as Status::Or for the
-// same reason.
-struct GeneralStatusTraits {
-  using Codes = StatusCode;
-  static constexpr StatusGroupType Group() { return "GeneralStatusCode"; }
-  static constexpr StatusCode DefaultEnumValue() { return StatusCode::kOk; }
-};
-using Status = TypedStatus<GeneralStatusTraits>;
-template <typename T>
-using StatusOr = Status::Or<T>;
-
 // Convenience function to return |kOk|.
 // OK won't have a message, trace, or data associated with them, and DCHECK
 // if they are added.
diff --git a/media/base/status_codes.cc b/media/base/status_codes.cc
deleted file mode 100644
index 2aba1c20..0000000
--- a/media/base/status_codes.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/base/status_codes.h"
-
-namespace media {
-
-// TODO(tmathmeyer) consider a way to get the names, since we don't have
-// the easy c++20 way yet.
-std::ostream& operator<<(std::ostream& os, const StatusCode& code) {
-  return os << std::hex << static_cast<StatusCodeType>(code);
-}
-
-}  // namespace media
diff --git a/media/base/status_codes.h b/media/base/status_codes.h
deleted file mode 100644
index 8407386..0000000
--- a/media/base/status_codes.h
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MEDIA_BASE_STATUS_CODES_H_
-#define MEDIA_BASE_STATUS_CODES_H_
-
-#include <cstdint>
-#include <limits>
-#include <ostream>
-
-#include "media/base/media_export.h"
-
-namespace media {
-
-using StatusCodeType = uint16_t;
-// TODO(tmathmeyer, liberato, xhwang) These numbers are not yet finalized:
-// DO NOT use them for reporting statistics, and DO NOT report them to any
-// user-facing feature, including media log.
-
-// Codes are grouped with a bitmask:
-// 0xFFFF
-//   ├┘└┴ enumeration within the group
-//   └─ group code
-// 256 groups is more than anyone will ever need on a computer.
-enum class StatusCode : StatusCodeType {
-  kOk = 0,
-
-  // General errors: 0x00
-  kAborted = 0x0001,
-  kInvalidArgument = 0x0002,
-  kWrappedError = 0x0004,
-
-  // Format Errors: 0x08
-  kH264ParsingError = 0x0801,
-  kH264BufferTooSmall = 0x0802,
-
-  // Frame operation errors: 0x0A
-  kUnsupportedFrameFormatError = 0x0A01,
-
-  // DecoderStream errors: 0x0B
-  kDecoderStreamInErrorState = 0x0B00,
-  kDecoderStreamReinitFailed = 0x0B01,
-  // This is a temporary error for use while the demuxer doesn't return a
-  // proper status.
-  kDecoderStreamDemuxerError = 0x0B02,
-
-  // Special codes
-  kGenericErrorPleaseRemove = 0x7999,
-  kCodeOnlyForTesting = std::numeric_limits<StatusCodeType>::max(),
-  kMaxValue = kCodeOnlyForTesting,
-};
-
-MEDIA_EXPORT std::ostream& operator<<(std::ostream& os, const StatusCode& code);
-
-}  // namespace media
-
-#endif  // MEDIA_BASE_STATUS_CODES_H_
diff --git a/media/base/status_unittest.cc b/media/base/status_unittest.cc
index 192f500..ba8f6b4 100644
--- a/media/base/status_unittest.cc
+++ b/media/base/status_unittest.cc
@@ -32,36 +32,21 @@
 
 }  // namespace internal
 
-enum class NoDefaultNoOkType : StatusCodeType { kFoo = 0, kBar = 1, kBaz = 2 };
-
-struct NoDefaultNoOkTypeTraits {
-  using Codes = NoDefaultNoOkType;
-  static constexpr StatusGroupType Group() {
-    return "GroupWithNoDefaultNoOkTypeForTests";
-  }
+struct NoOkStatusTypeTraits {
+  enum class Codes : StatusCodeType { kFoo = 0, kBar = 1, kBaz = 2 };
+  static constexpr StatusGroupType Group() { return "NoDefaultNoOkType"; }
 };
 
-enum class NoDefaultHasOkType : StatusCodeType {
-  kOk = 0,
-  kFoo = 1,
-  kBar = 2,
-  kBaz = 3
-};
-
-struct NoDefaultHasOkTypeTraits {
-  using Codes = NoDefaultHasOkType;
-  static constexpr StatusGroupType Group() {
-    return "GroupWithNoDefaultHasOkTypeForTests";
-  }
-};
-
-enum class NonZeroOkType : StatusCodeType {
-  kOk = 100,
-  kFoo = 101,
+struct ZeroValueOkTypeTraits {
+  enum class Codes : StatusCodeType { kOk = 0, kFoo = 1, kBar = 2, kBaz = 3 };
+  static constexpr StatusGroupType Group() { return "ZeroValueOkTypeTraits"; }
 };
 
 struct NonZeroOkTypeTraits {
-  using Codes = NonZeroOkType;
+  enum class Codes : StatusCodeType {
+    kOk = 100,
+    kFoo = 0,
+  };
   static constexpr StatusGroupType Group() { return "GroupWithNonZeroOkType"; }
 };
 
@@ -72,20 +57,21 @@
   }
 };
 
-// Friend class of MediaLog for access to internal constants.
 class StatusTest : public testing::Test {
  public:
-  Status DontFail() { return OkStatus(); }
+  using NormalStatus = TypedStatus<ZeroValueOkTypeTraits>;
+
+  NormalStatus DontFail() { return OkStatus(); }
 
   // Return a failure, with a line number.  Record the lower and upper line
   // number limits so that we can make sure that the error's line is bounded.
   constexpr static int lower_line_limit_ = __LINE__;
-  Status FailEasily() {
-    return Status(StatusCode::kCodeOnlyForTesting, "Message");
+  NormalStatus FailEasily() {
+    return NormalStatus(NormalStatus::Codes::kFoo, "Message");
   }
   constexpr static int upper_line_limit_ = __LINE__;
 
-  Status FailRecursively(unsigned int count) {
+  NormalStatus FailRecursively(unsigned int count) {
     if (!count) {
       return FailEasily();
     }
@@ -93,26 +79,25 @@
   }
 
   template <typename T>
-  Status FailWithData(const char* key, const T& t) {
-    return Status(StatusCode::kCodeOnlyForTesting, "Message", FROM_HERE)
+  NormalStatus FailWithData(const char* key, const T& t) {
+    return NormalStatus(NormalStatus::Codes::kFoo, "Message", FROM_HERE)
         .WithData(key, t);
   }
 
-  Status FailWithCause() {
-    Status err = FailEasily();
+  NormalStatus FailWithCause() {
+    NormalStatus err = FailEasily();
     return FailEasily().AddCause(std::move(err));
   }
 
-  Status DoSomethingGiveItBack(Status me) {
+  NormalStatus DoSomethingGiveItBack(NormalStatus me) {
     me.WithData("data", "Hey you! psst! Help me outta here! I'm trapped!");
     return me;
   }
 
-  // Make sure that the typical usage of StatusOr actually compiles.
-  StatusOr<std::unique_ptr<int>> TypicalStatusOrUsage(bool succeed) {
+  NormalStatus::Or<std::unique_ptr<int>> TypicalStatusOrUsage(bool succeed) {
     if (succeed)
       return std::make_unique<int>(123);
-    return Status(StatusCode::kCodeOnlyForTesting);
+    return NormalStatus::Codes::kFoo;
   }
 
   // Helpers for the Map test case.
@@ -154,21 +139,21 @@
 };
 
 TEST_F(StatusTest, StaticOKMethodGivesCorrectSerialization) {
-  Status ok = DontFail();
+  NormalStatus ok = DontFail();
   base::Value actual = MediaSerialize(ok);
   ASSERT_EQ(actual.GetString(), "Ok");
 }
 
 TEST_F(StatusTest, SingleLayerError) {
-  Status failed = FailEasily();
+  NormalStatus failed = FailEasily();
   base::Value actual = MediaSerialize(failed);
   ASSERT_EQ(actual.DictSize(), 6ul);
   ASSERT_EQ(*actual.FindStringPath("message"), "Message");
-  ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(actual.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(actual.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul);
 
-  const auto& stack = actual.FindListPath("stack")->GetList();
+  const auto& stack = actual.FindListPath("stack")->GetListDeprecated();
   ASSERT_EQ(stack[0].DictSize(), 2ul);  // line and file
 
   // This is a bit fragile, since it's dependent on the file layout.  Just check
@@ -181,104 +166,105 @@
 }
 
 TEST_F(StatusTest, MultipleErrorLayer) {
-  Status failed = FailRecursively(3);
+  NormalStatus failed = FailRecursively(3);
   base::Value actual = MediaSerialize(failed);
   ASSERT_EQ(actual.DictSize(), 6ul);
   ASSERT_EQ(*actual.FindStringPath("message"), "Message");
-  ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 4ul);
-  ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(actual.FindListPath("stack")->GetListDeprecated().size(), 4ul);
+  ASSERT_EQ(actual.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul);
 
-  const auto& stack = actual.FindListPath("stack")->GetList();
+  const auto& stack = actual.FindListPath("stack")->GetListDeprecated();
   ASSERT_EQ(stack[0].DictSize(), 2ul);  // line and file
 }
 
 TEST_F(StatusTest, CanHaveData) {
-  Status failed = FailWithData("example", "data");
+  NormalStatus failed = FailWithData("example", "data");
   base::Value actual = MediaSerialize(failed);
   ASSERT_EQ(actual.DictSize(), 6ul);
   ASSERT_EQ(*actual.FindStringPath("message"), "Message");
-  ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(actual.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(actual.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 1ul);
 
-  const auto& stack = actual.FindListPath("stack")->GetList();
+  const auto& stack = actual.FindListPath("stack")->GetListDeprecated();
   ASSERT_EQ(stack[0].DictSize(), 2ul);  // line and file
 
   ASSERT_EQ(*actual.FindDictPath("data")->FindStringPath("example"), "data");
 }
 
 TEST_F(StatusTest, CanUseCustomSerializer) {
-  Status failed = FailWithData("example", UselessThingToBeSerialized("F"));
+  NormalStatus failed =
+      FailWithData("example", UselessThingToBeSerialized("F"));
   base::Value actual = MediaSerialize(failed);
   ASSERT_EQ(actual.DictSize(), 6ul);
   ASSERT_EQ(*actual.FindStringPath("message"), "Message");
-  ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(actual.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(actual.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 1ul);
 
-  const auto& stack = actual.FindListPath("stack")->GetList();
+  const auto& stack = actual.FindListPath("stack")->GetListDeprecated();
   ASSERT_EQ(stack[0].DictSize(), 2ul);  // line and file
 
   ASSERT_EQ(*actual.FindDictPath("data")->FindStringPath("example"), "F");
 }
 
 TEST_F(StatusTest, CausedByHasVector) {
-  Status causal = FailWithCause();
+  NormalStatus causal = FailWithCause();
   base::Value actual = MediaSerialize(causal);
   ASSERT_EQ(actual.DictSize(), 6ul);
   ASSERT_EQ(*actual.FindStringPath("message"), "Message");
-  ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 1ul);
+  ASSERT_EQ(actual.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(actual.FindListPath("causes")->GetListDeprecated().size(), 1ul);
   ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul);
 
-  base::Value& nested = actual.FindListPath("causes")->GetList()[0];
+  base::Value& nested = actual.FindListPath("causes")->GetListDeprecated()[0];
   ASSERT_EQ(nested.DictSize(), 6ul);
   ASSERT_EQ(*nested.FindStringPath("message"), "Message");
-  ASSERT_EQ(nested.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(nested.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(nested.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(nested.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(nested.FindDictPath("data")->DictSize(), 0ul);
 }
 
 TEST_F(StatusTest, CausedByCanAssignCopy) {
-  Status causal = FailWithCause();
-  Status copy_causal = causal;
+  NormalStatus causal = FailWithCause();
+  NormalStatus copy_causal = causal;
   base::Value causal_serialized = MediaSerialize(causal);
   base::Value copy_causal_serialized = MediaSerialize(copy_causal);
 
   base::Value& original =
-      causal_serialized.FindListPath("causes")->GetList()[0];
+      causal_serialized.FindListPath("causes")->GetListDeprecated()[0];
   ASSERT_EQ(original.DictSize(), 6ul);
   ASSERT_EQ(*original.FindStringPath("message"), "Message");
-  ASSERT_EQ(original.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(original.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(original.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(original.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(original.FindDictPath("data")->DictSize(), 0ul);
 
   base::Value& copied =
-      copy_causal_serialized.FindListPath("causes")->GetList()[0];
+      copy_causal_serialized.FindListPath("causes")->GetListDeprecated()[0];
   ASSERT_EQ(copied.DictSize(), 6ul);
   ASSERT_EQ(*copied.FindStringPath("message"), "Message");
-  ASSERT_EQ(copied.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(copied.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(copied.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(copied.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(copied.FindDictPath("data")->DictSize(), 0ul);
 }
 
 TEST_F(StatusTest, CanCopyEasily) {
-  Status failed = FailEasily();
-  Status withData = DoSomethingGiveItBack(failed);
+  NormalStatus failed = FailEasily();
+  NormalStatus withData = DoSomethingGiveItBack(failed);
 
   base::Value actual = MediaSerialize(failed);
   ASSERT_EQ(actual.DictSize(), 6ul);
   ASSERT_EQ(*actual.FindStringPath("message"), "Message");
-  ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(actual.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(actual.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 0ul);
 
   actual = MediaSerialize(withData);
   ASSERT_EQ(actual.DictSize(), 6ul);
   ASSERT_EQ(*actual.FindStringPath("message"), "Message");
-  ASSERT_EQ(actual.FindListPath("stack")->GetList().size(), 1ul);
-  ASSERT_EQ(actual.FindListPath("causes")->GetList().size(), 0ul);
+  ASSERT_EQ(actual.FindListPath("stack")->GetListDeprecated().size(), 1ul);
+  ASSERT_EQ(actual.FindListPath("causes")->GetListDeprecated().size(), 0ul);
   ASSERT_EQ(actual.FindDictPath("data")->DictSize(), 1ul);
 }
 
@@ -291,7 +277,7 @@
 }
 
 TEST_F(StatusTest, StatusOrWithMoveOnlyType) {
-  StatusOr<std::unique_ptr<int>> status_or(std::make_unique<int>(123));
+  NormalStatus::Or<std::unique_ptr<int>> status_or(std::make_unique<int>(123));
   EXPECT_TRUE(status_or.has_value());
   EXPECT_FALSE(status_or.has_error());
   std::unique_ptr<int> result = std::move(status_or).value();
@@ -300,7 +286,7 @@
 }
 
 TEST_F(StatusTest, StatusOrWithCopyableType) {
-  StatusOr<int> status_or(123);
+  NormalStatus::Or<int> status_or(123);
   EXPECT_TRUE(status_or.has_value());
   EXPECT_FALSE(status_or.has_error());
   int result = std::move(status_or).value();
@@ -309,11 +295,12 @@
 
 TEST_F(StatusTest, StatusOrMoveConstructionAndAssignment) {
   // Make sure that we can move-construct and move-assign a move-only value.
-  StatusOr<std::unique_ptr<int>> status_or_0(std::make_unique<int>(123));
+  NormalStatus::Or<std::unique_ptr<int>> status_or_0(
+      std::make_unique<int>(123));
 
-  StatusOr<std::unique_ptr<int>> status_or_1(std::move(status_or_0));
+  NormalStatus::Or<std::unique_ptr<int>> status_or_1(std::move(status_or_0));
 
-  StatusOr<std::unique_ptr<int>> status_or_2 = std::move(status_or_1);
+  NormalStatus::Or<std::unique_ptr<int>> status_or_2 = std::move(status_or_1);
 
   // |status_or_2| should have gotten the original.
   std::unique_ptr<int> value = std::move(status_or_2).value();
@@ -322,19 +309,19 @@
 
 TEST_F(StatusTest, StatusOrCopyWorks) {
   // Make sure that we can move-construct and move-assign a move-only value.
-  StatusOr<int> status_or_0(123);
-  StatusOr<int> status_or_1(std::move(status_or_0));
-  StatusOr<int> status_or_2 = std::move(status_or_1);
+  NormalStatus::Or<int> status_or_0(123);
+  NormalStatus::Or<int> status_or_1(std::move(status_or_0));
+  NormalStatus::Or<int> status_or_2 = std::move(status_or_1);
   EXPECT_EQ(std::move(status_or_2).value(), 123);
 }
 
 TEST_F(StatusTest, StatusOrCodeIsOkWithValue) {
-  StatusOr<int> status_or(123);
-  EXPECT_EQ(status_or.code(), StatusCode::kOk);
+  NormalStatus::Or<int> status_or(123);
+  EXPECT_EQ(status_or.code(), NormalStatus::Codes::kOk);
 }
 
 TEST_F(StatusTest, TypedStatusWithNoDefaultAndNoOk) {
-  using NDStatus = TypedStatus<NoDefaultNoOkTypeTraits>;
+  using NDStatus = TypedStatus<NoOkStatusTypeTraits>;
 
   NDStatus foo = NDStatus::Codes::kFoo;
   EXPECT_EQ(foo.code(), NDStatus::Codes::kFoo);
@@ -361,7 +348,7 @@
 }
 
 TEST_F(StatusTest, TypedStatusWithNoDefaultHasOk) {
-  using NDStatus = TypedStatus<NoDefaultHasOkTypeTraits>;
+  using NDStatus = TypedStatus<ZeroValueOkTypeTraits>;
 
   NDStatus foo = NDStatus::Codes::kFoo;
   EXPECT_EQ(foo.code(), NDStatus::Codes::kFoo);
@@ -392,15 +379,15 @@
 
 TEST_F(StatusTest, Okayness) {
   EXPECT_FALSE(
-      TypedStatus<NoDefaultNoOkTypeTraits>(NoDefaultNoOkTypeTraits::Codes::kFoo)
+      TypedStatus<NoOkStatusTypeTraits>(NoOkStatusTypeTraits::Codes::kFoo)
           .is_ok());
 
-  EXPECT_FALSE(TypedStatus<NoDefaultHasOkTypeTraits>(
-                   NoDefaultHasOkTypeTraits::Codes::kFoo)
-                   .is_ok());
-  EXPECT_TRUE(TypedStatus<NoDefaultHasOkTypeTraits>(
-                  NoDefaultHasOkTypeTraits::Codes::kOk)
-                  .is_ok());
+  EXPECT_FALSE(
+      TypedStatus<ZeroValueOkTypeTraits>(ZeroValueOkTypeTraits::Codes::kFoo)
+          .is_ok());
+  EXPECT_TRUE(
+      TypedStatus<ZeroValueOkTypeTraits>(ZeroValueOkTypeTraits::Codes::kOk)
+          .is_ok());
 
   EXPECT_FALSE(
       TypedStatus<NonZeroOkTypeTraits>(NonZeroOkTypeTraits::Codes::kFoo)
@@ -411,8 +398,8 @@
 
 TEST_F(StatusTest, CanConvertOkToCode) {
   // OkStatus() should also be convertible to the enum directly.
-  NoDefaultHasOkTypeTraits::Codes code = OkStatus();
-  EXPECT_EQ(code, NoDefaultHasOkTypeTraits::Codes::kOk);
+  ZeroValueOkTypeTraits::Codes code = OkStatus();
+  EXPECT_EQ(code, ZeroValueOkTypeTraits::Codes::kOk);
 }
 
 TEST_F(StatusTest, OkStatusInitializesToOk) {
@@ -420,58 +407,58 @@
   // status traits that has `kOk`.  We only test explicit construction, though
   // this is probably used as an implicit construction in practice when it's
   // a return value.
-  EXPECT_EQ(TypedStatus<NoDefaultHasOkTypeTraits>(OkStatus()).code(),
-            NoDefaultHasOkTypeTraits::Codes::kOk);
+  EXPECT_EQ(TypedStatus<ZeroValueOkTypeTraits>(OkStatus()).code(),
+            ZeroValueOkTypeTraits::Codes::kOk);
   EXPECT_EQ(TypedStatus<NonZeroOkTypeTraits>(OkStatus()).code(),
             NonZeroOkTypeTraits::Codes::kOk);
 }
 
 TEST_F(StatusTest, StatusOrEqOp) {
   // Test the case of a non-default (non-ok) status
-  StatusOr<std::string> failed = FailEasily();
-  ASSERT_TRUE(failed == StatusCode::kCodeOnlyForTesting);
-  ASSERT_FALSE(failed == StatusCode::kOk);
-  ASSERT_TRUE(failed != StatusCode::kOk);
-  ASSERT_FALSE(failed != StatusCode::kCodeOnlyForTesting);
+  NormalStatus::Or<std::string> failed = FailEasily();
+  ASSERT_TRUE(failed == NormalStatus::Codes::kFoo);
+  ASSERT_FALSE(failed == NormalStatus::Codes::kOk);
+  ASSERT_TRUE(failed != NormalStatus::Codes::kOk);
+  ASSERT_FALSE(failed != NormalStatus::Codes::kFoo);
 
-  StatusOr<std::string> success = std::string("Kirkland > Seattle");
-  ASSERT_TRUE(success != StatusCode::kCodeOnlyForTesting);
-  ASSERT_FALSE(success != StatusCode::kOk);
-  ASSERT_TRUE(success == StatusCode::kOk);
-  ASSERT_FALSE(success == StatusCode::kCodeOnlyForTesting);
+  NormalStatus::Or<std::string> success = std::string("Kirkland > Seattle");
+  ASSERT_TRUE(success != NormalStatus::Codes::kFoo);
+  ASSERT_FALSE(success != NormalStatus::Codes::kOk);
+  ASSERT_TRUE(success == NormalStatus::Codes::kOk);
+  ASSERT_FALSE(success == NormalStatus::Codes::kFoo);
 }
 
 TEST_F(StatusTest, OrTypeMapping) {
-  StatusOr<std::string> failed = FailEasily();
-  StatusOr<int> failed_int = std::move(failed).MapValue(
+  NormalStatus::Or<std::string> failed = FailEasily();
+  NormalStatus::Or<int> failed_int = std::move(failed).MapValue(
       [](std::string value) { return atoi(value.c_str()); });
-  ASSERT_TRUE(failed_int == StatusCode::kCodeOnlyForTesting);
+  ASSERT_TRUE(failed_int == NormalStatus::Codes::kFoo);
 
   // Try it with a c++ lambda
-  StatusOr<std::string> success = std::string("12345");
-  StatusOr<int> success_int = std::move(success).MapValue(
+  NormalStatus::Or<std::string> success = std::string("12345");
+  NormalStatus::Or<int> success_int = std::move(success).MapValue(
       [](std::string value) { return atoi(value.c_str()); });
-  ASSERT_TRUE(success_int == StatusCode::kOk);
+  ASSERT_TRUE(success_int == NormalStatus::Codes::kOk);
   ASSERT_EQ(std::move(success_int).value(), 12345);
 
   // try it with a lambda returning-lambda
   auto finder = [](char search) {
-    return [search](std::string seq) -> StatusOr<int> {
+    return [search](std::string seq) -> NormalStatus::Or<int> {
       auto count = std::count(seq.begin(), seq.end(), search);
       if (count == 0)
-        return StatusCode::kCodeOnlyForTesting;
+        return NormalStatus::Codes::kFoo;
       return count;
     };
   };
-  StatusOr<std::string> hw = std::string("hello world");
+  NormalStatus::Or<std::string> hw = std::string("hello world");
 
-  StatusOr<int> success_count = std::move(hw).MapValue(finder('l'));
-  ASSERT_TRUE(success_count == StatusCode::kOk);
+  NormalStatus::Or<int> success_count = std::move(hw).MapValue(finder('l'));
+  ASSERT_TRUE(success_count == NormalStatus::Codes::kOk);
   ASSERT_EQ(std::move(success_count).value(), 3);
 
   hw = std::string("hello world");
-  StatusOr<int> fail_count = std::move(hw).MapValue(finder('x'));
-  ASSERT_TRUE(fail_count == StatusCode::kCodeOnlyForTesting);
+  NormalStatus::Or<int> fail_count = std::move(hw).MapValue(finder('x'));
+  ASSERT_TRUE(fail_count == NormalStatus::Codes::kFoo);
 
   // Test it chained together! the return type should cascade through.
   auto case_0 = GetStartingValue(0).MapValue(UnwrapPtr).MapValue(FindIntSqrt);
@@ -499,7 +486,7 @@
 }
 
 TEST_F(StatusTest, OrTypeMappingToOtherOrType) {
-  using A = TypedStatus<NoDefaultNoOkTypeTraits>;
+  using A = TypedStatus<NoOkStatusTypeTraits>;
   using B = TypedStatus<MapValueCodeTraits>;
 
   auto unwrap = [](std::unique_ptr<int> ptr) -> A::Or<int> {
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index f257a1e..6d98c81f 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -250,7 +250,7 @@
   }
 }
 
-// Compares an `arg` Status.code() to a test-supplied StatusCode.
+// Compares an `arg` TypedStatus<T>.code() to a test-supplied StatusCode.
 MATCHER_P(HasStatusCode, status_code, "") {
   return arg.code() == status_code;
 }
@@ -517,6 +517,12 @@
           base::NumberToString(next_pts_us) + "us");
 }
 
+MATCHER_P2(FrameDurationUnknown, frame_type, pts_us, "") {
+  return CONTAINS_STRING(arg, "Unknown duration for " +
+                                  std::string(frame_type) + " frame at PTS " +
+                                  base::NumberToString(pts_us) + "us");
+}
+
 }  // namespace media
 
 #endif  // MEDIA_BASE_TEST_HELPERS_H_
diff --git a/media/base/video_util.cc b/media/base/video_util.cc
index bc1a496..0e4cb7f 100644
--- a/media/base/video_util.cc
+++ b/media/base/video_util.cc
@@ -17,7 +17,6 @@
 #include "base/time/time.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/raster_interface.h"
-#include "media/base/status_codes.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_frame_pool.h"
 #include "third_party/libyuv/include/libyuv.h"
@@ -743,17 +742,17 @@
                                              dest_pixels, dest_stride, ri);
 }
 
-Status ConvertAndScaleFrame(const VideoFrame& src_frame,
-                            VideoFrame& dst_frame,
-                            std::vector<uint8_t>& tmp_buf) {
+EncoderStatus ConvertAndScaleFrame(const VideoFrame& src_frame,
+                                   VideoFrame& dst_frame,
+                                   std::vector<uint8_t>& tmp_buf) {
   constexpr auto kDefaultFiltering = libyuv::kFilterBox;
   if (!src_frame.IsMappable() || !dst_frame.IsMappable())
-    return Status(StatusCode::kUnsupportedFrameFormatError);
+    return EncoderStatus::Codes::kUnsupportedFrameFormat;
 
   // I420A can only be produced from I420A.
   if (dst_frame.format() == PIXEL_FORMAT_I420A &&
       src_frame.format() != PIXEL_FORMAT_I420A) {
-    return Status(StatusCode::kUnsupportedFrameFormatError);
+    return EncoderStatus::Codes::kUnsupportedFrameFormat;
   }
 
   if ((dst_frame.format() == PIXEL_FORMAT_I420 ||
@@ -782,7 +781,7 @@
           dst_frame.visible_rect().width(), dst_frame.visible_rect().height(),
           kDefaultFiltering);
       if (error)
-        return Status(StatusCode::kInvalidArgument);
+        return EncoderStatus::Codes::kScalingError;
       src_data = tmp_buf.data();
       src_stride = stride;
     }
@@ -800,7 +799,9 @@
           dst_frame.visible_data(VideoFrame::kVPlane),
           dst_frame.stride(VideoFrame::kVPlane),
           dst_frame.visible_rect().width(), dst_frame.visible_rect().height());
-      return error ? Status(StatusCode::kInvalidArgument) : Status();
+      if (error)
+        return EncoderStatus::Codes::kFormatConversionError;
+      return OkStatus();
     }
 
     auto convert_fn = (src_frame.format() == PIXEL_FORMAT_XBGR ||
@@ -813,7 +814,9 @@
         dst_frame.visible_data(VideoFrame::kUVPlane),
         dst_frame.stride(VideoFrame::kUVPlane),
         dst_frame.visible_rect().width(), dst_frame.visible_rect().height());
-    return error ? Status(StatusCode::kInvalidArgument) : Status();
+    if (error)
+      return EncoderStatus::Codes::kFormatConversionError;
+    return OkStatus();
   }
 
   // Converting between YUV formats doesn't change the color space.
@@ -849,7 +852,9 @@
         dst_frame.visible_data(VideoFrame::kVPlane),
         dst_frame.stride(VideoFrame::kVPlane), dst_frame.visible_rect().width(),
         dst_frame.visible_rect().height(), kDefaultFiltering);
-    return error ? Status(StatusCode::kInvalidArgument) : Status();
+    if (error)
+      return EncoderStatus::Codes::kScalingError;
+    return OkStatus();
   }
 
   // Both frames are NV12, only scaling is required.
@@ -867,7 +872,9 @@
         dst_frame.stride(VideoFrame::kUVPlane),
         dst_frame.visible_rect().width(), dst_frame.visible_rect().height(),
         kDefaultFiltering);
-    return error ? Status(StatusCode::kInvalidArgument) : Status();
+    if (error)
+      return EncoderStatus::Codes::kScalingError;
+    return OkStatus();
   }
 
   if (dst_frame.format() == PIXEL_FORMAT_I420 &&
@@ -887,7 +894,9 @@
           dst_frame.visible_data(VideoFrame::kVPlane),
           dst_frame.stride(VideoFrame::kVPlane),
           dst_frame.visible_rect().width(), dst_frame.visible_rect().height());
-      return error ? Status(StatusCode::kInvalidArgument) : Status();
+      if (error)
+        return EncoderStatus::Codes::kFormatConversionError;
+      return OkStatus();
     } else {
       // Both resize and NV12-to-I420 conversion are required.
       // First, split UV planes into two, basically producing a I420 frame.
@@ -923,7 +932,9 @@
           dst_frame.stride(VideoFrame::kVPlane),
           dst_frame.visible_rect().width(), dst_frame.visible_rect().height(),
           kDefaultFiltering);
-      return error ? Status(StatusCode::kInvalidArgument) : Status();
+      if (error)
+        return EncoderStatus::Codes::kScalingError;
+      return OkStatus();
     }
   }
 
@@ -944,7 +955,9 @@
           dst_frame.visible_data(VideoFrame::kUVPlane),
           dst_frame.stride(VideoFrame::kUVPlane),
           dst_frame.visible_rect().width(), dst_frame.visible_rect().height());
-      return error ? Status(StatusCode::kInvalidArgument) : Status();
+      if (error)
+        return EncoderStatus::Codes::kFormatConversionError;
+      return OkStatus();
     } else {
       // Both resize and I420-to-NV12 conversion are required.
       // First, merge U and V planes into one, basically producing a NV12 frame.
@@ -977,11 +990,13 @@
           dst_frame.stride(VideoFrame::kUVPlane),
           dst_frame.visible_rect().width(), dst_frame.visible_rect().height(),
           kDefaultFiltering);
-      return error ? Status(StatusCode::kInvalidArgument) : Status();
+      if (error)
+        return EncoderStatus::Codes::kScalingError;
+      return OkStatus();
     }
   }
 
-  return Status(StatusCode::kUnsupportedFrameFormatError)
+  return EncoderStatus(EncoderStatus::Codes::kUnsupportedFrameFormat)
       .WithData("src", src_frame.AsHumanReadableString())
       .WithData("dst", dst_frame.AsHumanReadableString());
 }
diff --git a/media/base/video_util.h b/media/base/video_util.h
index c0c17da..c778f5ef 100644
--- a/media/base/video_util.h
+++ b/media/base/video_util.h
@@ -10,8 +10,8 @@
 #include <vector>
 
 #include "base/memory/ref_counted.h"
+#include "media/base/encoder_status.h"
 #include "media/base/media_export.h"
-#include "media/base/status.h"
 #include "media/base/video_types.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "ui/gfx/geometry/rect.h"
@@ -190,7 +190,7 @@
 // Copy pixel data from |src_frame| to |dst_frame| applying scaling and pixel
 // format conversion as needed. Both frames need to be mappabale and have either
 // I420 or NV12 pixel format.
-[[nodiscard]] MEDIA_EXPORT Status
+[[nodiscard]] MEDIA_EXPORT EncoderStatus
 ConvertAndScaleFrame(const VideoFrame& src_frame,
                      VideoFrame& dst_frame,
                      std::vector<uint8_t>& tmp_buf);
diff --git a/media/capabilities/BUILD.gn b/media/capabilities/BUILD.gn
index 6abc127..cc54112 100644
--- a/media/capabilities/BUILD.gn
+++ b/media/capabilities/BUILD.gn
@@ -9,6 +9,10 @@
   sources = [ "video_decode_stats.proto" ]
 }
 
+proto_library("webrtc_video_stats_proto") {
+  sources = [ "webrtc_video_stats.proto" ]
+}
+
 source_set("capabilities") {
   # Do not expand the visibility here without double-checking with OWNERS, this
   # is a roll-up target which is part of the //media component. Most other DEPs
@@ -28,10 +32,15 @@
     "video_decode_stats_db_impl.h",
     "video_decode_stats_db_provider.cc",
     "video_decode_stats_db_provider.h",
+    "webrtc_video_stats_db.cc",
+    "webrtc_video_stats_db.h",
+    "webrtc_video_stats_db_impl.cc",
+    "webrtc_video_stats_db_impl.h",
   ]
 
   public_deps = [
     ":video_decode_stats_proto",
+    ":webrtc_video_stats_proto",
     "//base",
     "//components/leveldb_proto",
     "//media/base",
@@ -52,6 +61,8 @@
     "in_memory_video_decode_stats_db_unittest.cc",
     "video_decode_stats_db_impl_unittest.cc",
     "video_decode_stats_db_unittest.cc",
+    "webrtc_video_stats_db_impl_unittest.cc",
+    "webrtc_video_stats_db_unittest.cc",
   ]
 
   deps = [
@@ -59,6 +70,7 @@
     # public_deps), because the generated files seem not to be available through
     # the transitive "capabilities" target (via media:test_support -> media).
     ":video_decode_stats_proto",
+    ":webrtc_video_stats_proto",
     "//base/test:test_support",
     "//components/leveldb_proto:test_support",
     "//media:test_support",
diff --git a/media/capabilities/webrtc_video_stats.proto b/media/capabilities/webrtc_video_stats.proto
new file mode 100644
index 0000000..157952d
--- /dev/null
+++ b/media/capabilities/webrtc_video_stats.proto
@@ -0,0 +1,29 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package media;
+
+message WebrtcVideoStatsProto {
+  // Required. Timestamp of this entry from base::Time::ToJsTimeIgnoringNull().
+  // Data will be discarded when the date indicates its very old. This avoids a
+  // circumstance where a few bad outlier playbacks permanently define a
+  // machines capabilities.
+  optional double timestamp = 1;
+  // Required. Number of frames that this entry is based on.
+  optional uint32 frames_processed = 2;
+  // Required. Number of key frames out of the total number of frames.
+  optional uint32 key_frames_processed = 3;
+  // Required. The 99th percentile of the processing time.
+  optional float p99_processing_time_ms = 4;
+}
+
+// Proto representation of WebrtcVideoStatsDB::VideoStatsEntry. The values are
+// associated with a distinct WebrtcVideoStatsDB::VideoDescKey.
+message WebrtcVideoStatsEntryProto {
+  repeated WebrtcVideoStatsProto stats = 1;
+}
diff --git a/media/capabilities/webrtc_video_stats_db.cc b/media/capabilities/webrtc_video_stats_db.cc
new file mode 100644
index 0000000..9239ecd7
--- /dev/null
+++ b/media/capabilities/webrtc_video_stats_db.cc
@@ -0,0 +1,154 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/capabilities/webrtc_video_stats_db.h"
+
+#include "base/check_op.h"
+#include "base/format_macros.h"
+#include "base/strings/stringprintf.h"
+
+namespace media {
+
+namespace {
+// Validates the codec profile enum in case it's been compromised. Returns
+// VIDEO_CODEC_PROFILE_UNKNOWN if `codec_profile` is outside the valid range.
+VideoCodecProfile ValidateVideoCodecProfile(VideoCodecProfile codec_profile) {
+  if (codec_profile > VIDEO_CODEC_PROFILE_MIN &&
+      codec_profile <= VIDEO_CODEC_PROFILE_MAX) {
+    return codec_profile;
+  }
+  return VIDEO_CODEC_PROFILE_UNKNOWN;
+}
+
+template <typename T, size_t N>
+constexpr size_t array_size(T (&)[N]) {
+  return N;
+}
+
+int GetPixelsBucket(int pixels) {
+  constexpr int kPixelsBuckets[] = {1280 * 720, 1920 * 1080, 3840 * 2160};
+  // The boundaries are calculated as follows:
+  // The first boundary is at 80% of the fist pixel bucket and the last boundary
+  // is at 120% of the last pixels bucket. The boundaries between buckets are
+  // calculated as the point between the two buckets. Anything below the first
+  // boundary or above the last boundary is outside of the valid range.
+  constexpr int kPixelsBoundaries[] = {
+      static_cast<int>(0.8 * kPixelsBuckets[0]),
+      (kPixelsBuckets[0] + kPixelsBuckets[1]) / 2,
+      (kPixelsBuckets[1] + kPixelsBuckets[2]) / 2,
+      static_cast<int>(1.2 * kPixelsBuckets[2])};
+  static_assert(array_size(kPixelsBoundaries) ==
+                array_size(kPixelsBuckets) + 1);
+
+  const int* pixels_bucket_it = std::lower_bound(
+      std::begin(kPixelsBoundaries), std::end(kPixelsBoundaries), pixels);
+  // If `pixels_bucket` points to the first element or the end element it means
+  // that we're outside of the boundaries and should not use this pixel size.
+  // Return 0 in that case.
+  if (pixels_bucket_it != std::begin(kPixelsBoundaries) &&
+      pixels_bucket_it != std::end(kPixelsBoundaries)) {
+    int pixels_bucket_index =
+        (pixels_bucket_it - std::begin(kPixelsBoundaries)) - 1;
+    DCHECK_GE(pixels_bucket_index, 0);
+    DCHECK_LT(pixels_bucket_index,
+              static_cast<int>(array_size(kPixelsBuckets)));
+    return kPixelsBuckets[pixels_bucket_index];
+  }
+  return 0;
+}
+
+}  // namespace
+
+// static
+WebrtcVideoStatsDB::VideoDescKey
+WebrtcVideoStatsDB::VideoDescKey::MakeBucketedKey(
+    bool is_decode_stats,
+    VideoCodecProfile codec_profile,
+    bool hardware_accelerated,
+    int pixels) {
+  // Bucket pixel size to prevent an explosion of one-off values in the
+  // database and add basic guards against fingerprinting.
+  return VideoDescKey(is_decode_stats, ValidateVideoCodecProfile(codec_profile),
+                      hardware_accelerated, GetPixelsBucket(pixels));
+}
+
+WebrtcVideoStatsDB::VideoDescKey::VideoDescKey(bool is_decode_stats,
+                                               VideoCodecProfile codec_profile,
+                                               bool hardware_accelerated,
+                                               int pixels)
+    : is_decode_stats(is_decode_stats),
+      codec_profile(codec_profile),
+      hardware_accelerated(hardware_accelerated),
+      pixels(pixels) {}
+
+std::string WebrtcVideoStatsDB::VideoDescKey::Serialize() const {
+  std::string video_part = base::StringPrintf("%d|%d|%d|%d", is_decode_stats,
+                                              static_cast<int>(codec_profile),
+                                              hardware_accelerated, pixels);
+
+  return video_part;
+}
+
+std::string WebrtcVideoStatsDB::VideoDescKey::ToLogStringForDebug() const {
+  return "Key {" + Serialize() + "}";
+}
+
+WebrtcVideoStatsDB::VideoStats::VideoStats(double timestamp,
+                                           uint32_t frames_processed,
+                                           uint32_t key_frames_processed,
+                                           float p99_processing_time_ms)
+    : timestamp(timestamp),
+      frames_processed(frames_processed),
+      key_frames_processed(key_frames_processed),
+      p99_processing_time_ms(p99_processing_time_ms) {
+  DCHECK_GE(frames_processed, 0u);
+  DCHECK_GE(key_frames_processed, 0u);
+  DCHECK_GE(p99_processing_time_ms, 0);
+}
+
+WebrtcVideoStatsDB::VideoStats::VideoStats(uint32_t frames_processed,
+                                           uint32_t key_frames_processed,
+                                           float p99_processing_time_ms)
+    : VideoStats(/*timestamp=*/0.0,
+                 frames_processed,
+                 key_frames_processed,
+                 p99_processing_time_ms) {}
+
+WebrtcVideoStatsDB::VideoStats::VideoStats(const VideoStats& entry) = default;
+
+WebrtcVideoStatsDB::VideoStats& WebrtcVideoStatsDB::VideoStats::operator=(
+    const VideoStats& entry) = default;
+
+std::string WebrtcVideoStatsDB::VideoStats::ToLogString() const {
+  return base::StringPrintf(
+      "VideoStats {Frames processed:%u, key frames processed:%u, p99 "
+      "processing time:%.2f}",
+      frames_processed, key_frames_processed, p99_processing_time_ms);
+}
+
+bool operator==(const WebrtcVideoStatsDB::VideoDescKey& x,
+                const WebrtcVideoStatsDB::VideoDescKey& y) {
+  return x.is_decode_stats == y.is_decode_stats &&
+         x.codec_profile == y.codec_profile &&
+         x.hardware_accelerated == y.hardware_accelerated &&
+         x.pixels == y.pixels;
+}
+bool operator!=(const WebrtcVideoStatsDB::VideoDescKey& x,
+                const WebrtcVideoStatsDB::VideoDescKey& y) {
+  return !(x == y);
+}
+
+bool operator==(const WebrtcVideoStatsDB::VideoStats& x,
+                const WebrtcVideoStatsDB::VideoStats& y) {
+  return x.timestamp == y.timestamp &&
+         x.frames_processed == y.frames_processed &&
+         x.key_frames_processed == y.key_frames_processed &&
+         x.p99_processing_time_ms == y.p99_processing_time_ms;
+}
+bool operator!=(const WebrtcVideoStatsDB::VideoStats& x,
+                const WebrtcVideoStatsDB::VideoStats& y) {
+  return !(x == y);
+}
+
+}  // namespace media
diff --git a/media/capabilities/webrtc_video_stats_db.h b/media/capabilities/webrtc_video_stats_db.h
new file mode 100644
index 0000000..95613da
--- /dev/null
+++ b/media/capabilities/webrtc_video_stats_db.h
@@ -0,0 +1,117 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_CAPABILITIES_WEBRTC_VIDEO_STATS_DB_H_
+#define MEDIA_CAPABILITIES_WEBRTC_VIDEO_STATS_DB_H_
+
+#include <memory>
+#include <string>
+
+#include "base/callback_forward.h"
+#include "base/check.h"
+#include "media/base/media_export.h"
+#include "media/base/video_codecs.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace media {
+
+// This defines the interface to be used by various media capabilities services
+// to store/retrieve video encoding and decoding performance statistics.
+class MEDIA_EXPORT WebrtcVideoStatsDB {
+ public:
+  // Simple description of video encode/decode complexity, serving as a key to
+  // look up associated VideoStatsEntries in the database.
+  struct MEDIA_EXPORT VideoDescKey {
+    static VideoDescKey MakeBucketedKey(bool is_decode_stats,
+                                        VideoCodecProfile codec_profile,
+                                        bool hardware_accelerated,
+                                        int pixels);
+
+    // Returns a concise string representation of the key for storing in DB.
+    std::string Serialize() const;
+
+    // For debug logging. NOT interchangeable with Serialize().
+    std::string ToLogStringForDebug() const;
+
+    // Note: operator == and != are defined outside this class.
+    const bool is_decode_stats;
+    const VideoCodecProfile codec_profile;
+    const bool hardware_accelerated;
+    const int pixels;
+
+   private:
+    // All key's should be "bucketed" using MakeBucketedKey(...).
+    VideoDescKey(bool is_decode_stats,
+                 VideoCodecProfile codec_profile,
+                 bool hardware_accelerated,
+                 int pixels);
+  };
+
+  struct MEDIA_EXPORT VideoStats {
+    VideoStats(uint32_t frames_processed,
+               uint32_t key_frames_processed,
+               float p99_processing_time_ms);
+    VideoStats(double timestamp,
+               uint32_t frames_processed,
+               uint32_t key_frames_processed,
+               float p99_processing_time_ms);
+    VideoStats(const VideoStats& entry);
+    VideoStats& operator=(const VideoStats& entry);
+
+    // For debug logging.
+    std::string ToLogString() const;
+
+    // Note: operator == and != are defined outside this class.
+    double timestamp;
+    uint32_t frames_processed;
+    uint32_t key_frames_processed;
+    float p99_processing_time_ms;
+  };
+
+  // VideoStatsEntry saved to identify the capabilities related to a given
+  // |VideoDescKey|.
+  using VideoStatsEntry = std::vector<VideoStats>;
+
+  virtual ~WebrtcVideoStatsDB() = default;
+
+  // Run asynchronous initialization of database. Initialization must complete
+  // before calling other APIs. |init_cb| must not be
+  // a null callback.
+  using InitializeCB = base::OnceCallback<void(bool)>;
+  virtual void Initialize(InitializeCB init_cb) = 0;
+
+  // Appends `video_stats` to existing entry associated with `key`. Will create
+  // a new entry if none exists. The operation is asynchronous. The caller
+  // should be aware of potential race conditions when calling this method for
+  // the same `key` very close to other calls. `append_done_cb` will be run with
+  // a bool to indicate whether the save succeeded.
+  using AppendVideoStatsCB = base::OnceCallback<void(bool)>;
+  virtual void AppendVideoStats(const VideoDescKey& key,
+                                const VideoStats& video_stats,
+                                AppendVideoStatsCB append_done_cb) = 0;
+
+  // Returns the stats  associated with `key`. The `get_stats_cb` will receive
+  // the stats in addition to a boolean signaling if the call was successful.
+  // VideoStatsEntry can be nullptr if there was no data associated with `key`.
+  using GetVideoStatsCB =
+      base::OnceCallback<void(bool, std::unique_ptr<VideoStatsEntry>)>;
+  virtual void GetVideoStats(const VideoDescKey& key,
+                             GetVideoStatsCB get_stats_cb) = 0;
+
+  // Clear all statistics from the DB.
+  virtual void ClearStats(base::OnceClosure clear_done_cb) = 0;
+};
+
+MEDIA_EXPORT bool operator==(const WebrtcVideoStatsDB::VideoDescKey& x,
+                             const WebrtcVideoStatsDB::VideoDescKey& y);
+MEDIA_EXPORT bool operator!=(const WebrtcVideoStatsDB::VideoDescKey& x,
+                             const WebrtcVideoStatsDB::VideoDescKey& y);
+MEDIA_EXPORT bool operator==(const WebrtcVideoStatsDB::VideoStats& x,
+                             const WebrtcVideoStatsDB::VideoStats& y);
+MEDIA_EXPORT bool operator!=(const WebrtcVideoStatsDB::VideoStats& x,
+                             const WebrtcVideoStatsDB::VideoStats& y);
+
+}  // namespace media
+
+#endif  // MEDIA_CAPABILITIES_WEBRTC_VIDEO_STATS_DB_H_
diff --git a/media/capabilities/webrtc_video_stats_db_impl.cc b/media/capabilities/webrtc_video_stats_db_impl.cc
new file mode 100644
index 0000000..bb95243ce
--- /dev/null
+++ b/media/capabilities/webrtc_video_stats_db_impl.cc
@@ -0,0 +1,431 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/capabilities/webrtc_video_stats_db_impl.h"
+
+#include <iostream>
+#include <memory>
+#include <string>
+#include <tuple>
+
+#include "base/bind.h"
+#include "base/debug/alias.h"
+#include "base/files/file_path.h"
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/sequence_checker.h"
+#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/default_clock.h"
+#include "components/leveldb_proto/public/proto_database_provider.h"
+#include "media/base/media_switches.h"
+#include "media/capabilities/webrtc_video_stats.pb.h"
+
+namespace media {
+
+using ProtoVideoStatsEntry =
+    leveldb_proto::ProtoDatabase<WebrtcVideoStatsEntryProto>;
+
+namespace {
+
+// Timeout threshold for DB operations. See OnOperationTimeout().
+// NOTE: Used by UmaHistogramOpTime. Change the name if you change the time.
+static constexpr base::TimeDelta kPendingOpTimeout = base::Seconds(30);
+
+// The minimum number of frames processed that a stats entry is based on. The
+// 99th percentile is not useful for anything less than 100 samples.
+constexpr uint32_t kFramesProcessedMinValue = 100;
+// The maximum number of frames processed that a stats entry is based on.
+// Expected max number is around 30000.
+constexpr uint32_t kFramesProcessedMaxValue = 60000;
+// Minimum valid processing time.
+constexpr float kProcessingTimeMinValueMs = 0.0;
+// Maximum valid processing time.
+constexpr float kProcessingTimeMaxValueMs = 10000.0;
+// Default value for maximum number of days until a stats entry is considered
+// expired.
+constexpr int kMaxDaysToKeepStatsDefault = 30;
+// Default value for maximum number of stats entries per config.
+constexpr int kMaxEntriesPerConfigDefault = 10;
+
+void UmaHistogramOpTime(const std::string& op_name, base::TimeDelta duration) {
+  base::UmaHistogramCustomMicrosecondsTimes(
+      "Media.WebrtcVideoStatsDB.OpTiming." + op_name, duration,
+      base::Milliseconds(1), kPendingOpTimeout, 50);
+}
+
+}  // namespace
+
+const char WebrtcVideoStatsDBImpl::kMaxDaysToKeepStatsParamName[] =
+    "db_days_to_keep_stats";
+
+const char WebrtcVideoStatsDBImpl::kMaxEntriesPerConfigParamName[] =
+    "db_max_entries_per_cpnfig";
+
+WebrtcVideoStatsDBImpl::PendingOperation::PendingOperation(
+    std::string uma_str,
+    std::unique_ptr<base::CancelableOnceClosure> timeout_closure)
+    : uma_str_(uma_str),
+      timeout_closure_(std::move(timeout_closure)),
+      start_ticks_(base::TimeTicks::Now()) {
+  DVLOG(3) << __func__ << " Started " << uma_str_;
+}
+
+WebrtcVideoStatsDBImpl::PendingOperation::~PendingOperation() {
+  // Destroying a pending operation that hasn't timed out yet implies the
+  // operation has completed.
+  if (timeout_closure_ && !timeout_closure_->IsCancelled()) {
+    base::TimeDelta op_duration = base::TimeTicks::Now() - start_ticks_;
+    UmaHistogramOpTime(uma_str_, op_duration);
+    DVLOG(3) << __func__ << " Completed " << uma_str_ << " ("
+             << op_duration.InMilliseconds() << ")";
+
+    // Ensure the timeout doesn't fire. Destruction should cancel the callback
+    // implicitly, but that's not a documented contract, so just taking the safe
+    // route.
+    timeout_closure_->Cancel();
+  }
+}
+
+void WebrtcVideoStatsDBImpl::PendingOperation::OnTimeout() {
+  UmaHistogramOpTime(uma_str_, kPendingOpTimeout);
+  LOG(WARNING) << " Timeout performing " << uma_str_
+               << " operation on WebrtcVideoStatsDB";
+
+  // Cancel the closure to ensure we don't double report the task as completed
+  // in ~PendingOperation().
+  timeout_closure_->Cancel();
+}
+
+// static
+int WebrtcVideoStatsDBImpl::GetMaxDaysToKeepStats() {
+  return base::GetFieldTrialParamByFeatureAsInt(
+      kWebrtcMediaCapabilitiesParameters, kMaxDaysToKeepStatsParamName,
+      kMaxDaysToKeepStatsDefault);
+}
+
+// static
+int WebrtcVideoStatsDBImpl::GetMaxEntriesPerConfig() {
+  return base::GetFieldTrialParamByFeatureAsInt(
+      kWebrtcMediaCapabilitiesParameters, kMaxEntriesPerConfigParamName,
+      kMaxEntriesPerConfigDefault);
+}
+
+// static
+std::unique_ptr<WebrtcVideoStatsDBImpl> WebrtcVideoStatsDBImpl::Create(
+    base::FilePath db_dir,
+    leveldb_proto::ProtoDatabaseProvider* db_provider) {
+  DVLOG(2) << __func__ << " db_dir:" << db_dir;
+
+  auto proto_db = db_provider->GetDB<WebrtcVideoStatsEntryProto>(
+      leveldb_proto::ProtoDbType::WEBRTC_VIDEO_STATS_DB, db_dir,
+      base::ThreadPool::CreateSequencedTaskRunner(
+          {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
+           base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}));
+
+  return base::WrapUnique(new WebrtcVideoStatsDBImpl(std::move(proto_db)));
+}
+
+WebrtcVideoStatsDBImpl::WebrtcVideoStatsDBImpl(
+    std::unique_ptr<leveldb_proto::ProtoDatabase<WebrtcVideoStatsEntryProto>>
+        db)
+    : db_(std::move(db)), wall_clock_(base::DefaultClock::GetInstance()) {
+  DCHECK(db_);
+}
+
+WebrtcVideoStatsDBImpl::~WebrtcVideoStatsDBImpl() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
+WebrtcVideoStatsDBImpl::PendingOpId WebrtcVideoStatsDBImpl::StartPendingOp(
+    std::string uma_str) {
+  PendingOpId op_id = next_op_id_++;
+
+  auto timeout_closure = std::make_unique<base::CancelableOnceClosure>(
+      base::BindOnce(&WebrtcVideoStatsDBImpl::OnPendingOpTimeout,
+                     weak_ptr_factory_.GetWeakPtr(), op_id));
+
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, timeout_closure->callback(), kPendingOpTimeout);
+
+  pending_ops_.emplace(op_id, std::make_unique<PendingOperation>(
+                                  uma_str, std::move(timeout_closure)));
+
+  return op_id;
+}
+
+void WebrtcVideoStatsDBImpl::CompletePendingOp(PendingOpId op_id) {
+  // Destructing the PendingOperation will trigger UMA for completion timing.
+  int count = pending_ops_.erase(op_id);
+
+  // No big deal, but very unusual. Timeout is very generous, so tasks that
+  // timeout are generally assumed to be permanently hung.
+  if (!count)
+    DVLOG(2) << __func__ << " DB operation completed after timeout.";
+}
+
+void WebrtcVideoStatsDBImpl::OnPendingOpTimeout(PendingOpId op_id) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  auto it = pending_ops_.find(op_id);
+  DCHECK(it != pending_ops_.end());
+
+  it->second->OnTimeout();
+  pending_ops_.erase(it);
+}
+
+void WebrtcVideoStatsDBImpl::Initialize(InitializeCB init_cb) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(init_cb);
+  DCHECK(!IsInitialized());
+
+  db_->Init(base::BindOnce(&WebrtcVideoStatsDBImpl::OnInit,
+                           weak_ptr_factory_.GetWeakPtr(),
+                           StartPendingOp("Initialize"), std::move(init_cb)));
+}
+
+void WebrtcVideoStatsDBImpl::OnInit(PendingOpId op_id,
+                                    InitializeCB init_cb,
+                                    leveldb_proto::Enums::InitStatus status) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_NE(status, leveldb_proto::Enums::InitStatus::kInvalidOperation);
+  bool success = status == leveldb_proto::Enums::InitStatus::kOK;
+  DVLOG(2) << __func__ << (success ? " succeeded" : " FAILED!");
+  CompletePendingOp(op_id);
+  UMA_HISTOGRAM_BOOLEAN("Media.WebrtcVideoStatsDB.OpSuccess.Initialize",
+                        success);
+
+  db_init_ = true;
+
+  // Can't use DB when initialization fails.
+  if (!success)
+    db_.reset();
+
+  std::move(init_cb).Run(success);
+}
+
+bool WebrtcVideoStatsDBImpl::IsInitialized() {
+  // `db_` will be null if Initialization failed.
+  return db_init_ && db_;
+}
+
+void WebrtcVideoStatsDBImpl::AppendVideoStats(
+    const VideoDescKey& key,
+    const VideoStats& video_stats,
+    AppendVideoStatsCB append_done_cb) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(IsInitialized());
+
+  DVLOG(3) << __func__ << " Reading " << key.ToLogStringForDebug()
+           << " from DB with intent to update with "
+           << video_stats.ToLogString();
+
+  db_->GetEntry(
+      key.Serialize(),
+      base::BindOnce(&WebrtcVideoStatsDBImpl::WriteUpdatedEntry,
+                     weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Read"),
+                     key, video_stats, std::move(append_done_cb)));
+}
+
+void WebrtcVideoStatsDBImpl::GetVideoStats(const VideoDescKey& key,
+                                           GetVideoStatsCB get_stats_cb) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(IsInitialized());
+
+  DVLOG(3) << __func__ << " " << key.ToLogStringForDebug();
+
+  db_->GetEntry(
+      key.Serialize(),
+      base::BindOnce(&WebrtcVideoStatsDBImpl::OnGotVideoStats,
+                     weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Read"),
+                     std::move(get_stats_cb)));
+}
+
+bool WebrtcVideoStatsDBImpl::AreStatsValid(
+    const WebrtcVideoStatsEntryProto* const stats_proto) {
+  // Check for corruption.
+  bool are_stats_valid = stats_proto->stats_size() > 0 &&
+                         stats_proto->stats_size() <= GetMaxEntriesPerConfig();
+
+  // Verify each entry.
+  double previous_timestamp = std::numeric_limits<double>::max();
+  for (auto const& stats_entry : stats_proto->stats()) {
+    // The stats are ordered with the latest entry first.
+    are_stats_valid &= previous_timestamp > stats_entry.timestamp();
+    are_stats_valid &=
+        stats_entry.frames_processed() >= kFramesProcessedMinValue &&
+        stats_entry.frames_processed() <= kFramesProcessedMaxValue;
+    are_stats_valid &=
+        stats_entry.frames_processed() >= stats_entry.key_frames_processed();
+    are_stats_valid &=
+        stats_entry.p99_processing_time_ms() >= kProcessingTimeMinValueMs &&
+        stats_entry.p99_processing_time_ms() <= kProcessingTimeMaxValueMs;
+    previous_timestamp = stats_entry.timestamp();
+  }
+
+  UMA_HISTOGRAM_BOOLEAN("Media.WebrtcVideoStatsDB.OpSuccess.Validate",
+                        are_stats_valid);
+  return are_stats_valid;
+}
+
+void WebrtcVideoStatsDBImpl::WriteUpdatedEntry(
+    PendingOpId op_id,
+    const VideoDescKey& key,
+    const VideoStats& new_video_stats,
+    AppendVideoStatsCB append_done_cb,
+    bool read_success,
+    std::unique_ptr<WebrtcVideoStatsEntryProto> existing_entry_proto) {
+  DVLOG(3) << __func__;
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(IsInitialized());
+  CompletePendingOp(op_id);
+
+  // Note: outcome of "Write" operation logged in OnEntryUpdated().
+  UMA_HISTOGRAM_BOOLEAN("Media.WebrtcVideoStatsDB.OpSuccess.Read",
+                        read_success);
+
+  if (!read_success) {
+    DVLOG(2) << __func__ << " FAILED DB read for " << key.ToLogStringForDebug()
+             << "; ignoring update!";
+    std::move(append_done_cb).Run(false);
+    return;
+  }
+
+  if (!existing_entry_proto || !AreStatsValid(existing_entry_proto.get())) {
+    // Default instance will not have any stats entries.
+    existing_entry_proto = std::make_unique<WebrtcVideoStatsEntryProto>();
+  }
+
+  // Create a new entry, with new stats in the front and copy any existing stats
+  // to the back.
+  WebrtcVideoStatsEntryProto new_entry_proto;
+  media::WebrtcVideoStatsProto* new_stats = new_entry_proto.add_stats();
+  DCHECK(new_stats);
+  new_stats->set_frames_processed(new_video_stats.frames_processed);
+  new_stats->set_key_frames_processed(new_video_stats.key_frames_processed);
+  new_stats->set_p99_processing_time_ms(new_video_stats.p99_processing_time_ms);
+  new_stats->set_timestamp(wall_clock_->Now().ToJsTimeIgnoringNull());
+
+  DVLOG(3) << "Adding new stats entry:" << new_stats->timestamp() << ", "
+           << new_stats->frames_processed() << ",  "
+           << new_stats->key_frames_processed() << ", "
+           << new_stats->p99_processing_time_ms();
+
+  // Append existing entries.
+  const int kMaxDaysToKeepStats = GetMaxDaysToKeepStats();
+  const int kMaxEntriesPerConfig = GetMaxEntriesPerConfig();
+  DCHECK_GT(kMaxDaysToKeepStats, 0);
+  double previous_timestamp = new_stats->timestamp();
+  for (auto const& existing_stats : existing_entry_proto->stats()) {
+    // Discard existing stats that have expired, if the entry is full, or if the
+    // timestamps come in the wrong order.
+    if (wall_clock_->Now() -
+                base::Time::FromJsTime(existing_stats.timestamp()) <=
+            base::Days(kMaxDaysToKeepStats) &&
+        new_entry_proto.stats_size() < kMaxEntriesPerConfig &&
+        existing_stats.timestamp() < previous_timestamp) {
+      previous_timestamp = existing_stats.timestamp();
+      media::WebrtcVideoStatsProto* stats = new_entry_proto.add_stats();
+      DCHECK(stats);
+      *stats = existing_stats;
+      DVLOG(3) << " appending existing stats:" << existing_stats.timestamp()
+               << ", " << existing_stats.frames_processed() << ",  "
+               << existing_stats.key_frames_processed() << ", "
+               << existing_stats.p99_processing_time_ms();
+    }
+  }
+
+  // Make sure we never write bogus stats into the DB! While its possible the DB
+  // may experience some corruption (disk), we should have detected that above
+  // and discarded any bad data prior to this upcoming save.
+  DCHECK(AreStatsValid(&new_entry_proto));
+
+  // Push the update to the DB.
+  using DBType = leveldb_proto::ProtoDatabase<WebrtcVideoStatsEntryProto>;
+  std::unique_ptr<DBType::KeyEntryVector> entries =
+      std::make_unique<DBType::KeyEntryVector>();
+  entries->emplace_back(key.Serialize(), new_entry_proto);
+  db_->UpdateEntries(
+      std::move(entries), std::make_unique<leveldb_proto::KeyVector>(),
+      base::BindOnce(&WebrtcVideoStatsDBImpl::OnEntryUpdated,
+                     weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Write"),
+                     std::move(append_done_cb)));
+}
+
+void WebrtcVideoStatsDBImpl::OnEntryUpdated(PendingOpId op_id,
+                                            AppendVideoStatsCB append_done_cb,
+                                            bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOG(3) << __func__ << " update " << (success ? "succeeded" : "FAILED!");
+  CompletePendingOp(op_id);
+  UMA_HISTOGRAM_BOOLEAN("Media.WebrtcVideoStatsDB.OpSuccess.Write", success);
+  std::move(append_done_cb).Run(success);
+}
+
+void WebrtcVideoStatsDBImpl::OnGotVideoStats(
+    PendingOpId op_id,
+    GetVideoStatsCB get_stats_cb,
+    bool success,
+    std::unique_ptr<WebrtcVideoStatsEntryProto> stats_proto) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOG(3) << __func__ << " get " << (success ? "succeeded" : "FAILED!");
+  CompletePendingOp(op_id);
+  UMA_HISTOGRAM_BOOLEAN("Media.WebrtcVideoStatsDB.OpSuccess.Read", success);
+
+  // Convert from WebrtcVideoStatsEntryProto to VideoStatsEntry.
+  std::unique_ptr<VideoStatsEntry> entry;
+  if (stats_proto && AreStatsValid(stats_proto.get())) {
+    DCHECK(success);
+    const int kMaxDaysToKeepStats = GetMaxDaysToKeepStats();
+    entry = std::make_unique<VideoStatsEntry>();
+    for (auto const& stats : stats_proto->stats()) {
+      if (wall_clock_->Now() - base::Time::FromJsTime(stats.timestamp()) <=
+          base::Days(kMaxDaysToKeepStats)) {
+        entry->emplace_back(stats.timestamp(), stats.frames_processed(),
+                            stats.key_frames_processed(),
+                            stats.p99_processing_time_ms());
+      }
+    }
+
+    // Clear the pointer if all stats were expired.
+    if (entry->size() == 0) {
+      entry.reset();
+    }
+  }
+
+  std::move(get_stats_cb).Run(success, std::move(entry));
+}
+
+void WebrtcVideoStatsDBImpl::ClearStats(base::OnceClosure clear_done_cb) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOG(2) << __func__;
+
+  db_->UpdateEntriesWithRemoveFilter(
+      std::make_unique<ProtoVideoStatsEntry::KeyEntryVector>(),
+      base::BindRepeating([](const std::string& key) { return true; }),
+      base::BindOnce(&WebrtcVideoStatsDBImpl::OnStatsCleared,
+                     weak_ptr_factory_.GetWeakPtr(), StartPendingOp("Clear"),
+                     std::move(clear_done_cb)));
+}
+
+void WebrtcVideoStatsDBImpl::OnStatsCleared(PendingOpId op_id,
+                                            base::OnceClosure clear_done_cb,
+                                            bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DVLOG(2) << __func__ << (success ? " succeeded" : " FAILED!");
+
+  CompletePendingOp(op_id);
+
+  UMA_HISTOGRAM_BOOLEAN("Media.WebrtcVideoStatsDB.OpSuccess.Clear", success);
+
+  // We don't pass success to `clear_done_cb`. Clearing is best effort and
+  // there is no additional action for callers to take in case of failure.
+  std::move(clear_done_cb).Run();
+}
+
+}  // namespace media
diff --git a/media/capabilities/webrtc_video_stats_db_impl.h b/media/capabilities/webrtc_video_stats_db_impl.h
new file mode 100644
index 0000000..af84ffc9
--- /dev/null
+++ b/media/capabilities/webrtc_video_stats_db_impl.h
@@ -0,0 +1,202 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_CAPABILITIES_WEBRTC_VIDEO_STATS_DB_IMPL_H_
+#define MEDIA_CAPABILITIES_WEBRTC_VIDEO_STATS_DB_IMPL_H_
+
+#include <memory>
+
+#include "base/cancelable_callback.h"
+#include "base/containers/flat_map.h"
+#include "base/files/file_path.h"
+#include "base/memory/weak_ptr.h"
+#include "base/metrics/field_trial_params.h"
+#include "components/leveldb_proto/public/proto_database.h"
+#include "media/base/media_export.h"
+#include "media/base/video_codecs.h"
+#include "media/capabilities/webrtc_video_stats_db.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace base {
+class FilePath;
+class Clock;
+}  // namespace base
+
+namespace leveldb_proto {
+class ProtoDatabaseProvider;
+}  // namespace leveldb_proto
+
+namespace media {
+
+class WebrtcVideoStatsEntryProto;
+
+// LevelDB implementation of WebrtcVideoStatsDB. This class is not
+// thread safe. All API calls should happen on the same sequence used for
+// construction. API callbacks will also occur on this sequence.
+class MEDIA_EXPORT WebrtcVideoStatsDBImpl : public WebrtcVideoStatsDB {
+ public:
+  static const char kMaxDaysToKeepStatsParamName[];
+  static const char kMaxEntriesPerConfigParamName[];
+
+  // Create an instance! `db_dir` specifies where to store LevelDB files to
+  // disk. LevelDB generates a handful of files, so its recommended to provide a
+  // dedicated directory to keep them isolated.
+  static std::unique_ptr<WebrtcVideoStatsDBImpl> Create(
+      base::FilePath db_dir,
+      leveldb_proto::ProtoDatabaseProvider* db_provider);
+
+  ~WebrtcVideoStatsDBImpl() override;
+  WebrtcVideoStatsDBImpl(const WebrtcVideoStatsDBImpl&) = delete;
+  WebrtcVideoStatsDBImpl& operator=(const WebrtcVideoStatsDBImpl&) = delete;
+
+  // Implement WebrtcVideoStatsDB.
+  void Initialize(InitializeCB init_cb) override;
+  void AppendVideoStats(const VideoDescKey& key,
+                        const VideoStats& video_stats,
+                        AppendVideoStatsCB append_done_cb) override;
+  void GetVideoStats(const VideoDescKey& key,
+                     GetVideoStatsCB get_stats_cb) override;
+  void ClearStats(base::OnceClosure clear_done_cb) override;
+
+ private:
+  friend class WebrtcVideoStatsDBImplTest;
+
+  using PendingOpId = int;
+
+  // Private constructor only called by tests (friends). Production code
+  // should always use the static Create() method.
+  explicit WebrtcVideoStatsDBImpl(
+      std::unique_ptr<leveldb_proto::ProtoDatabase<WebrtcVideoStatsEntryProto>>
+          db);
+
+  // Number of days after which a stats entry will be discarded. This
+  // avoids users getting stuck with a bad capability prediction that may have
+  // been due to one-off circumstances.
+  static int GetMaxDaysToKeepStats();
+  // Number of stats entries that are stored per configuration. The oldest
+  // stats entry will be discarded when new stats are added if the list is
+  // already full.
+  static int GetMaxEntriesPerConfig();
+
+  // Creates a PendingOperation using `uma_str` and adds it to `pending_ops_`
+  // map. Returns PendingOpId for newly started operation. Callers must later
+  // call CompletePendingOp() with this id to destroy the PendingOperation and
+  // finalize timing UMA.
+  PendingOpId StartPendingOp(std::string uma_str);
+
+  // Removes PendingOperation from `pending_ops_` using `op_id_` as a key. This
+  // destroys the object and triggers timing UMA.
+  void CompletePendingOp(PendingOpId op_id);
+
+  // Unified handler for timeouts of pending DB operations. PendingOperation
+  // will be notified that it timed out (to trigger timing UMA) and removed from
+  // `pending_ops_`.
+  void OnPendingOpTimeout(PendingOpId id);
+
+  // Helper to report timing information for DB operations, including when they
+  // hang indefinitely.
+  class PendingOperation {
+   public:
+    PendingOperation(
+        std::string uma_str,
+        std::unique_ptr<base::CancelableOnceClosure> timeout_closure);
+    // Records task timing UMA if it hasn't already timed out.
+    virtual ~PendingOperation();
+
+    // Copies disallowed. Incompatible with move-only members and UMA logging in
+    // the destructor.
+    PendingOperation(const PendingOperation&) = delete;
+    PendingOperation& operator=(const PendingOperation&) = delete;
+
+    // Trigger UMA recording for timeout.
+    void OnTimeout();
+
+   private:
+    friend class WebrtcVideoStatsDBImplTest;
+
+    std::string uma_str_;
+    std::unique_ptr<base::CancelableOnceClosure> timeout_closure_;
+    base::TimeTicks start_ticks_;
+  };
+
+  // Map of operation id -> outstanding PendingOperations.
+  base::flat_map<PendingOpId, std::unique_ptr<PendingOperation>> pending_ops_;
+
+  // Called when the database has been initialized. Will immediately call
+  // `init_cb` to forward `success`.
+  void OnInit(PendingOpId id,
+              InitializeCB init_cb,
+              leveldb_proto::Enums::InitStatus status);
+
+  // Returns true if the DB is successfully initialized.
+  bool IsInitialized();
+
+  // Passed as the callback for `OnGotVideoStats` by `AppendVideoStats` to
+  // update the database once we've read the existing stats entry.
+  void WriteUpdatedEntry(
+      PendingOpId op_id,
+      const VideoDescKey& key,
+      const VideoStats& new_video_stats,
+      AppendVideoStatsCB append_done_cb,
+      bool read_success,
+      std::unique_ptr<WebrtcVideoStatsEntryProto> stats_proto);
+
+  // Called when the database has been modified after a call to
+  // `WriteUpdatedEntry`. Will run `append_done_cb` when done.
+  void OnEntryUpdated(PendingOpId op_id,
+                      AppendVideoStatsCB append_done_cb,
+                      bool success);
+
+  // Called when GetVideoStats() operation was performed. `get_stats_cb`
+  // will be run with `success` and a `VideoStatsEntry` created from
+  // `stats_proto` or nullptr if no entry was found for the requested key.
+  void OnGotVideoStats(PendingOpId op_id,
+                       GetVideoStatsCB get_stats_cb,
+                       bool success,
+                       std::unique_ptr<WebrtcVideoStatsEntryProto> stats_proto);
+
+  // Internal callback for OnLoadAllKeysForClearing(), initially triggered by
+  // ClearStats(). Method simply logs `success` and runs `clear_done_cb`.
+  void OnStatsCleared(PendingOpId op_id,
+                      base::OnceClosure clear_done_cb,
+                      bool success);
+
+  // Validates the stats entry. If true is returned the stats are sorted in the
+  // correct order and contain values that are somewhat reasonable.
+  bool AreStatsValid(const WebrtcVideoStatsEntryProto* const stats_proto);
+
+  void set_wall_clock_for_test(const base::Clock* tick_clock) {
+    wall_clock_ = tick_clock;
+  }
+
+  // Next PendingOpId for use in `pending_ops_` map. See StartPendingOp().
+  PendingOpId next_op_id_ = 0;
+
+  // Indicates whether initialization is completed. Does not indicate whether it
+  // was successful. Will be reset upon calling DestroyStats(). Failed
+  // initialization is signaled by setting `db_` to null.
+  bool db_init_ = false;
+
+  // ProtoDatabase instance. Set to nullptr if fatal database error is
+  // encountered. Each entry in the DB is expected to be around 200 bytes. It is
+  // expected that there will be at most ~100 entries so the total database size
+  // is expected to not exceed 20 kB.
+  std::unique_ptr<leveldb_proto::ProtoDatabase<WebrtcVideoStatsEntryProto>> db_;
+
+  // For getting wall-clock time. Tests may override via
+  // set_wall_clock_for_test().
+  const base::Clock* wall_clock_ = nullptr;
+
+  // Ensures all access to class members come on the same sequence. API calls
+  // and callbacks should occur on the same sequence used during construction.
+  // LevelDB operations happen on a separate task runner, but all LevelDB
+  // callbacks to this happen on the checked sequence.
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  base::WeakPtrFactory<WebrtcVideoStatsDBImpl> weak_ptr_factory_{this};
+};
+
+}  // namespace media
+
+#endif  // MEDIA_CAPABILITIES_WEBRTC_VIDEO_STATS_DB_IMPL_H_
diff --git a/media/capabilities/webrtc_video_stats_db_impl_unittest.cc b/media/capabilities/webrtc_video_stats_db_impl_unittest.cc
new file mode 100644
index 0000000..c4d5b0e
--- /dev/null
+++ b/media/capabilities/webrtc_video_stats_db_impl_unittest.cc
@@ -0,0 +1,521 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <map>
+#include <memory>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/callback_helpers.h"
+#include "base/check.h"
+#include "base/files/file_path.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/raw_ptr.h"
+#include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/simple_test_clock.h"
+#include "base/test/task_environment.h"
+#include "components/leveldb_proto/testing/fake_db.h"
+#include "media/base/media_switches.h"
+#include "media/base/test_data_util.h"
+#include "media/base/video_codecs.h"
+#include "media/capabilities/webrtc_video_stats.pb.h"
+#include "media/capabilities/webrtc_video_stats_db_impl.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/size.h"
+
+using leveldb_proto::test::FakeDB;
+using testing::_;
+using testing::Eq;
+using testing::Pointee;
+
+namespace media {
+
+class WebrtcVideoStatsDBImplTest : public ::testing::Test {
+ public:
+  using VideoDescKey = WebrtcVideoStatsDB::VideoDescKey;
+  using VideoStats = WebrtcVideoStatsDB::VideoStats;
+  using VideoStatsEntry = WebrtcVideoStatsDB::VideoStatsEntry;
+
+  WebrtcVideoStatsDBImplTest()
+      : kDecodeStatsKeyVp9(
+            VideoDescKey::MakeBucketedKey(/*is_decode_stats=*/true,
+                                          VP9PROFILE_PROFILE3,
+                                          /*hardware_accelerated=*/false,
+                                          1280 * 720)),
+        kDecodeStatsKeyH264(
+            VideoDescKey::MakeBucketedKey(/*is_decode_stats=*/true,
+                                          H264PROFILE_MIN,
+                                          /*hardware_accelerated=*/false,
+                                          1920 * 1080)),
+        kEncodeStatsKeyVp9(
+            VideoDescKey::MakeBucketedKey(/*is_decode_stats=*/false,
+                                          VP9PROFILE_PROFILE3,
+                                          /*hardware_accelerated=*/false,
+                                          1280 * 720)) {
+    // Fake DB simply wraps a std::map with the LevelDB interface. We own the
+    // map and will delete it in TearDown().
+    fake_db_map_ =
+        std::make_unique<FakeDB<WebrtcVideoStatsEntryProto>::EntryMap>();
+    // `stats_db_` will own this pointer, but we hold a reference to control
+    // its behavior.
+    fake_db_ = new FakeDB<WebrtcVideoStatsEntryProto>(fake_db_map_.get());
+
+    // Wrap the fake proto DB with our interface.
+    stats_db_ = base::WrapUnique(new WebrtcVideoStatsDBImpl(
+        std::unique_ptr<FakeDB<WebrtcVideoStatsEntryProto>>(fake_db_)));
+  }
+
+  WebrtcVideoStatsDBImplTest(const WebrtcVideoStatsDBImplTest&) = delete;
+  WebrtcVideoStatsDBImplTest& operator=(const WebrtcVideoStatsDBImplTest&) =
+      delete;
+
+  ~WebrtcVideoStatsDBImplTest() override {
+    // Tests should always complete any pending operations
+    VerifyNoPendingOps();
+  }
+
+  void VerifyOnePendingOp(std::string op_name) {
+    EXPECT_EQ(stats_db_->pending_ops_.size(), 1u);
+    WebrtcVideoStatsDBImpl::PendingOperation* pending_op =
+        stats_db_->pending_ops_.begin()->second.get();
+    EXPECT_EQ(pending_op->uma_str_, op_name);
+  }
+
+  void VerifyNoPendingOps() { EXPECT_TRUE(stats_db_->pending_ops_.empty()); }
+
+  int GetMaxDaysToKeepStats() {
+    return WebrtcVideoStatsDBImpl::GetMaxDaysToKeepStats();
+  }
+
+  int GetMaxEntriesPerConfig() {
+    return WebrtcVideoStatsDBImpl::GetMaxEntriesPerConfig();
+  }
+
+  void SetDBClock(base::Clock* clock) {
+    stats_db_->set_wall_clock_for_test(clock);
+  }
+
+  void InitializeDB() {
+    stats_db_->Initialize(base::BindOnce(
+        &WebrtcVideoStatsDBImplTest::OnInitialize, base::Unretained(this)));
+    EXPECT_CALL(*this, OnInitialize(true));
+    fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kOK);
+    testing::Mock::VerifyAndClearExpectations(this);
+  }
+
+  void AppendStats(const VideoDescKey& key, const VideoStats& entry) {
+    EXPECT_CALL(*this, MockAppendVideoStatsCb(true));
+    stats_db_->AppendVideoStats(
+        key, entry,
+        base::BindOnce(&WebrtcVideoStatsDBImplTest::MockAppendVideoStatsCb,
+                       base::Unretained(this)));
+    VerifyOnePendingOp("Read");
+    fake_db_->GetCallback(true);
+    VerifyOnePendingOp("Write");
+    fake_db_->UpdateCallback(true);
+    testing::Mock::VerifyAndClearExpectations(this);
+  }
+
+  void VerifyReadStats(const VideoDescKey& key,
+                       const VideoStatsEntry& expected) {
+    EXPECT_CALL(*this, MockGetVideoStatsCb(true, Pointee(Eq(expected))));
+    stats_db_->GetVideoStats(
+        key, base::BindOnce(&WebrtcVideoStatsDBImplTest::GetVideoStatsCb,
+                            base::Unretained(this)));
+    VerifyOnePendingOp("Read");
+    fake_db_->GetCallback(true);
+    testing::Mock::VerifyAndClearExpectations(this);
+  }
+
+  void VerifyEmptyStats(const VideoDescKey& key) {
+    EXPECT_CALL(*this, MockGetVideoStatsCb(true, nullptr));
+    stats_db_->GetVideoStats(
+        key, base::BindOnce(&WebrtcVideoStatsDBImplTest::GetVideoStatsCb,
+                            base::Unretained(this)));
+    VerifyOnePendingOp("Read");
+    fake_db_->GetCallback(true);
+    testing::Mock::VerifyAndClearExpectations(this);
+  }
+
+  // Unwraps move-only parameters to pass to the mock function.
+  void GetVideoStatsCb(bool success, std::unique_ptr<VideoStatsEntry> entry) {
+    MockGetVideoStatsCb(success, entry.get());
+  }
+
+  void AppendToProtoDB(const VideoDescKey& key,
+                       const WebrtcVideoStatsEntryProto* const proto) {
+    base::RunLoop run_loop;
+    base::OnceCallback<void(bool)> update_done_cb = base::BindOnce(
+        [](base::RunLoop* run_loop, bool success) {
+          ASSERT_TRUE(success);
+          run_loop->Quit();
+        },
+        Unretained(&run_loop));
+
+    using DBType = leveldb_proto::ProtoDatabase<WebrtcVideoStatsEntryProto>;
+    std::unique_ptr<DBType::KeyEntryVector> entries =
+        std::make_unique<DBType::KeyEntryVector>();
+    entries->emplace_back(key.Serialize(), *proto);
+
+    fake_db_->UpdateEntries(std::move(entries),
+                            std::make_unique<leveldb_proto::KeyVector>(),
+                            std::move(update_done_cb));
+
+    fake_db_->UpdateCallback(true);
+    run_loop.Run();
+  }
+
+  MOCK_METHOD1(OnInitialize, void(bool success));
+
+  MOCK_METHOD2(MockGetVideoStatsCb, void(bool success, VideoStatsEntry* entry));
+
+  MOCK_METHOD1(MockAppendVideoStatsCb, void(bool success));
+
+  MOCK_METHOD0(MockClearStatsCb, void());
+
+ protected:
+  base::test::TaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
+
+  const VideoDescKey kDecodeStatsKeyVp9;
+  const VideoDescKey kDecodeStatsKeyH264;
+  const VideoDescKey kEncodeStatsKeyVp9;
+
+  // See documentation in SetUp()
+  std::unique_ptr<FakeDB<WebrtcVideoStatsEntryProto>::EntryMap> fake_db_map_;
+  raw_ptr<FakeDB<WebrtcVideoStatsEntryProto>> fake_db_;
+  std::unique_ptr<WebrtcVideoStatsDBImpl> stats_db_;
+};
+
+TEST_F(WebrtcVideoStatsDBImplTest, InitializeFailed) {
+  stats_db_->Initialize(base::BindOnce(
+      &WebrtcVideoStatsDBImplTest::OnInitialize, base::Unretained(this)));
+  EXPECT_CALL(*this, OnInitialize(false));
+  fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kError);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, InitializeTimedOut) {
+  // Queue up an Initialize.
+  stats_db_->Initialize(base::BindOnce(
+      &WebrtcVideoStatsDBImplTest::OnInitialize, base::Unretained(this)));
+  VerifyOnePendingOp("Initialize");
+
+  // Move time forward enough to trigger timeout.
+  EXPECT_CALL(*this, OnInitialize(_)).Times(0);
+  task_environment_.FastForwardBy(base::Seconds(100));
+  task_environment_.RunUntilIdle();
+
+  // Verify we didn't get an init callback and task is no longer considered
+  // pending (because it timed out).
+  testing::Mock::VerifyAndClearExpectations(this);
+  VerifyNoPendingOps();
+
+  // Verify callback still works if init completes very late.
+  EXPECT_CALL(*this, OnInitialize(false));
+  fake_db_->InitStatusCallback(leveldb_proto::Enums::InitStatus::kError);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, ReadExpectingNothing) {
+  InitializeDB();
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, WriteReadAndClear) {
+  InitializeDB();
+
+  // Set test clock.
+  base::SimpleTestClock clock;
+  SetDBClock(&clock);
+  clock.SetNow(base::Time::Now());
+
+  // Append and read back some VP9 stats.
+  VideoStats stats1(clock.Now().ToJsTimeIgnoringNull(), 240, 6, 7.2);
+  VideoStatsEntry entry{stats1};
+  AppendStats(kDecodeStatsKeyVp9, stats1);
+  VerifyReadStats(kDecodeStatsKeyVp9, entry);
+
+  // Reading with the wrong key (different codec) should still return nothing.
+  VerifyEmptyStats(kDecodeStatsKeyH264);
+  VerifyEmptyStats(kEncodeStatsKeyVp9);
+
+  // Appending new VP9 stats.
+  clock.Advance(base::Hours(1));
+  VideoStats stats2(clock.Now().ToJsTimeIgnoringNull(), 1000, 14, 6.8);
+
+  AppendStats(kDecodeStatsKeyVp9, stats2);
+  VideoStatsEntry aggregate_entry{stats2, stats1};
+  VerifyReadStats(kDecodeStatsKeyVp9, aggregate_entry);
+
+  // Clear all stats from the DB.
+  EXPECT_CALL(*this, MockClearStatsCb);
+  stats_db_->ClearStats(base::BindOnce(
+      &WebrtcVideoStatsDBImplTest::MockClearStatsCb, base::Unretained(this)));
+  VerifyOnePendingOp("Clear");
+  fake_db_->UpdateCallback(true);
+
+  // Database is now empty. Expect null entry.
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, ExpiredStatsAreNotReturned) {
+  InitializeDB();
+
+  // Set test clock.
+  base::SimpleTestClock clock;
+  SetDBClock(&clock);
+  clock.SetNow(base::Time::Now());
+
+  // Append and read back some VP9 stats.
+  VideoStats stats1(clock.Now().ToJsTimeIgnoringNull(), 240, 6, 7.2);
+  VideoStatsEntry entry{stats1};
+  AppendStats(kDecodeStatsKeyVp9, stats1);
+  VerifyReadStats(kDecodeStatsKeyVp9, entry);
+
+  // Appending new VP9 stats.
+  clock.Advance(base::Days(2));
+  VideoStats stats2(clock.Now().ToJsTimeIgnoringNull(), 1000, 14, 6.8);
+  clock.SetNow(base::Time::FromJsTime(stats2.timestamp));
+
+  AppendStats(kDecodeStatsKeyVp9, stats2);
+  VideoStatsEntry aggregate_entry{stats2, stats1};
+  VerifyReadStats(kDecodeStatsKeyVp9, aggregate_entry);
+
+  // Set the clock to a date so that the first entry is expired.
+  clock.SetNow(base::Time::FromJsTime(stats1.timestamp) +
+               base::Days(1 + GetMaxDaysToKeepStats()));
+  VideoStatsEntry nonexpired_entry{stats2};
+  VerifyReadStats(kDecodeStatsKeyVp9, nonexpired_entry);
+
+  // Set the clock so that all data have expired.
+  clock.SetNow(base::Time::FromJsTime(stats2.timestamp) +
+               base::Days(1 + GetMaxDaysToKeepStats()));
+
+  // All stats are expired. Expect null entry.
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, ConfigureExpireDays) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  std::unique_ptr<base::FieldTrialList> field_trial_list;
+
+  int previous_max_days_to_keep_stats = GetMaxDaysToKeepStats();
+  constexpr int kNewMaxDaysToKeepStats = 4;
+  ASSERT_LT(kNewMaxDaysToKeepStats, previous_max_days_to_keep_stats);
+
+  // Override field trial.
+  base::FieldTrialParams params;
+  params[WebrtcVideoStatsDBImpl::kMaxDaysToKeepStatsParamName] =
+      base::NumberToString(kNewMaxDaysToKeepStats);
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      media::kWebrtcMediaCapabilitiesParameters, params);
+  EXPECT_EQ(kNewMaxDaysToKeepStats, GetMaxDaysToKeepStats());
+
+  InitializeDB();
+
+  // Inject a test clock and initialize with the current time.
+  base::SimpleTestClock clock;
+  SetDBClock(&clock);
+  clock.SetNow(base::Time::Now());
+
+  // Append and verify read-back.
+  VideoStats stats1(clock.Now().ToJsTimeIgnoringNull(), 240, 6, 7.2);
+  VideoStatsEntry entry{stats1};
+  AppendStats(kDecodeStatsKeyVp9, stats1);
+  VerifyReadStats(kDecodeStatsKeyVp9, entry);
+
+  // Some simple math to avoid troubles of integer division.
+  int half_days_to_keep_stats = kNewMaxDaysToKeepStats / 2;
+  int remaining_days_to_keep_stats =
+      kNewMaxDaysToKeepStats - half_days_to_keep_stats;
+
+  // Advance time half way through grace period. Verify stats not expired.
+  clock.Advance(base::Days(half_days_to_keep_stats));
+  VerifyReadStats(kDecodeStatsKeyVp9, entry);
+
+  // Advance time 1 day beyond grace period, verify stats are expired.
+  clock.Advance(base::Days(remaining_days_to_keep_stats + 1));
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+
+  // Advance the clock 100 extra days. Verify stats still expired.
+  clock.Advance(base::Days(100));
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, NewStatsReplaceOldStats) {
+  InitializeDB();
+
+  // Inject a test clock and initialize with the current time.
+  base::SimpleTestClock clock;
+  SetDBClock(&clock);
+  clock.SetNow(base::Time::Now());
+
+  // Append and verify read-back.
+  constexpr int kNumberOfStatsToAdd = 30;
+  EXPECT_GT(kNumberOfStatsToAdd, GetMaxEntriesPerConfig());
+  VideoStatsEntry entry;
+  for (int i = 0; i < kNumberOfStatsToAdd; ++i) {
+    VideoStats stats(clock.Now().ToJsTimeIgnoringNull(), 240 + i, 6,
+                     7.2 + i % 3);
+    AppendStats(kDecodeStatsKeyVp9, stats);
+    // Start popping the last stats entry if the number of entries has reached
+    // the limit.
+    if (i >= GetMaxEntriesPerConfig()) {
+      entry.pop_back();
+    }
+    entry.insert(entry.begin(), stats);
+    VerifyReadStats(kDecodeStatsKeyVp9, entry);
+    clock.Advance(base::Days(1));
+  }
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, ConfigureMaxEntriesPerConfig) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  std::unique_ptr<base::FieldTrialList> field_trial_list;
+
+  int previous_max_entries_per_config = GetMaxEntriesPerConfig();
+  constexpr int kNewMaxEntriesPerConfig = 3;
+  ASSERT_LT(kNewMaxEntriesPerConfig, previous_max_entries_per_config);
+
+  // Override field trial.
+  base::FieldTrialParams params;
+  params[WebrtcVideoStatsDBImpl::kMaxEntriesPerConfigParamName] =
+      base::NumberToString(kNewMaxEntriesPerConfig);
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      media::kWebrtcMediaCapabilitiesParameters, params);
+  EXPECT_EQ(kNewMaxEntriesPerConfig, GetMaxEntriesPerConfig());
+
+  InitializeDB();
+
+  // Inject a test clock and initialize with the current time.
+  base::SimpleTestClock clock;
+  SetDBClock(&clock);
+  clock.SetNow(base::Time::Now());
+
+  // Append and verify read-back.
+  constexpr int kNumberOfStatsToAdd = 30;
+  EXPECT_GT(kNumberOfStatsToAdd, GetMaxEntriesPerConfig());
+  VideoStatsEntry entry;
+  for (int i = 0; i < kNumberOfStatsToAdd; ++i) {
+    VideoStats stats(clock.Now().ToJsTimeIgnoringNull(), 240 + i, 6,
+                     7.2 + i % 3);
+    AppendStats(kDecodeStatsKeyVp9, stats);
+    // Start popping the last stats entry if the number of entries has reached
+    // the limit.
+    if (i >= GetMaxEntriesPerConfig()) {
+      entry.pop_back();
+    }
+    entry.insert(entry.begin(), stats);
+    VerifyReadStats(kDecodeStatsKeyVp9, entry);
+    clock.Advance(base::Days(1));
+  }
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, OutOfOrderTimestampClearsOldStats) {
+  InitializeDB();
+
+  // Inject a test clock and initialize with the current time.
+  base::SimpleTestClock clock;
+  SetDBClock(&clock);
+  clock.SetNow(base::Time::Now());
+
+  // Append and verify read-back.
+  constexpr int kNumberOfStatsToAdd = 5;
+  VideoStatsEntry entry;
+  for (int i = 0; i < kNumberOfStatsToAdd; ++i) {
+    VideoStats stats(clock.Now().ToJsTimeIgnoringNull(), 240 + i, 6,
+                     7.2 + i % 3);
+    AppendStats(kDecodeStatsKeyVp9, stats);
+    entry.insert(entry.begin(), stats);
+    VerifyReadStats(kDecodeStatsKeyVp9, entry);
+    clock.Advance(base::Days(1));
+  }
+
+  // Go back in time and add a new stats entry.
+  clock.Advance(-base::Days(20));
+  VideoStats stats(clock.Now().ToJsTimeIgnoringNull(), 123, 5, 11.2);
+  AppendStats(kDecodeStatsKeyVp9, stats);
+  // Only the last appended stats should be in the database now.
+  entry = {stats};
+  VerifyReadStats(kDecodeStatsKeyVp9, entry);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, FailedWrite) {
+  InitializeDB();
+
+  // Expect the callback to indicate success = false when the write fails.
+  EXPECT_CALL(*this, MockAppendVideoStatsCb(false));
+
+  // Append stats, but fail the internal DB update.
+  stats_db_->AppendVideoStats(
+      kDecodeStatsKeyVp9, VideoStats(1234, 240, 6, 7.2),
+      base::BindOnce(&WebrtcVideoStatsDBImplTest::MockAppendVideoStatsCb,
+                     base::Unretained(this)));
+  fake_db_->GetCallback(true);
+  fake_db_->UpdateCallback(false);
+}
+
+TEST_F(WebrtcVideoStatsDBImplTest, DiscardCorruptedDBData) {
+  InitializeDB();
+
+  // Inject a test clock and initialize with the current time.
+  base::SimpleTestClock clock;
+  SetDBClock(&clock);
+  clock.SetNow(base::Time::Now());
+
+  // Start with a proto that represents a valid uncorrupted and unexpired entry.
+  WebrtcVideoStatsEntryProto valid_proto;
+  WebrtcVideoStatsProto* valid_entry = valid_proto.add_stats();
+  valid_entry->set_timestamp(clock.Now().ToJsTimeIgnoringNull());
+  valid_entry->set_frames_processed(300);
+  valid_entry->set_key_frames_processed(8);
+  valid_entry->set_p99_processing_time_ms(11.3);
+
+  // Append it and read it back without issue.
+  AppendToProtoDB(kEncodeStatsKeyVp9, &valid_proto);
+  VerifyReadStats(
+      kEncodeStatsKeyVp9,
+      {VideoStats{valid_entry->timestamp(), valid_entry->frames_processed(),
+                  valid_entry->key_frames_processed(),
+                  valid_entry->p99_processing_time_ms()}});
+
+  WebrtcVideoStatsEntryProto invalid_proto;
+  WebrtcVideoStatsProto* invalid_entry = invalid_proto.add_stats();
+  //  Invalid because number of frames processed is too low Verify
+  // you can't read it back (filtered for corruption).
+  *invalid_entry = *valid_entry;
+  invalid_entry->set_frames_processed(30);
+  AppendToProtoDB(kDecodeStatsKeyVp9, &invalid_proto);
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+
+  // Invalid because number of frames processed is too high. Verify
+  // you can't read it back (filtered for corruption).
+  *invalid_entry = *valid_entry;
+  invalid_entry->set_frames_processed(1000000);
+  AppendToProtoDB(kDecodeStatsKeyVp9, &invalid_proto);
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+
+  // Invalid because number of key frames is higher than number of frames
+  // processed. Verify you can't read it back (filtered for corruption).
+  *invalid_entry = *valid_entry;
+  invalid_entry->set_key_frames_processed(valid_entry->frames_processed() + 1);
+  AppendToProtoDB(kDecodeStatsKeyVp9, &invalid_proto);
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+
+  // Invalid processing time. Verify
+  // you can't read it back (filtered for corruption).
+  *invalid_entry = *valid_entry;
+  invalid_entry->set_p99_processing_time_ms(-1.0);
+  AppendToProtoDB(kDecodeStatsKeyVp9, &invalid_proto);
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+
+  *invalid_entry = *valid_entry;
+  invalid_entry->set_p99_processing_time_ms(20000.0);
+  AppendToProtoDB(kDecodeStatsKeyVp9, &invalid_proto);
+  VerifyEmptyStats(kDecodeStatsKeyVp9);
+}
+
+}  // namespace media
diff --git a/media/capabilities/webrtc_video_stats_db_unittest.cc b/media/capabilities/webrtc_video_stats_db_unittest.cc
new file mode 100644
index 0000000..b8535f5
--- /dev/null
+++ b/media/capabilities/webrtc_video_stats_db_unittest.cc
@@ -0,0 +1,76 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "media/base/video_codecs.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/rect.h"
+
+#include "media/capabilities/webrtc_video_stats_db.h"
+
+namespace media {
+const auto MakeKey = WebrtcVideoStatsDB::VideoDescKey::MakeBucketedKey;
+
+TEST(WebrtcVideoStatsDBTest, KeySerialization) {
+  // Serialized key with empty KeySystem string should not mention encryption
+  // fields.
+  auto keyA = MakeKey(/*is_decode_stats=*/true, H264PROFILE_BASELINE,
+                      /*hardware_accelerated=*/true, 1280 * 720);
+  EXPECT_EQ("1|0|1|921600", keyA.Serialize());
+
+  // No hardware acceleration.
+  auto keyB = MakeKey(/*is_decode_stats=*/true, H264PROFILE_BASELINE,
+                      /*hardware_accelerated=*/false, 1280 * 720);
+  EXPECT_EQ("1|0|0|921600", keyB.Serialize());
+
+  // VP9 Profile 2.
+  auto keyC = MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE2,
+                      /*hardware_accelerated=*/false, 1280 * 720);
+  EXPECT_EQ("1|14|0|921600", keyC.Serialize());
+
+  // Full HD.
+  auto keyD = MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE2,
+                      /*hardware_accelerated=*/false, 1920 * 1080);
+  EXPECT_EQ("1|14|0|2073600", keyD.Serialize());
+
+  // Encode.
+  auto keyE = MakeKey(/*is_decode_stats=*/false, VP9PROFILE_PROFILE2,
+                      /*hardware_accelerated=*/false, 1920 * 1080);
+  EXPECT_EQ("0|14|0|2073600", keyE.Serialize());
+}
+
+TEST(WebrtcVideoStatsDBTest, OperatorEquals) {
+  auto keyA = MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE0,
+                      /*hardware_accelerated=*/true, 1280 * 720);
+  EXPECT_EQ(keyA, keyA);
+
+  auto keyB = keyA;
+  EXPECT_EQ(keyA, keyB);
+
+  // Vary each of the fields in `keyA` and verify != `keyA`
+  EXPECT_NE(keyA, MakeKey(/*is_decode_stats=*/false, VP9PROFILE_PROFILE0,
+                          /*hardware_accelerated=*/true, 1280 * 720));
+  EXPECT_NE(keyA, MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE2,
+                          /*hardware_accelerated=*/true, 1280 * 720));
+  EXPECT_NE(keyA, MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE0,
+                          /*hardware_accelerated=*/true, 1920 * 1080));
+  EXPECT_NE(keyA, MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE0,
+                          /*hardware_accelerated=*/false, 1280 * 720));
+}
+
+TEST(WebrtcVideoStatsDBTest, PixelSizeBucketting) {
+  auto keyA = MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE0,
+                      /*hardware_accelerated=*/true, 1280 * 720);
+
+  // Verify that keys are equal even if the pixel size varies slightly.
+  for (int pixel_size_delta = -10000; pixel_size_delta <= 10000;
+       pixel_size_delta += 1000) {
+    EXPECT_EQ(keyA, MakeKey(/*is_decode_stats=*/true, VP9PROFILE_PROFILE0,
+                            /*hardware_accelerated=*/true,
+                            1280 * 720 + pixel_size_delta));
+  }
+}
+
+}  // namespace media
diff --git a/media/capture/video/chromeos/camera_device_delegate.cc b/media/capture/video/chromeos/camera_device_delegate.cc
index 4c5c07a..8dc31033 100644
--- a/media/capture/video/chromeos/camera_device_delegate.cc
+++ b/media/capture/video/chromeos/camera_device_delegate.cc
@@ -1202,8 +1202,7 @@
             chromeos::features::kPreferConstantFrameRate) ||
         (camera_app_device && camera_app_device->GetCaptureIntent() ==
                                   cros::mojom::CaptureIntent::VIDEO_RECORD);
-    int32_t target_min, target_max;
-    std::tie(target_min, target_max) = GetTargetFrameRateRange(
+    auto [target_min, target_max] = GetTargetFrameRateRange(
         static_metadata_, requested_frame_rate, prefer_constant_frame_rate);
     if (target_min == 0 || target_max == 0) {
       device_context_->SetErrorState(
diff --git a/media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm b/media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm
index ea1334d..09fed68c0 100644
--- a/media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm
+++ b/media/capture/video/mac/pixel_buffer_transferer_mac_unittest.mm
@@ -112,9 +112,7 @@
           ->CreateBuffer();
   EXPECT_TRUE(transferer.TransferImage(source->pixel_buffer, destination));
   // Verify the result has the same number of checker tiles.
-  int num_tiles_across_x;
-  int num_tiles_across_y;
-  std::tie(num_tiles_across_x, num_tiles_across_y) =
+  auto [num_tiles_across_x, num_tiles_across_y] =
       GetCheckerPatternNumTilesAccross(
           CreateArgbBufferFromYuvsIOSurface(
               CVPixelBufferGetIOSurface(destination)),
@@ -155,9 +153,7 @@
           ->CreateBuffer();
   EXPECT_TRUE(transferer.TransferImage(source->pixel_buffer, destination));
   // Verify the result has the same number of checker tiles.
-  int num_tiles_across_x;
-  int num_tiles_across_y;
-  std::tie(num_tiles_across_x, num_tiles_across_y) =
+  auto [num_tiles_across_x, num_tiles_across_y] =
       GetCheckerPatternNumTilesAccross(
           CreateArgbBufferFromYuvsIOSurface(
               CVPixelBufferGetIOSurface(destination)),
@@ -225,9 +221,7 @@
 // YUVS -> X -> Y -> YUVS
 TEST_P(PixelBufferTransfererParameterizedTest,
        CanConvertFromXToYAndVerifyColor) {
-  OSType pixel_format_from;
-  OSType pixel_format_to;
-  std::tie(pixel_format_from, pixel_format_to) = GetParam();
+  auto [pixel_format_from, pixel_format_to] = GetParam();
   LOG(INFO) << "Running Test: " << MacFourCCToString(pixel_format_from)
             << " -> " << MacFourCCToString(pixel_format_to);
 
diff --git a/media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm b/media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm
index 0d4540480..ada0a90 100644
--- a/media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm
+++ b/media/capture/video/mac/sample_buffer_transformer_mac_unittest.mm
@@ -119,9 +119,7 @@
 // E.g. ".../yuvsTo420v" instead of ".../4"
 std::string TestParametersOSTypeTupleToString(
     testing::TestParamInfo<std::tuple<OSType, OSType>> info) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = info.param;
+  auto [input_pixel_format, output_pixel_format] = info.param;
   return MacFourCCToString(input_pixel_format) + std::string("To") +
          MacFourCCToString(output_pixel_format);
 }
@@ -219,9 +217,7 @@
     plane_address.push_back(
         calloc(1, plane_strides[plane] * plane_heights[plane]));
     uint8_t* dst_ptr = static_cast<uint8_t*>(plane_address[plane]);
-    uint8_t* src_ptr;
-    size_t plane_stride;
-    std::tie(src_ptr, plane_stride) = GetDataAndStride(pixel_buffer, plane);
+    auto [src_ptr, plane_stride] = GetDataAndStride(pixel_buffer, plane);
     CHECK(dst_ptr);
     CHECK(src_ptr);
     for (size_t r = 0; r < plane_heights[plane]; ++r) {
@@ -378,9 +374,7 @@
       public ::testing::WithParamInterface<std::tuple<OSType, OSType>> {};
 
 TEST_P(SampleBufferTransformerPixelTransferTest, CanConvertFullScale) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
 
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
@@ -410,9 +404,7 @@
 #endif
 
 TEST_P(SampleBufferTransformerPixelTransferTest, MAYBE_CanConvertAndScaleDown) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
 
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
@@ -438,9 +430,7 @@
 
 TEST_P(SampleBufferTransformerPixelTransferTest,
        CanConvertAndScaleDownWhenIoSurfaceIsMissing) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
 
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
@@ -466,9 +456,7 @@
 
 TEST_P(SampleBufferTransformerPixelTransferTest,
        CanConvertWithPaddingFullScale) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
                          kFullResolutionHeight, kColorR, kColorG, kColorB,
@@ -491,9 +479,7 @@
 
 TEST_P(SampleBufferTransformerPixelTransferTest,
        CanConvertAndScaleWithPadding) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
                          kFullResolutionHeight, kColorR, kColorG, kColorB,
@@ -527,9 +513,7 @@
       public ::testing::WithParamInterface<std::tuple<OSType, OSType>> {};
 
 TEST_P(SampleBufferTransformerLibyuvTest, CanConvertFullScale) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
 
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
@@ -551,9 +535,7 @@
 }
 
 TEST_P(SampleBufferTransformerLibyuvTest, MAYBE_CanConvertAndScaleDown) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
 
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
@@ -577,9 +559,7 @@
 }
 
 TEST_P(SampleBufferTransformerLibyuvTest, CanConvertWithPaddingFullScale) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
                          kFullResolutionHeight, kColorR, kColorG, kColorB,
@@ -600,9 +580,7 @@
 }
 
 TEST_P(SampleBufferTransformerLibyuvTest, CanConvertAndScaleWithPadding) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
                          kFullResolutionHeight, kColorR, kColorG, kColorB,
@@ -626,9 +604,7 @@
 
 TEST_P(SampleBufferTransformerLibyuvTest,
        CanConvertAndScaleDownWhenIoSurfaceIsMissing) {
-  OSType input_pixel_format;
-  OSType output_pixel_format;
-  std::tie(input_pixel_format, output_pixel_format) = GetParam();
+  auto [input_pixel_format, output_pixel_format] = GetParam();
 
   base::ScopedCFTypeRef<CMSampleBufferRef> input_sample_buffer =
       CreateSampleBuffer(input_pixel_format, kFullResolutionWidth,
diff --git a/media/capture/video/video_capture_device.h b/media/capture/video/video_capture_device.h
index 3b5de68..d37a4b6f0 100644
--- a/media/capture/video/video_capture_device.h
+++ b/media/capture/video/video_capture_device.h
@@ -339,10 +339,6 @@
   // happens first.
   virtual void StopAndDeAllocate() = 0;
 
-  // Hints to the source that if it has an alpha channel, that alpha channel
-  // will be ignored and can be discarded.
-  virtual void SetCanDiscardAlpha(bool can_discard_alpha) {}
-
   // Retrieve the photo capabilities and settings of the device (e.g. zoom
   // levels etc). On success, invokes |callback|. On failure, drops callback
   // without invoking it.
diff --git a/media/capture/video/video_frame_receiver.cc b/media/capture/video/video_frame_receiver.cc
index 627143e4..44b3b6b 100644
--- a/media/capture/video/video_frame_receiver.cc
+++ b/media/capture/video/video_frame_receiver.cc
@@ -4,6 +4,8 @@
 
 #include "media/capture/video/video_frame_receiver.h"
 
+#include "media/base/bind_to_current_loop.h"
+
 namespace media {
 
 ReadyFrameInBuffer::ReadyFrameInBuffer(
@@ -33,4 +35,10 @@
   return *this;
 }
 
+ScopedFrameDoneHelper::ScopedFrameDoneHelper(base::OnceClosure done_callback)
+    : base::ScopedClosureRunner(
+          media::BindToCurrentLoop(std::move(done_callback))) {}
+
+ScopedFrameDoneHelper::~ScopedFrameDoneHelper() = default;
+
 }  // namespace media
diff --git a/media/capture/video/video_frame_receiver.h b/media/capture/video/video_frame_receiver.h
index 87246d2..f74604f 100644
--- a/media/capture/video/video_frame_receiver.h
+++ b/media/capture/video/video_frame_receiver.h
@@ -5,6 +5,7 @@
 #ifndef MEDIA_CAPTURE_VIDEO_VIDEO_FRAME_RECEIVER_H_
 #define MEDIA_CAPTURE_VIDEO_VIDEO_FRAME_RECEIVER_H_
 
+#include "base/callback_helpers.h"
 #include "media/capture/capture_export.h"
 #include "media/capture/mojom/video_capture_buffer.mojom.h"
 #include "media/capture/mojom/video_capture_types.mojom.h"
@@ -33,6 +34,21 @@
   mojom::VideoFrameInfoPtr frame_info;
 };
 
+// Adapter for a VideoFrameReceiver to notify once frame consumption is
+// complete. VideoFrameReceiver requires owning an object that it will destroy
+// once consumption is complete. This class adapts between that scheme and
+// running a "done callback" to notify that consumption is complete. The
+// callback is guaranteed to be run on the thread that the adapter was created
+// on, since the VideoFrameReceiver may not be destroying the object on the same
+// thread.
+class CAPTURE_EXPORT ScopedFrameDoneHelper final
+    : public base::ScopedClosureRunner,
+      public media::VideoCaptureDevice::Client::Buffer::ScopedAccessPermission {
+ public:
+  explicit ScopedFrameDoneHelper(base::OnceClosure done_callback);
+  ~ScopedFrameDoneHelper() final;
+};
+
 // Callback interface for VideoCaptureDeviceClient to communicate with its
 // clients. On some platforms, VideoCaptureDeviceClient calls these methods from
 // OS or capture driver provided threads which do not have a task runner and
diff --git a/media/cast/logging/stats_event_subscriber_unittest.cc b/media/cast/logging/stats_event_subscriber_unittest.cc
index c1d591b8..f8e5197 100644
--- a/media/cast/logging/stats_event_subscriber_unittest.cc
+++ b/media/cast/logging/stats_event_subscriber_unittest.cc
@@ -531,8 +531,8 @@
 bool CheckHistogramHasValue(base::ListValue* values,
                             const std::string& bucket,
                             int expected_count) {
-  for (size_t i = 0; i < values->GetList().size(); ++i) {
-    const base::Value& value = values->GetList()[i];
+  for (size_t i = 0; i < values->GetListDeprecated().size(); ++i) {
+    const base::Value& value = values->GetListDeprecated()[i];
     if (!value.is_dict() || !value.FindKey(bucket))
       continue;
     absl::optional<int> bucket_count = value.FindIntKey(bucket);
diff --git a/media/cast/sender/external_video_encoder.cc b/media/cast/sender/external_video_encoder.cc
index 78029dc..a04f1003 100644
--- a/media/cast/sender/external_video_encoder.cc
+++ b/media/cast/sender/external_video_encoder.cc
@@ -15,6 +15,7 @@
 #include "base/memory/shared_memory_mapping.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
@@ -133,9 +134,12 @@
     DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
     requested_bit_rate_ = start_bit_rate;
+    // TODO(crbug.com/1289909): remove this cast if media/cast migrates to
+    // uint32_t bitrates
+    const media::Bitrate bitrate = media::Bitrate::ConstantBitrate(
+        base::saturated_cast<uint32_t>(start_bit_rate));
     const media::VideoEncodeAccelerator::Config config(
-        media::PIXEL_FORMAT_I420, frame_size, codec_profile,
-        media::Bitrate::ConstantBitrate(start_bit_rate));
+        media::PIXEL_FORMAT_I420, frame_size, codec_profile, bitrate);
     encoder_active_ = video_encode_accelerator_->Initialize(config, this);
     next_frame_id_ = first_frame_id;
     codec_profile_ = codec_profile;
@@ -155,8 +159,10 @@
 
     requested_bit_rate_ = bit_rate;
     if (encoder_active_) {
+      // TODO(crbug.com/1289909): remove this cast if media/cast migrates to
+      // uint32_t bitrates
       video_encode_accelerator_->RequestEncodingParametersChange(
-          Bitrate::ConstantBitrate(bit_rate),
+          Bitrate::ConstantBitrate(base::saturated_cast<uint32_t>(bit_rate)),
           static_cast<uint32_t>(max_frame_rate_ + 0.5));
     }
   }
diff --git a/media/cdm/cdm_paths_unittest.cc b/media/cdm/cdm_paths_unittest.cc
index e44dd5ca..5113620 100644
--- a/media/cdm/cdm_paths_unittest.cc
+++ b/media/cdm/cdm_paths_unittest.cc
@@ -12,22 +12,10 @@
 #include "media/media_buildflags.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-// Only verify platform specific path on some platforms.
-// Note: The condition list here must be consistent with condition on
-// "cdm_platform_specific_path" in cdm_paths.gni.
-// TODO(crbug.com/971433). Move the CDMs out of the install directory on
-// ChromeOS.
-#if (BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || \
-     BUILDFLAG(IS_CHROMEOS_LACROS))
-#define CDM_USE_PLATFORM_SPECIFIC_PATH
-#endif
-
 namespace media {
 
 namespace {
 
-#if defined(CDM_USE_PLATFORM_SPECIFIC_PATH)
-
 // Special path used in chrome components.
 const char kPlatformSpecific[] = "_platform_specific";
 
@@ -69,16 +57,6 @@
       .AppendASCII(kPlatformArch);
 }
 
-#else
-
-// If the CDM is not a component, it has no platform specific path.
-base::FilePath GetExpectedPlatformSpecificDirectory(
-    const std::string& base_path) {
-  return base::FilePath();
-}
-
-#endif  // defined(CDM_USE_PLATFORM_SPECIFIC_PATH)
-
 std::string GetFlag() {
   return BUILDFLAG(CDM_PLATFORM_SPECIFIC_PATH);
 }
@@ -86,23 +64,15 @@
 }  // namespace
 
 TEST(CdmPathsTest, FlagSpecified) {
-#if defined(CDM_USE_PLATFORM_SPECIFIC_PATH)
   EXPECT_FALSE(GetFlag().empty());
-#else
-  EXPECT_TRUE(GetFlag().empty());
-#endif
 }
 
 TEST(CdmPathsTest, Prefix) {
   const char kPrefix[] = "prefix";
   auto path = GetPlatformSpecificDirectory(kPrefix);
 
-#if defined(CDM_USE_PLATFORM_SPECIFIC_PATH)
   EXPECT_TRUE(base::StartsWith(path.MaybeAsASCII(), kPrefix,
                                base::CompareCase::SENSITIVE));
-#else
-  EXPECT_TRUE(path.MaybeAsASCII().empty());
-#endif
 }
 
 TEST(CdmPathsTest, Expected) {
diff --git a/media/cdm/json_web_key.cc b/media/cdm/json_web_key.cc
index 0208de556..cf3d6dac 100644
--- a/media/cdm/json_web_key.cc
+++ b/media/cdm/json_web_key.cc
@@ -186,8 +186,8 @@
   // Create a local list of keys, so that |jwk_keys| only gets updated on
   // success.
   KeyIdAndKeyPairs local_keys;
-  for (size_t i = 0; i < list_val->GetList().size(); ++i) {
-    base::Value& jwk = list_val->GetList()[i];
+  for (size_t i = 0; i < list_val->GetListDeprecated().size(); ++i) {
+    base::Value& jwk = list_val->GetListDeprecated()[i];
     if (!jwk.is_dict()) {
       DVLOG(1) << "Unable to access '" << kKeysTag << "'[" << i
                << "] in JWK Set";
@@ -204,20 +204,23 @@
   // Successfully processed all JWKs in the set. Now check if "type" is
   // specified.
   base::Value* value = NULL;
-  std::string session_type_id;
   if (!dictionary->Get(kTypeTag, &value)) {
     // Not specified, so use the default type.
     *session_type = CdmSessionType::kTemporary;
-  } else if (!value->GetAsString(&session_type_id)) {
-    DVLOG(1) << "Invalid '" << kTypeTag << "' value";
-    return false;
-  } else if (session_type_id == kTemporarySession) {
-    *session_type = CdmSessionType::kTemporary;
-  } else if (session_type_id == kPersistentLicenseSession) {
-    *session_type = CdmSessionType::kPersistentLicense;
   } else {
-    DVLOG(1) << "Invalid '" << kTypeTag << "' value: " << session_type_id;
-    return false;
+    if (!value->is_string()) {
+      DVLOG(1) << "Invalid '" << kTypeTag << "' value";
+      return false;
+    }
+    const std::string session_type_id = value->GetString();
+    if (session_type_id == kTemporarySession) {
+      *session_type = CdmSessionType::kTemporary;
+    } else if (session_type_id == kPersistentLicenseSession) {
+      *session_type = CdmSessionType::kPersistentLicense;
+    } else {
+      DVLOG(1) << "Invalid '" << kTypeTag << "' value: " << session_type_id;
+      return false;
+    }
   }
 
   // All done.
@@ -253,7 +256,7 @@
   // Create a local list of key ids, so that |key_ids| only gets updated on
   // success.
   KeyIdList local_key_ids;
-  base::Value::ConstListView list_val_view = list_val->GetList();
+  base::Value::ConstListView list_val_view = list_val->GetListDeprecated();
   for (size_t i = 0; i < list_val_view.size(); ++i) {
     const std::string* encoded_key_id = list_val_view[i].GetIfString();
     if (!encoded_key_id) {
@@ -398,12 +401,13 @@
   }
 
   // Get the first key.
-  if (list_val->GetList().size() < 1) {
+  if (list_val->GetListDeprecated().size() < 1) {
     DVLOG(1) << "Empty '" << kKeyIdsTag << "' list";
     return false;
   }
 
-  const std::string* encoded_key = list_val->GetList()[0].GetIfString();
+  const std::string* encoded_key =
+      list_val->GetListDeprecated()[0].GetIfString();
   if (!encoded_key) {
     DVLOG(1) << "First entry in '" << kKeyIdsTag << "' not a string";
     return false;
diff --git a/media/cdm/library_cdm/cdm_paths.gni b/media/cdm/library_cdm/cdm_paths.gni
index 8306412..3077dd9 100644
--- a/media/cdm/library_cdm/cdm_paths.gni
+++ b/media/cdm/library_cdm/cdm_paths.gni
@@ -29,21 +29,15 @@
 # components, but is optional for other platforms.
 # Note:
 # - |cdm_platform_specific_path| is exported as a BUILDFLAG to cdm_paths.cc.
-# - When updating the condition here, also update the condition on the define
-#   of CDM_USE_PLATFORM_SPECIFIC_PATH in cdm_paths_unittest.cc.
-if (is_win || is_mac || is_linux || is_chromeos_lacros) {
+if (is_fuchsia) {
+  cdm_platform_specific_path = ""
+  clearkey_cdm_path = "lib"
+  widevine_cdm_path = "lib"
+} else {
   cdm_platform_specific_path =
       "_platform_specific/$component_os" + "_" + "$component_arch"
 
   # Path of Clear Key and Widevine CDMs relative to the output dir.
   clearkey_cdm_path = "ClearKeyCdm/$cdm_platform_specific_path"
   widevine_cdm_path = "WidevineCdm/$cdm_platform_specific_path"
-} else if (is_fuchsia) {
-  cdm_platform_specific_path = ""
-  clearkey_cdm_path = "lib"
-  widevine_cdm_path = "lib"
-} else {
-  cdm_platform_specific_path = ""
-  clearkey_cdm_path = "."
-  widevine_cdm_path = "."
 }
diff --git a/media/filters/frame_processor.cc b/media/filters/frame_processor.cc
index f155ff1..0053cac 100644
--- a/media/filters/frame_processor.cc
+++ b/media/filters/frame_processor.cc
@@ -819,7 +819,7 @@
         << presentation_timestamp.InMicroseconds()
         << "us), frame type=" << frame->GetTypeName();
 
-    // All stream parsers must emit valid (non-negative) frame durations.
+    // All stream parsers should emit valid (non-negative) frame durations.
     // Note that duration of 0 can occur for at least WebM alt-ref frames.
     if (frame_duration == kNoTimestamp) {
       MEDIA_LOG(ERROR, media_log_)
@@ -827,13 +827,12 @@
           << presentation_timestamp.InMicroseconds() << "us";
       return false;
     }
-    if (frame_duration <  base::TimeDelta()) {
-      MEDIA_LOG(ERROR, media_log_)
-          << "Negative duration " << frame_duration.InMicroseconds()
-          << "us for " << frame->GetTypeName() << " frame at PTS "
-          << presentation_timestamp.InMicroseconds() << "us";
-      return false;
-    }
+
+    // See also partial protections in DecoderBuffer::set_duration().
+    // Using stronger CHECK here in case any of the parsers become fragile to
+    // fuzzer coverage gaps when calculating buffer durations.
+    CHECK(frame_duration >= base::TimeDelta() &&
+          frame_duration != kInfiniteDuration);
 
     // 3. If mode equals "sequence" and group start timestamp is set, then run
     //    the following steps:
diff --git a/media/filters/frame_processor_unittest.cc b/media/filters/frame_processor_unittest.cc
index c0ca252..2157918 100644
--- a/media/filters/frame_processor_unittest.cc
+++ b/media/filters/frame_processor_unittest.cc
@@ -2296,6 +2296,16 @@
                                           "0K 10N 20N 22N 32K 42N 45K");
 }
 
+TEST_P(FrameProcessorTest, FrameDuration_kNoTimestamp_FailsParse) {
+  InSequence s;
+  AddTestTracks(HAS_AUDIO);
+  frame_processor_->SetSequenceMode(use_sequence_mode_);
+
+  frame_duration_ = kNoTimestamp;
+  EXPECT_MEDIA_LOG(FrameDurationUnknown("audio", 1000));
+  EXPECT_FALSE(ProcessFrames("1K", ""));
+}
+
 INSTANTIATE_TEST_SUITE_P(SequenceMode, FrameProcessorTest, Values(true));
 INSTANTIATE_TEST_SUITE_P(SegmentsMode, FrameProcessorTest, Values(false));
 
diff --git a/media/formats/BUILD.gn b/media/formats/BUILD.gn
index 7c17cc6..83c1fc9 100644
--- a/media/formats/BUILD.gn
+++ b/media/formats/BUILD.gn
@@ -95,6 +95,7 @@
       "mp4/avc.h",
       "mp4/h264_annex_b_to_avc_bitstream_converter.cc",
       "mp4/h264_annex_b_to_avc_bitstream_converter.h",
+      "mp4/mp4_status.h",
       "mpeg/adts_constants.cc",
       "mpeg/adts_constants.h",
       "mpeg/adts_stream_parser.cc",
diff --git a/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc
index ae3750b..09e24e173 100644
--- a/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc
+++ b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.cc
@@ -23,7 +23,7 @@
   return config_;
 }
 
-Status H264AnnexBToAvcBitstreamConverter::ConvertChunk(
+MP4Status H264AnnexBToAvcBitstreamConverter::ConvertChunk(
     const base::span<const uint8_t> input,
     base::span<uint8_t> output,
     bool* config_changed_out,
@@ -51,11 +51,10 @@
   parser_.SetStream(input.data(), input.size());
   while ((result = parser_.AdvanceToNextNALU(&nalu)) != H264Parser::kEOStream) {
     if (result == H264Parser::kUnsupportedStream)
-      return Status(StatusCode::kH264ParsingError, "Unsupported H.264 stream");
+      return MP4Status::Codes::kUnsupportedStream;
 
     if (result != H264Parser::kOk)
-      return Status(StatusCode::kH264ParsingError,
-                    "Failed to parse H.264 stream");
+      return MP4Status::Codes::kFailedToParse;
 
     switch (nalu.nal_unit_type) {
       case H264NALU::kAUD: {
@@ -65,10 +64,10 @@
         int sps_id = -1;
         result = parser_.ParseSPS(&sps_id);
         if (result == H264Parser::kUnsupportedStream)
-          return Status(StatusCode::kH264ParsingError, "Unsupported SPS");
+          return MP4Status::Codes::kInvalidSPS;
 
         if (result != H264Parser::kOk)
-          return Status(StatusCode::kH264ParsingError, "Could not parse SPS");
+          return MP4Status::Codes::kInvalidSPS;
 
         id2sps_.insert_or_assign(sps_id,
                                  blob(nalu.data, nalu.data + nalu.size));
@@ -86,10 +85,10 @@
         int pps_id = -1;
         result = parser_.ParsePPS(&pps_id);
         if (result == H264Parser::kUnsupportedStream)
-          return Status(StatusCode::kH264ParsingError, "Unsupported PPS");
+          return MP4Status::Codes::kInvalidPPS;
 
         if (result != H264Parser::kOk)
-          return Status(StatusCode::kH264ParsingError, "Could not parse PPS");
+          return MP4Status::Codes::kInvalidPPS;
 
         id2pps_.insert_or_assign(pps_id,
                                  blob(nalu.data, nalu.data + nalu.size));
@@ -108,20 +107,17 @@
         H264SliceHeader slice_hdr;
         result = parser_.ParseSliceHeader(nalu, &slice_hdr);
         if (result != H264Parser::kOk) {
-          return Status(StatusCode::kH264ParsingError,
-                        "Could not parse slice header");
+          return MP4Status::Codes::kInvalidSliceHeader;
         }
 
         const H264PPS* pps = parser_.GetPPS(slice_hdr.pic_parameter_set_id);
         if (!pps) {
-          return Status(StatusCode::kH264ParsingError,
-                        "PPS requested by slice not found");
+          return MP4Status::Codes::kFailedToLookupPPS;
         }
 
         const H264SPS* sps = parser_.GetSPS(pps->seq_parameter_set_id);
         if (!sps) {
-          return Status(StatusCode::kH264ParsingError,
-                        "SPS requested by PPS not found");
+          return MP4Status::Codes::kFailedToLookupSPS;
         }
         new_active_pps_id = pps->pic_parameter_set_id;
         new_active_sps_id = sps->seq_parameter_set_id;
@@ -147,8 +143,7 @@
   if (size_out)
     *size_out = data_size;
   if (data_size > output.size()) {
-    return Status(StatusCode::kH264BufferTooSmall,
-                  "Not enough space in the output buffer.");
+    return MP4Status::Codes::kBufferTooSmall;
   }
 
   // Write slice NALUs from the input buffer to the output buffer
@@ -159,8 +154,7 @@
     bool written_ok =
         writer.WriteU32(unit.size) && writer.WriteBytes(unit.data, unit.size);
     if (!written_ok) {
-      return Status(StatusCode::kH264BufferTooSmall,
-                    "Not enough space in the output buffer.");
+      return MP4Status::Codes::kBufferTooSmall;
     }
   }
 
@@ -178,8 +172,7 @@
 
     const H264SPS* active_sps = parser_.GetSPS(new_active_sps_id);
     if (!active_sps) {
-      return Status(StatusCode::kH264ParsingError,
-                    "No slices referring to SPS. No way to know configuration");
+      return MP4Status::Codes::kFailedToLookupSPS;
     }
 
     active_pps_id_ = new_active_pps_id;
@@ -207,7 +200,7 @@
   if (config_changed_out)
     *config_changed_out = config_changed;
 
-  return Status();
+  return OkStatus();
 }
 
-}  // namespace media
\ No newline at end of file
+}  // namespace media
diff --git a/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h
index 87e6f58..011de26a 100644
--- a/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h
+++ b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h
@@ -12,8 +12,8 @@
 #include "base/containers/flat_map.h"
 #include "base/containers/span.h"
 #include "media/base/media_export.h"
-#include "media/base/status.h"
 #include "media/formats/mp4/box_definitions.h"
+#include "media/formats/mp4/mp4_status.h"
 #include "media/video/h264_parser.h"
 
 namespace media {
@@ -45,10 +45,10 @@
   // from GetCurrentConfig().
   // |size_out| - number of bytes written to |output|, or desired size of
   // |output| if it's too small.
-  Status ConvertChunk(base::span<const uint8_t> input,
-                      base::span<uint8_t> output,
-                      bool* config_changed_out,
-                      size_t* size_out);
+  MP4Status ConvertChunk(base::span<const uint8_t> input,
+                         base::span<uint8_t> output,
+                         bool* config_changed_out,
+                         size_t* size_out);
 
   // Returns the latest version of decoder configuration, found in converted
   // video chunks.
diff --git a/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc
index d04b9d2..a60f9b791 100644
--- a/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc
+++ b/media/formats/mp4/h264_annex_b_to_avc_bitstream_converter_unittest.cc
@@ -53,7 +53,7 @@
 
     auto status =
         converter.ConvertChunk(input, output, &config_changed, &desired_size);
-    ASSERT_EQ(status.code(), StatusCode::kH264BufferTooSmall);
+    ASSERT_EQ(status.code(), MP4Status::Codes::kBufferTooSmall);
     output.resize(desired_size);
 
     status = converter.ConvertChunk(input, output, &config_changed, nullptr);
@@ -132,7 +132,7 @@
   std::vector<uint8_t> output(input.size());
 
   auto status = converter.ConvertChunk(input, output, nullptr, nullptr);
-  ASSERT_EQ(status.code(), StatusCode::kH264ParsingError);
+  ASSERT_EQ(status.code(), MP4Status::Codes::kInvalidSPS);
 }
 
 }  // namespace media
diff --git a/media/formats/mp4/mp4_status.h b/media/formats/mp4/mp4_status.h
new file mode 100644
index 0000000..ee2ce0e
--- /dev/null
+++ b/media/formats/mp4/mp4_status.h
@@ -0,0 +1,37 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_FORMATS_MP4_MP4_STATUS_H_
+#define MEDIA_FORMATS_MP4_MP4_STATUS_H_
+
+#include "media/base/status.h"
+
+namespace media {
+
+struct MP4StatusTraits {
+  enum class Codes : StatusCodeType {
+    kOk = 0,
+    kUnsupportedStream = 1,
+    kFailedToParse = 2,
+
+    // SPS and PPS are common to H264 and H265.
+    kInvalidSPS = 3,
+    kInvalidPPS = 4,
+    kFailedToLookupSPS = 5,
+    kFailedToLookupPPS = 6,
+
+    // Slice headers are h264 only (I think, but we only have an h264 parser)
+    kInvalidSliceHeader = 7,
+
+    kBufferTooSmall = 8,
+  };
+  static constexpr StatusGroupType Group() { return "MP4Status"; }
+  static constexpr Codes DefaultEnumValue() { return Codes::kOk; }
+};
+
+using MP4Status = TypedStatus<MP4StatusTraits>;
+
+}  // namespace media
+
+#endif  // MEDIA_FORMATS_MP4_MP4_STATUS_H_
diff --git a/media/gpu/test/image.cc b/media/gpu/test/image.cc
index db7d39ba..61c1f0d 100644
--- a/media/gpu/test/image.cc
+++ b/media/gpu/test/image.cc
@@ -176,7 +176,7 @@
   const base::Value* visible_rect_info =
       metadata->FindKeyOfType("visible_rect", base::Value::Type::LIST);
   if (visible_rect_info) {
-    base::Value::ConstListView values = visible_rect_info->GetList();
+    base::Value::ConstListView values = visible_rect_info->GetListDeprecated();
     if (values.size() != 4) {
       VLOGF(1) << "unexpected json format for visible rectangle";
       return false;
diff --git a/media/gpu/test/video.cc b/media/gpu/test/video.cc
index 2674443..5a093a5 100644
--- a/media/gpu/test/video.cc
+++ b/media/gpu/test/video.cc
@@ -488,7 +488,7 @@
   const base::Value* md5_checksums =
       metadata->FindKeyOfType("md5_checksums", base::Value::Type::LIST);
   if (md5_checksums) {
-    for (const base::Value& checksum : md5_checksums->GetList()) {
+    for (const base::Value& checksum : md5_checksums->GetListDeprecated()) {
       frame_checksums_.push_back(checksum.GetString());
     }
   }
diff --git a/media/gpu/v4l2/v4l2_image_processor_backend.cc b/media/gpu/v4l2/v4l2_image_processor_backend.cc
index 867616d..5d1800ff 100644
--- a/media/gpu/v4l2/v4l2_image_processor_backend.cc
+++ b/media/gpu/v4l2/v4l2_image_processor_backend.cc
@@ -861,9 +861,7 @@
   // Dequeue completed input (VIDEO_OUTPUT) buffers,
   // and recycle to the free list.
   while (input_queue_->QueuedBuffersCount() > 0) {
-    bool res;
-    V4L2ReadableBufferRef buffer;
-    std::tie(res, buffer) = input_queue_->DequeueBuffer();
+    auto [res, buffer] = input_queue_->DequeueBuffer();
     if (!res) {
       NotifyError();
       return;
@@ -879,9 +877,7 @@
   while (output_queue_->QueuedBuffersCount() > 0) {
     DCHECK(output_queue_->IsStreaming());
 
-    bool res;
-    V4L2ReadableBufferRef buffer;
-    std::tie(res, buffer) = output_queue_->DequeueBuffer();
+    auto [res, buffer] = output_queue_->DequeueBuffer();
     if (!res) {
       NotifyError();
       return;
diff --git a/media/gpu/v4l2/v4l2_video_encode_accelerator.h b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
index f5e104b..a8f0693 100644
--- a/media/gpu/v4l2/v4l2_video_encode_accelerator.h
+++ b/media/gpu/v4l2/v4l2_video_encode_accelerator.h
@@ -286,7 +286,7 @@
   size_t output_buffer_byte_size_;
   uint32_t output_format_fourcc_;
 
-  size_t current_bitrate_;
+  uint32_t current_bitrate_;
   size_t current_framerate_;
 
   // Encoder state, owned and operated by |encoder_task_runner_|.
diff --git a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc
index 9ee4724..94e4e657 100644
--- a/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc
+++ b/media/gpu/vaapi/h264_vaapi_video_encoder_delegate_unittest.cc
@@ -32,7 +32,7 @@
     PIXEL_FORMAT_I420,
     gfx::Size(1280, 720),
     H264PROFILE_BASELINE,
-    Bitrate::ConstantBitrate(14000000)
+    Bitrate::ConstantBitrate(14000000u)
     /* = maximum bitrate in bits per second for level 3.1 */,
     VideoEncodeAccelerator::kDefaultFramerate,
     absl::nullopt /* gop_length */,
diff --git a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
index 0eb4be60..8b04523 100644
--- a/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
+++ b/media/gpu/vaapi/vp9_vaapi_video_encoder_delegate_unittest.cc
@@ -58,7 +58,7 @@
     PIXEL_FORMAT_I420,
     gfx::Size(1280, 720),
     VP9PROFILE_PROFILE0,
-    Bitrate::ConstantBitrate(14000000)
+    Bitrate::ConstantBitrate(14000000u)
     /* = maximum bitrate in bits per second for level 3.1 */,
     VideoEncodeAccelerator::kDefaultFramerate,
     absl::nullopt /* gop_length */,
diff --git a/media/gpu/vp8_decoder.cc b/media/gpu/vp8_decoder.cc
index 6781111..94e908e 100644
--- a/media/gpu/vp8_decoder.cc
+++ b/media/gpu/vp8_decoder.cc
@@ -10,10 +10,6 @@
 
 namespace media {
 
-namespace {
-constexpr size_t kVP8NumFramesActive = 4;
-}
-
 VP8Decoder::VP8Accelerator::VP8Accelerator() {}
 
 VP8Decoder::VP8Accelerator::~VP8Accelerator() {}
@@ -192,12 +188,12 @@
 
 size_t VP8Decoder::GetRequiredNumOfPictures() const {
   constexpr size_t kPicsInPipeline = limits::kMaxVideoFrames + 1;
-  return kVP8NumFramesActive + kPicsInPipeline;
+  return kNumVp8ReferenceBuffers + kPicsInPipeline;
 }
 
 size_t VP8Decoder::GetNumReferenceFrames() const {
   // Maximum number of reference frames.
-  return kVP8NumFramesActive;
+  return kNumVp8ReferenceBuffers;
 }
 
 }  // namespace media
diff --git a/media/gpu/vp8_decoder_unittest.cc b/media/gpu/vp8_decoder_unittest.cc
index f04e676..9f8128c 100644
--- a/media/gpu/vp8_decoder_unittest.cc
+++ b/media/gpu/vp8_decoder_unittest.cc
@@ -27,7 +27,7 @@
 const std::string kPFrame = "vp8-P-frame-320x240";
 const std::string kCorruptFrame = "vp8-corrupt-I-frame";
 constexpr gfx::Size kVideoSize(320, 240);
-constexpr size_t kRequiredNumOfPictures = 9u;
+constexpr size_t kRequiredNumOfPictures = 8u;
 
 class MockVP8Accelerator : public VP8Decoder::VP8Accelerator {
  public:
diff --git a/media/gpu/windows/d3d11_copying_texture_wrapper.cc b/media/gpu/windows/d3d11_copying_texture_wrapper.cc
index 3cd30532..73814a9 100644
--- a/media/gpu/windows/d3d11_copying_texture_wrapper.cc
+++ b/media/gpu/windows/d3d11_copying_texture_wrapper.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "gpu/command_buffer/service/mailbox_manager.h"
-#include "media/base/status_codes.h"
 #include "media/gpu/windows/d3d11_com_defs.h"
 #include "ui/gl/hdr_metadata_helper_win.h"
 
diff --git a/media/gpu/windows/d3d11_decoder_configurator.cc b/media/gpu/windows/d3d11_decoder_configurator.cc
index 4466a0a..f88a4aee 100644
--- a/media/gpu/windows/d3d11_decoder_configurator.cc
+++ b/media/gpu/windows/d3d11_decoder_configurator.cc
@@ -11,7 +11,6 @@
 #include "base/feature_list.h"
 #include "media/base/media_log.h"
 #include "media/base/media_switches.h"
-#include "media/base/status_codes.h"
 #include "media/base/win/mf_helpers.h"
 #include "media/gpu/windows/av1_guids.h"
 #include "media/gpu/windows/d3d11_copying_texture_wrapper.h"
diff --git a/media/gpu/windows/d3d11_status.h b/media/gpu/windows/d3d11_status.h
index 8124075..6db034b4 100644
--- a/media/gpu/windows/d3d11_status.h
+++ b/media/gpu/windows/d3d11_status.h
@@ -63,7 +63,7 @@
 
 struct D3D11StatusTraits {
   using Codes = D3D11StatusCode;
-  static constexpr StatusGroupType Group() { return "D3D11StatusCode"; }
+  static constexpr StatusGroupType Group() { return "D3D11Status"; }
   static constexpr D3D11StatusCode DefaultEnumValue() {
     return D3D11StatusCode::kOk;
   }
diff --git a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
index 977600b..2ed2c35d 100644
--- a/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
+++ b/media/gpu/windows/media_foundation_video_encode_accelerator_win.cc
@@ -43,7 +43,7 @@
 
 namespace {
 
-const int32_t kDefaultTargetBitrate = 5000000;
+const uint32_t kDefaultTargetBitrate = 5000000u;
 const size_t kMaxFrameRateNumerator = 30;
 const size_t kMaxFrameRateDenominator = 1;
 const size_t kMaxResolutionWidth = 1920;
diff --git a/media/mojo/clients/mojo_audio_encoder.h b/media/mojo/clients/mojo_audio_encoder.h
index d8f4633..3929dbdf 100644
--- a/media/mojo/clients/mojo_audio_encoder.h
+++ b/media/mojo/clients/mojo_audio_encoder.h
@@ -55,7 +55,7 @@
   using PendingCallbackHandle = PendingCallbacksList::iterator;
 
   // It is different from regular EncoderStatusCB because mojo only gives us
-  // `const Status&` instead of `Status`.
+  // `const EncoderStatus&` instead of `EncoderStatus`.
   using WrappedEncoderStatusCB =
       base::OnceCallback<void(const EncoderStatus& error)>;
 
diff --git a/media/mojo/mojom/BUILD.gn b/media/mojo/mojom/BUILD.gn
index f442894..82e91bc 100644
--- a/media/mojo/mojom/BUILD.gn
+++ b/media/mojo/mojom/BUILD.gn
@@ -361,10 +361,6 @@
           cpp = "::media::internal::StatusData"
         },
         {
-          mojom = "media.mojom.Status"
-          cpp = "::media::Status"
-        },
-        {
           mojom = "media.mojom.EncoderStatus"
           cpp = "::media::EncoderStatus"
         },
diff --git a/media/mojo/mojom/media_types.mojom b/media/mojo/mojom/media_types.mojom
index b541a7d7..5d57110 100644
--- a/media/mojo/mojom/media_types.mojom
+++ b/media/mojo/mojom/media_types.mojom
@@ -30,10 +30,6 @@
 [Native]
 enum ChannelLayout;
 
-// See media/base/status_codes.h for descriptions.
-[Native]
-enum StatusCode;
-
 // See media/base/media_content_type.h for descriptions.
 [Native]
 enum MediaContentType;
@@ -490,10 +486,6 @@
   mojo_base.mojom.Value data;
 };
 
-struct Status {
-  StatusData? internal;
-};
-
 struct EncoderStatus {
   StatusData? internal;
 };
diff --git a/media/mojo/mojom/status_mojom_traits.cc b/media/mojo/mojom/status_mojom_traits.cc
index 7ac13fb..40aeac7 100644
--- a/media/mojo/mojom/status_mojom_traits.cc
+++ b/media/mojo/mojom/status_mojom_traits.cc
@@ -4,7 +4,6 @@
 
 #include "media/mojo/mojom/status_mojom_traits.h"
 
-#include "media/base/status_codes.h"
 #include "media/mojo/mojom/media_types.mojom.h"
 #include "mojo/public/cpp/base/values_mojom_traits.h"
 
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc
index efa11e9..55d839d 100644
--- a/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc
+++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc
@@ -103,7 +103,7 @@
   constexpr gfx::Size kBaseSize(320, 180);
   constexpr uint32_t kBaseBitrateBps = 123456u;
   constexpr uint32_t kMaximumBitrate = 999999u;
-  constexpr ::media::Bitrate kBitrate =
+  const ::media::Bitrate kBitrate =
       ::media::Bitrate::VariableBitrate(kBaseBitrateBps, kMaximumBitrate);
   ::media::VideoEncodeAccelerator::Config input_config(
       ::media::PIXEL_FORMAT_NV12, kBaseSize, ::media::VP9PROFILE_PROFILE0,
diff --git a/media/video/av1_video_encoder.cc b/media/video/av1_video_encoder.cc
index 6f29b2e..7559826 100644
--- a/media/video/av1_video_encoder.cc
+++ b/media/video/av1_video_encoder.cc
@@ -324,7 +324,7 @@
         options_.frame_size, frame->timestamp());
 
     if (resized_frame) {
-      Status conv_status =
+      auto conv_status =
           ConvertAndScaleFrame(*frame, *resized_frame, resize_buf_);
       if (!conv_status.is_ok()) {
         std::move(done_cb).Run(
diff --git a/media/video/software_video_encoder_test.cc b/media/video/software_video_encoder_test.cc
index 374323c..ac66468 100644
--- a/media/video/software_video_encoder_test.cc
+++ b/media/video/software_video_encoder_test.cc
@@ -366,7 +366,7 @@
 TEST_P(SoftwareVideoEncoderTest, OutputCountEqualsFrameCount) {
   VideoEncoder::Options options;
   options.frame_size = gfx::Size(320, 200);
-  options.bitrate = Bitrate::VariableBitrate(1e6, 2e6);
+  options.bitrate = Bitrate::VariableBitrate(1000000u, 2000000u);
   options.framerate = 25;
   options.keyframe_interval = options.framerate.value() * 3;  // every 3s
   int total_frames_count =
@@ -406,7 +406,7 @@
 TEST_P(SoftwareVideoEncoderTest, EncodeAndDecode) {
   VideoEncoder::Options options;
   options.frame_size = gfx::Size(320, 200);
-  options.bitrate = Bitrate::ConstantBitrate(1e6);  // 1Mbps
+  options.bitrate = Bitrate::ConstantBitrate(1000000u);  // 1Mbps
   options.framerate = 25;
   if (codec_ == VideoCodec::kH264)
     options.avc.produce_annexb = true;
@@ -469,7 +469,7 @@
 TEST_P(SVCVideoEncoderTest, EncodeClipTemporalSvc) {
   VideoEncoder::Options options;
   options.frame_size = gfx::Size(320, 200);
-  options.bitrate = Bitrate::ConstantBitrate(1e6);  // 1Mbps
+  options.bitrate = Bitrate::ConstantBitrate(1000000u);  // 1Mbps
   options.framerate = 25;
   options.scalability_mode = GetParam().scalability_mode;
   if (codec_ == VideoCodec::kH264)
@@ -560,7 +560,7 @@
   VideoEncoder::Options options;
   gfx::Size size1(320, 200), size2(400, 240);
   options.frame_size = size1;
-  options.bitrate = Bitrate::ConstantBitrate(1e6);  // 1Mbps
+  options.bitrate = Bitrate::ConstantBitrate(1000000u);  // 1Mbps
   options.framerate = 25;
   if (codec_ == VideoCodec::kH264)
     options.avc.produce_annexb = true;
@@ -748,7 +748,7 @@
 TEST_P(H264VideoEncoderTest, EncodeAndDecodeWithConfig) {
   VideoEncoder::Options options;
   options.frame_size = gfx::Size(320, 200);
-  options.bitrate = Bitrate::ConstantBitrate(1e6);  // 1Mbps
+  options.bitrate = Bitrate::ConstantBitrate(1000000u);  // 1Mbps
   options.framerate = 25;
   options.avc.produce_annexb = false;
   struct ChunkWithConfig {
diff --git a/media/video/video_encode_accelerator_adapter.cc b/media/video/video_encode_accelerator_adapter.cc
index 001a6d93..649312b4 100644
--- a/media/video/video_encode_accelerator_adapter.cc
+++ b/media/video/video_encode_accelerator_adapter.cc
@@ -10,6 +10,7 @@
 #include "base/callback_helpers.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
+#include "base/numerics/checked_math.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/bind_post_task.h"
@@ -33,6 +34,15 @@
 // to estimate bits per second for ~30 fps with ~1/16 compression rate.
 constexpr int kVEADefaultBitratePerPixel = 2;
 
+uint32_t ComputeCheckedDefaultBitrate(const gfx::Size& frame_size) {
+  base::CheckedNumeric<uint32_t> checked_bitrate_product =
+      base::CheckMul<uint32_t>(frame_size.width(), frame_size.height(),
+                               kVEADefaultBitratePerPixel);
+  // If the product has overflowed, clamp it to uint32_t max
+  return checked_bitrate_product.ValueOrDefault(
+      std::numeric_limits<uint32_t>::max());
+}
+
 VideoEncodeAccelerator::Config SetUpVeaConfig(
     VideoCodecProfile profile,
     const VideoEncoder::Options& opts,
@@ -42,9 +52,7 @@
   if (opts.framerate.has_value())
     initial_framerate = static_cast<uint32_t>(opts.framerate.value());
 
-  uint64_t default_bitrate = opts.frame_size.width() *
-                             opts.frame_size.height() *
-                             kVEADefaultBitratePerPixel;
+  uint32_t default_bitrate = ComputeCheckedDefaultBitrate(opts.frame_size);
   Bitrate bitrate =
       opts.bitrate.value_or(Bitrate::ConstantBitrate(default_bitrate));
   auto config =
@@ -364,10 +372,8 @@
     return;
   }
 
-  uint32_t default_bitrate = options.frame_size.width() *
-                             options.frame_size.height() *
-                             kVEADefaultBitratePerPixel;
-  auto bitrate =
+  uint32_t default_bitrate = ComputeCheckedDefaultBitrate(options.frame_size);
+  Bitrate bitrate =
       options.bitrate.value_or(Bitrate::ConstantBitrate(default_bitrate));
 
   uint32_t framerate = base::ClampRound<uint32_t>(
@@ -499,7 +505,7 @@
           base::span<uint8_t>(src, result.size),
           base::span<uint8_t>(dst.get(), dst_size), &config_changed,
           &actual_output_size);
-      if (status.code() == StatusCode::kH264BufferTooSmall) {
+      if (status.code() == MP4Status::Codes::kBufferTooSmall) {
         // Between AnnexB and AVCC bitstream formats, the start code length and
         // the nal size length can be different. See H.264 specification at
         // http://www.itu.int/rec/T-REC-H.264. Retry the conversion if the
diff --git a/media/video/video_encode_accelerator_adapter_test.cc b/media/video/video_encode_accelerator_adapter_test.cc
index 05c052e4..f7622f8 100644
--- a/media/video/video_encode_accelerator_adapter_test.cc
+++ b/media/video/video_encode_accelerator_adapter_test.cc
@@ -20,6 +20,7 @@
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "media/base/bitrate.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_util.h"
 #include "media/video/fake_video_encode_accelerator.h"
@@ -492,6 +493,50 @@
   EXPECT_EQ(output_timestamps[1], base::Milliseconds(3));
 }
 
+TEST_F(VideoEncodeAcceleratorAdapterTest,
+       ChangeOptions_ChangeVariableBitrateSmokeTest) {
+  VideoEncoder::Options options;
+  options.frame_size = gfx::Size(640, 480);
+  options.bitrate = Bitrate::VariableBitrate(1111u, 2222u);
+  auto pixel_format = PIXEL_FORMAT_I420;
+  int output_count_before_change = 0;
+  int output_count_after_change = 0;
+  VideoEncoder::OutputCB first_output_cb = base::BindLambdaForTesting(
+      [&](VideoEncoderOutput, absl::optional<VideoEncoder::CodecDescription>) {
+        output_count_before_change++;
+      });
+  VideoEncoder::OutputCB second_output_cb = base::BindLambdaForTesting(
+      [&](VideoEncoderOutput, absl::optional<VideoEncoder::CodecDescription>) {
+        output_count_after_change++;
+      });
+
+  vea()->SetEncodingCallback(base::BindLambdaForTesting(
+      [&](BitstreamBuffer&, bool keyframe, scoped_refptr<VideoFrame> frame) {
+        EXPECT_EQ(keyframe, true);
+        EXPECT_EQ(frame->format(), pixel_format);
+        EXPECT_EQ(frame->coded_size(), options.frame_size);
+        return BitstreamBufferMetadata(1, keyframe, frame->timestamp());
+      }));
+  adapter()->Initialize(profile_, options, std::move(first_output_cb),
+                        ValidatingStatusCB());
+  // We must encode one frame before we can change options.
+  auto first_frame =
+      CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(1));
+  adapter()->Encode(first_frame, true, ValidatingStatusCB());
+  RunUntilIdle();
+
+  options.bitrate = Bitrate::VariableBitrate(12345u, 23456u);
+  adapter()->ChangeOptions(options, std::move(second_output_cb),
+                           ValidatingStatusCB());
+  auto second_frame =
+      CreateGreenFrame(options.frame_size, pixel_format, base::Milliseconds(2));
+  adapter()->Encode(second_frame, true, ValidatingStatusCB());
+  RunUntilIdle();
+
+  EXPECT_EQ(output_count_before_change, 1);
+  EXPECT_EQ(output_count_after_change, 1);
+}
+
 INSTANTIATE_TEST_SUITE_P(VideoEncodeAcceleratorAdapterTest,
                          VideoEncodeAcceleratorAdapterTest,
                          ::testing::Values(PIXEL_FORMAT_I420,
diff --git a/net/base/connection_endpoint_metadata.cc b/net/base/connection_endpoint_metadata.cc
index 1f78d2f9..7930fa8 100644
--- a/net/base/connection_endpoint_metadata.cc
+++ b/net/base/connection_endpoint_metadata.cc
@@ -57,7 +57,7 @@
   ConnectionEndpointMetadata metadata;
 
   std::vector<std::string> alpns;
-  for (const base::Value& value : alpns_value->GetList()) {
+  for (const base::Value& value : alpns_value->GetListDeprecated()) {
     if (!value.is_string())
       return absl::nullopt;
     metadata.supported_protocol_alpns.push_back(value.GetString());
diff --git a/net/base/features.cc b/net/base/features.cc
index 781610c..5bbbb56 100644
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -254,5 +254,8 @@
 const base::Feature kRecordRadioWakeupTrigger{
     "RecordRadioWakeupTrigger", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kSandboxHttpCache("SandboxHttpCache",
+                                      base::FEATURE_DISABLED_BY_DEFAULT);
+
 }  // namespace features
 }  // namespace net
diff --git a/net/base/features.h b/net/base/features.h
index de3606b..5401e2d 100644
--- a/net/base/features.h
+++ b/net/base/features.h
@@ -382,6 +382,10 @@
 // Android.
 NET_EXPORT extern const base::Feature kRecordRadioWakeupTrigger;
 
+// When enabled, certain operations in the HTTP cache are brokered to allow
+// the network process to be sandboxed.
+NET_EXPORT extern const base::Feature kSandboxHttpCache;
+
 }  // namespace features
 }  // namespace net
 
diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc
index 015a1f93..f46e7cd 100644
--- a/net/base/mime_util.cc
+++ b/net/base/mime_util.cc
@@ -175,6 +175,12 @@
     {"text/xml", "xml"},
     {"video/mp4", "mp4,m4v"},
     {"video/ogg", "ogv,ogm"},
+
+    // This is a primary mapping (overrides the platform) rather than secondary
+    // to work around an issue when Excel is installed on Windows. Excel
+    // registers csv as application/vnd.ms-excel instead of text/csv from RFC
+    // 4180. See https://crbug.com/139105.
+    {"text/csv", "csv"},
 };
 
 // See comments above for details on how this list is used.
@@ -216,7 +222,6 @@
     {"image/x-xbitmap", "xbm"},
     {"message/rfc822", "eml"},
     {"text/calendar", "ics"},
-    {"text/csv", "csv"},
     {"text/html", "ehtml"},
     {"text/plain", "txt,text"},
     {"text/x-sh", "sh"},
diff --git a/net/base/mime_util_unittest.cc b/net/base/mime_util_unittest.cc
index 539033c..6c7a0ec 100644
--- a/net/base/mime_util_unittest.cc
+++ b/net/base/mime_util_unittest.cc
@@ -47,6 +47,7 @@
       {FILE_PATH_LITERAL("zip"), "application/zip"},
       {FILE_PATH_LITERAL("ics"), "text/calendar"},
       {FILE_PATH_LITERAL("m3u8"), "application/x-mpegurl"},
+      {FILE_PATH_LITERAL("csv"), "text/csv"},
       {FILE_PATH_LITERAL("not an extension / for sure"), nullptr},
       {containsNullByte, nullptr}};
 
@@ -97,6 +98,7 @@
                              // android-arm[64]-test and Linux. Possibly more.
          "audio/mpegurl",    // System override for mac.
      }},
+    {FILE_PATH_LITERAL("csv"), {"text/csv"}},
     {FILE_PATH_LITERAL("not an extension / for sure"), {}},
     {containsNullByte, {}}
   };
@@ -385,8 +387,6 @@
   EXPECT_FALSE(ParseMimeTypeWithoutParameter("text\n/plain", nullptr, nullptr));
   EXPECT_FALSE(
       ParseMimeTypeWithoutParameter("text/\nplain ", nullptr, nullptr));
-
-  //EXPECT_TRUE(ParseMimeTypeWithoutParameter("video/mime;parameter"));
 }
 
 TEST(MimeUtilTest, TestIsValidTopLevelMimeType) {
diff --git a/net/cert/crl_set.cc b/net/cert/crl_set.cc
index 24ceee3..bf9a99d 100644
--- a/net/cert/crl_set.cc
+++ b/net/cert/crl_set.cc
@@ -132,7 +132,7 @@
     // Hash lists are optional so it's not an error if not present.
     return true;
   }
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
 
   out->clear();
   out->reserve(list_view.size());
diff --git a/net/cert/internal/name_constraints.cc b/net/cert/internal/name_constraints.cc
index 984a8ad7..d865046 100644
--- a/net/cert/internal/name_constraints.cc
+++ b/net/cert/internal/name_constraints.cc
@@ -73,10 +73,9 @@
       name[0] == '*' && name[1] == '.') {
     size_t dns_constraint_dot_pos = dns_constraint.find('.');
     if (dns_constraint_dot_pos != std::string::npos) {
-      base::StringPiece dns_constraint_domain(
-          dns_constraint.begin() + dns_constraint_dot_pos + 1,
-          dns_constraint.size() - dns_constraint_dot_pos - 1);
-      base::StringPiece wildcard_domain(name.begin() + 2, name.size() - 2);
+      base::StringPiece dns_constraint_domain =
+          dns_constraint.substr(dns_constraint_dot_pos + 1);
+      base::StringPiece wildcard_domain = name.substr(2);
       if (base::EqualsCaseInsensitiveASCII(wildcard_domain,
                                            dns_constraint_domain)) {
         return true;
diff --git a/net/cert/multi_log_ct_verifier_unittest.cc b/net/cert/multi_log_ct_verifier_unittest.cc
index bf944c2..3e36d86 100644
--- a/net/cert/multi_log_ct_verifier_unittest.cc
+++ b/net/cert/multi_log_ct_verifier_unittest.cc
@@ -86,10 +86,10 @@
       return false;
 
     const base::Value* scts = parsed.params.FindListPath("scts");
-    if (!scts || scts->GetList().size() != 1)
+    if (!scts || scts->GetListDeprecated().size() != 1)
       return false;
 
-    const base::Value& the_sct = scts->GetList()[0];
+    const base::Value& the_sct = scts->GetListDeprecated()[0];
     if (!the_sct.is_dict())
       return false;
 
diff --git a/net/dns/host_cache.cc b/net/dns/host_cache.cc
index b1f3360..0d3813b 100644
--- a/net/dns/host_cache.cc
+++ b/net/dns/host_cache.cc
@@ -143,7 +143,7 @@
   }
 
   out_list->emplace();
-  for (const auto& it : value->GetList()) {
+  for (const auto& it : value->GetListDeprecated()) {
     IPAddress address;
     const std::string* addr_string = it.GetIfString();
     if (!addr_string || !address.AssignFromIPLiteral(*addr_string)) {
@@ -993,7 +993,7 @@
     if (ip_endpoints_value) {
       ip_endpoints.emplace();
       for (const base::Value& ip_endpoint_value :
-           ip_endpoints_value->GetList()) {
+           ip_endpoints_value->GetListDeprecated()) {
         absl::optional<IPEndPoint> ip_endpoint =
             IpEndpointFromValue(ip_endpoint_value);
         if (!ip_endpoint)
@@ -1008,7 +1008,7 @@
     if (endpoint_metadatas_value) {
       endpoint_metadatas.emplace();
       for (const base::Value& endpoint_metadata_value :
-           endpoint_metadatas_value->GetList()) {
+           endpoint_metadatas_value->GetListDeprecated()) {
         absl::optional<
             std::pair<HttpsRecordPriority, ConnectionEndpointMetadata>>
             pair = EndpointMetadataPairFromValue(endpoint_metadata_value);
@@ -1021,7 +1021,8 @@
     absl::optional<std::set<std::string>> aliases;
     if (aliases_value) {
       aliases.emplace();
-      for (const base::Value& alias_value : aliases_value->GetList()) {
+      for (const base::Value& alias_value :
+           aliases_value->GetListDeprecated()) {
         if (!alias_value.is_string())
           return false;
         aliases->insert(alias_value.GetString());
@@ -1037,7 +1038,7 @@
     absl::optional<std::vector<std::string>> text_records;
     if (text_records_value) {
       text_records.emplace();
-      for (const base::Value& value : text_records_value->GetList()) {
+      for (const base::Value& value : text_records_value->GetListDeprecated()) {
         if (!value.is_string())
           return false;
         text_records.value().push_back(value.GetString());
@@ -1047,23 +1048,24 @@
     absl::optional<std::vector<HostPortPair>> hostname_records;
     if (hostname_records_value) {
       DCHECK(host_ports_value);
-      if (hostname_records_value->GetList().size() !=
-          host_ports_value->GetList().size()) {
+      if (hostname_records_value->GetListDeprecated().size() !=
+          host_ports_value->GetListDeprecated().size()) {
         return false;
       }
 
       hostname_records.emplace();
-      for (size_t i = 0; i < hostname_records_value->GetList().size(); ++i) {
-        if (!hostname_records_value->GetList()[i].is_string() ||
-            !host_ports_value->GetList()[i].is_int() ||
+      for (size_t i = 0; i < hostname_records_value->GetListDeprecated().size();
+           ++i) {
+        if (!hostname_records_value->GetListDeprecated()[i].is_string() ||
+            !host_ports_value->GetListDeprecated()[i].is_int() ||
             !base::IsValueInRangeForNumericType<uint16_t>(
-                host_ports_value->GetList()[i].GetInt())) {
+                host_ports_value->GetListDeprecated()[i].GetInt())) {
           return false;
         }
-        hostname_records.value().push_back(
-            HostPortPair(hostname_records_value->GetList()[i].GetString(),
-                         base::checked_cast<uint16_t>(
-                             host_ports_value->GetList()[i].GetInt())));
+        hostname_records.value().push_back(HostPortPair(
+            hostname_records_value->GetListDeprecated()[i].GetString(),
+            base::checked_cast<uint16_t>(
+                host_ports_value->GetListDeprecated()[i].GetInt())));
       }
     }
 
diff --git a/net/dns/public/dns_query_type.h b/net/dns/public/dns_query_type.h
index ec020e1..f529c0b 100644
--- a/net/dns/public/dns_query_type.h
+++ b/net/dns/public/dns_query_type.h
@@ -32,7 +32,7 @@
 using DnsQueryTypeSet =
     base::EnumSet<DnsQueryType, DnsQueryType::UNSPECIFIED, DnsQueryType::MAX>;
 
-constexpr auto kDnsQueryTypes =
+inline constexpr auto kDnsQueryTypes =
     base::MakeFixedFlatMap<DnsQueryType, base::StringPiece>(
         {{DnsQueryType::UNSPECIFIED, "UNSPECIFIED"},
          {DnsQueryType::A, "A"},
diff --git a/net/dns/public/secure_dns_mode.h b/net/dns/public/secure_dns_mode.h
index 5178b12..bab665a3 100644
--- a/net/dns/public/secure_dns_mode.h
+++ b/net/dns/public/secure_dns_mode.h
@@ -24,7 +24,7 @@
   kSecure = 2,
 };
 
-constexpr auto kSecureDnsModes =
+inline constexpr auto kSecureDnsModes =
     base::MakeFixedFlatMap<SecureDnsMode, base::StringPiece>(
         {{SecureDnsMode::kOff, "Off"},
          {SecureDnsMode::kAutomatic, "Automatic"},
diff --git a/net/http/http_server_properties_manager.cc b/net/http/http_server_properties_manager.cc
index bcbf0ddb..89a9ffca 100644
--- a/net/http/http_server_properties_manager.cc
+++ b/net/http/http_server_properties_manager.cc
@@ -279,8 +279,8 @@
   // Iterate servers list in reverse MRU order so that entries are inserted
   // into |spdy_servers_map|, |alternative_service_map|, and
   // |server_network_stats_map| from oldest to newest.
-  for (auto it = servers_list->GetList().end();
-       it != servers_list->GetList().begin();) {
+  for (auto it = servers_list->GetListDeprecated().end();
+       it != servers_list->GetListDeprecated().begin();) {
     --it;
     if (!it->is_dict()) {
       DVLOG(1) << "Malformed http_server_properties for servers dictionary.";
@@ -305,8 +305,8 @@
             kMaxRecentlyBrokenAlternativeServiceEntries);
 
     // Iterate list in reverse-MRU order
-    for (auto it = broken_alt_svc_list->GetList().end();
-         it != broken_alt_svc_list->GetList().begin();) {
+    for (auto it = broken_alt_svc_list->GetListDeprecated().end();
+         it != broken_alt_svc_list->GetListDeprecated().begin();) {
       --it;
       if (!it->is_dict()) {
         DVLOG(1) << "Malformed broken alterantive service entry.";
@@ -538,7 +538,7 @@
       return false;
     }
     quic::ParsedQuicVersionVector advertised_versions;
-    for (const auto& value : versions_list->GetList()) {
+    for (const auto& value : versions_list->GetListDeprecated()) {
       const std::string* version_string = value.GetIfString();
       if (!version_string) {
         DVLOG(1) << "Malformed alternative service version for server: "
@@ -573,7 +573,7 @@
 
   AlternativeServiceInfoVector alternative_service_info_vector;
   for (const auto& alternative_service_list_item :
-       alternative_service_list->GetList()) {
+       alternative_service_list->GetListDeprecated()) {
     if (!alternative_service_list_item.is_dict())
       return false;
     AlternativeServiceInfo alternative_service_info;
@@ -653,7 +653,8 @@
     return;
   }
 
-  for (const auto& quic_server_info_value : quic_server_info_list->GetList()) {
+  for (const auto& quic_server_info_value :
+       quic_server_info_list->GetListDeprecated()) {
     if (!quic_server_info_value.is_dict())
       continue;
 
diff --git a/net/http/http_server_properties_manager_unittest.cc b/net/http/http_server_properties_manager_unittest.cc
index 5c839123..dffc4d00 100644
--- a/net/http/http_server_properties_manager_unittest.cc
+++ b/net/http/http_server_properties_manager_unittest.cc
@@ -1175,8 +1175,9 @@
   base::Value* broken_alt_svc_list =
       server_dict.FindListKey("broken_alternative_services");
   ASSERT_TRUE(broken_alt_svc_list);
-  ASSERT_EQ(2u, broken_alt_svc_list->GetList().size());
-  base::Value& broken_alt_svcs_list_entry = broken_alt_svc_list->GetList()[0];
+  ASSERT_EQ(2u, broken_alt_svc_list->GetListDeprecated().size());
+  base::Value& broken_alt_svcs_list_entry =
+      broken_alt_svc_list->GetListDeprecated()[0];
   const std::string* broken_until_str =
       broken_alt_svcs_list_entry.FindStringKey("broken_until");
   ASSERT_TRUE(broken_until_str);
@@ -1351,7 +1352,7 @@
 
   const base::Value* servers_list = pref_dict->FindListKey("servers");
   ASSERT_TRUE(servers_list);
-  auto it = servers_list->GetList().begin();
+  auto it = servers_list->GetListDeprecated().begin();
   const base::Value& server_pref_dict = *it;
   ASSERT_TRUE(server_pref_dict.is_dict());
 
@@ -1363,22 +1364,22 @@
       server_pref_dict.FindKey("isolation");
   ASSERT_TRUE(network_isolation_key_value);
   ASSERT_EQ(base::Value::Type::LIST, network_isolation_key_value->type());
-  EXPECT_TRUE(network_isolation_key_value->GetList().empty());
+  EXPECT_TRUE(network_isolation_key_value->GetListDeprecated().empty());
 
   const base::Value* altsvc_list =
       server_pref_dict.FindListKey("alternative_service");
   ASSERT_TRUE(altsvc_list);
 
-  ASSERT_EQ(2u, altsvc_list->GetList().size());
+  ASSERT_EQ(2u, altsvc_list->GetListDeprecated().size());
 
-  const base::Value& altsvc_entry = altsvc_list->GetList()[0];
+  const base::Value& altsvc_entry = altsvc_list->GetListDeprecated()[0];
   ASSERT_TRUE(altsvc_entry.is_dict());
   const std::string* hostname = altsvc_entry.FindStringKey("host");
 
   ASSERT_TRUE(hostname);
   EXPECT_EQ("broken.example.com", *hostname);
 
-  const base::Value& altsvc_entry2 = altsvc_list->GetList()[1];
+  const base::Value& altsvc_entry2 = altsvc_list->GetListDeprecated()[1];
   ASSERT_TRUE(altsvc_entry.is_dict());
   hostname = altsvc_entry2.FindStringKey("host");
   ASSERT_TRUE(hostname);
@@ -3026,8 +3027,8 @@
     const base::Value* servers_list = preferences_dict->FindListKey("servers");
     ASSERT_TRUE(servers_list);
     ASSERT_TRUE(servers_list->is_list());
-    ASSERT_EQ(servers_list->GetList().size(), 1u);
-    const base::Value& server_dict = servers_list->GetList()[0];
+    ASSERT_EQ(servers_list->GetListDeprecated().size(), 1u);
+    const base::Value& server_dict = servers_list->GetListDeprecated()[0];
     HttpServerProperties::ServerInfo server_info;
     EXPECT_TRUE(HttpServerPropertiesManager::ParseAlternativeServiceInfo(
         server, server_dict, &server_info));
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc
index a455944..366a40b 100644
--- a/net/http/http_stream_factory_unittest.cc
+++ b/net/http/http_stream_factory_unittest.cc
@@ -1054,7 +1054,7 @@
       session->spdy_session_pool()->SpdySessionPoolInfoToValue());
   if (!value || !value->is_list())
     return -1;
-  return value->GetList().size();
+  return value->GetListDeprecated().size();
 }
 
 // Return count of sockets handed out by a given socket pool.
@@ -1070,7 +1070,7 @@
   base::Value* session_list = dict.FindListKey("sessions");
   if (!session_list)
     return -1;
-  return session_list->GetList().size();
+  return session_list->GetListDeprecated().size();
 }
 
 TEST_F(HttpStreamFactoryTest, PrivacyModeUsesDifferentSocketPoolGroup) {
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc
index 174aae7..228405ee 100644
--- a/net/http/transport_security_state_unittest.cc
+++ b/net/http/transport_security_state_unittest.cc
@@ -254,10 +254,11 @@
   ASSERT_TRUE(cert_list->is_list());
   std::vector<std::string> pem_encoded_chain;
   cert_chain->GetPEMEncodedChain(&pem_encoded_chain);
-  ASSERT_EQ(pem_encoded_chain.size(), cert_list->GetList().size());
+  ASSERT_EQ(pem_encoded_chain.size(), cert_list->GetListDeprecated().size());
 
   for (size_t i = 0; i < pem_encoded_chain.size(); i++) {
-    const std::string& list_cert = cert_list->GetList()[i].GetString();
+    const std::string& list_cert =
+        cert_list->GetListDeprecated()[i].GetString();
     EXPECT_EQ(pem_encoded_chain[i], list_cert);
   }
 }
diff --git a/net/log/file_net_log_observer_unittest.cc b/net/log/file_net_log_observer_unittest.cc
index 16e7ba5..0a554da 100644
--- a/net/log/file_net_log_observer_unittest.cc
+++ b/net/log/file_net_log_observer_unittest.cc
@@ -150,10 +150,10 @@
 
 // Returns the event at index |i|, or nullptr if there is none.
 const base::Value* ParsedNetLog::GetEvent(size_t i) const {
-  if (!events || i >= events->GetList().size())
+  if (!events || i >= events->GetListDeprecated().size())
     return nullptr;
 
-  const base::Value& value = events->GetList()[i];
+  const base::Value& value = events->GetListDeprecated()[i];
   if (!value.is_dict())
     return nullptr;
 
@@ -189,7 +189,7 @@
                        size_t num_events_saved) {
   ASSERT_TRUE(log);
   ASSERT_LE(num_events_saved, num_events_emitted);
-  ASSERT_EQ(num_events_saved, log->events->GetList().size());
+  ASSERT_EQ(num_events_saved, log->events->GetListDeprecated().size());
 
   // The last |num_events_saved| should all be sequential, with the last one
   // being numbered |num_events_emitted - 1|.
@@ -442,7 +442,7 @@
   // Verify the written log.
   std::unique_ptr<ParsedNetLog> log = ReadNetLogFromDisk(log_path_);
   ASSERT_TRUE(log);
-  ASSERT_EQ(0u, log->events->GetList().size());
+  ASSERT_EQ(0u, log->events->GetListDeprecated().size());
 }
 
 TEST_P(FileNetLogObserverTest, GeneratesValidJSONWithOneEvent) {
@@ -460,7 +460,7 @@
   // Verify the written log.
   std::unique_ptr<ParsedNetLog> log = ReadNetLogFromDisk(log_path_);
   ASSERT_TRUE(log);
-  ASSERT_EQ(1u, log->events->GetList().size());
+  ASSERT_EQ(1u, log->events->GetListDeprecated().size());
 }
 
 TEST_P(FileNetLogObserverTest, GeneratesValidJSONWithOneEventPreExisting) {
@@ -478,7 +478,7 @@
   // Verify the written log.
   std::unique_ptr<ParsedNetLog> log = ReadNetLogFromDisk(log_path_);
   ASSERT_TRUE(log);
-  ASSERT_EQ(1u, log->events->GetList().size());
+  ASSERT_EQ(1u, log->events->GetListDeprecated().size());
 }
 
 TEST_P(FileNetLogObserverTest, PreExistingFileBroken) {
@@ -547,7 +547,7 @@
   // Verify the written log.
   std::unique_ptr<ParsedNetLog> log = ReadNetLogFromDisk(log_path_);
   ASSERT_TRUE(log);
-  ASSERT_EQ(0u, log->events->GetList().size());
+  ASSERT_EQ(0u, log->events->GetListDeprecated().size());
 
   // Make sure additional information is present and validate it.
   ASSERT_TRUE(log->polled_data);
@@ -642,7 +642,7 @@
   ASSERT_TRUE(log);
   // Check that the expected number of events were written to disk.
   EXPECT_EQ(kNumEventsAddedPerThread * kNumThreads,
-            log->events->GetList().size());
+            log->events->GetListDeprecated().size());
 
 #if BUILDFLAG(IS_FUCHSIA)
   LOG(ERROR) << "Teardown.";
@@ -956,7 +956,7 @@
   // Verify the written log.
   std::unique_ptr<ParsedNetLog> log = ReadNetLogFromDisk(log_path_);
   ASSERT_TRUE(log);
-  ASSERT_EQ(0u, log->events->GetList().size());
+  ASSERT_EQ(0u, log->events->GetListDeprecated().size());
 }
 
 // Make sure that when using bounded mode with a pre-existing output file,
@@ -1016,7 +1016,7 @@
   // Verify the written log.
   std::unique_ptr<ParsedNetLog> log = ReadNetLogFromDisk(log_path_);
   ASSERT_TRUE(log);
-  ASSERT_EQ(3u, log->events->GetList().size());
+  ASSERT_EQ(3u, log->events->GetListDeprecated().size());
 }
 
 void AddEntriesViaNetLog(NetLog* net_log, int num_entries) {
diff --git a/net/log/net_log_event_type_list.h b/net/log/net_log_event_type_list.h
index 5f6261d..b161f02 100644
--- a/net/log/net_log_event_type_list.h
+++ b/net/log/net_log_event_type_list.h
@@ -4123,3 +4123,16 @@
 //    "read_buffer_size_in_bytes": <New read buffer size in bytes>,
 // }
 EVENT_TYPE(WEBSOCKET_READ_BUFFER_SIZE_CHANGED)
+
+// This event is logged to show the received frame header information. It
+// contains the following parameters:
+// {
+//    "final": <Whether it is the last fragment in a message>,
+//    "reserved1": <Whether any extension is defined>,
+//    "reserved2": <Whether any extension is defined>,
+//    "reserved3": <Whether any extension is defined>,
+//    "opcode": <Opcode in the frame header>,
+//    "masked": <Whether the message is encoded>,
+//    "payload_length": <Payload length in the frame header>,
+// }
+EVENT_TYPE(WEBSOCKET_RECV_FRAME_HEADER)
diff --git a/net/log/net_log_util_unittest.cc b/net/log/net_log_util_unittest.cc
index 7492acd..9c755a5 100644
--- a/net/log/net_log_util_unittest.cc
+++ b/net/log/net_log_util_unittest.cc
@@ -80,7 +80,7 @@
   ASSERT_TRUE(net_info.is_dict());
   base::Value* trials = net_info.FindListPath("activeFieldTrialGroups");
   ASSERT_NE(nullptr, trials);
-  const auto& trial_list = trials->GetList();
+  const auto& trial_list = trials->GetListDeprecated();
   EXPECT_EQ(1u, trial_list.size());
   EXPECT_TRUE(trial_list[0].is_string());
   EXPECT_EQ("NewFieldTrial:Active", trial_list[0].GetString());
diff --git a/net/log/trace_net_log_observer_unittest.cc b/net/log/trace_net_log_observer_unittest.cc
index e517ce5..15ecb779 100644
--- a/net/log/trace_net_log_observer_unittest.cc
+++ b/net/log/trace_net_log_observer_unittest.cc
@@ -122,7 +122,7 @@
       base::RunLoop* run_loop,
       const scoped_refptr<base::RefCountedString>& events_str,
       bool has_more_events) {
-    DCHECK(trace_events_->GetList().empty());
+    DCHECK(trace_events_->GetListDeprecated().empty());
     trace_buffer_.Start();
     trace_buffer_.AddFragment(events_str->data());
     trace_buffer_.Finish();
@@ -158,8 +158,8 @@
     std::unique_ptr<base::Value> filtered_trace_events =
         std::make_unique<base::Value>(base::Value::Type::LIST);
 
-    for (size_t i = 0; i < trace_events->GetList().size(); i++) {
-      const base::Value* dict = &trace_events->GetList()[i];
+    for (size_t i = 0; i < trace_events->GetListDeprecated().size(); i++) {
+      const base::Value* dict = &trace_events->GetListDeprecated()[i];
       if (!dict->is_dict()) {
         ADD_FAILURE() << "Unexpected non-dictionary event in trace_events";
         continue;
@@ -179,7 +179,9 @@
 
   base::Value* trace_events() const { return trace_events_.get(); }
 
-  size_t trace_events_size() const { return trace_events_->GetList().size(); }
+  size_t trace_events_size() const {
+    return trace_events_->GetListDeprecated().size();
+  }
 
   RecordingNetLogObserver* net_log_observer() { return &net_log_observer_; }
 
@@ -243,12 +245,12 @@
   EndTraceAndFlush();
   trace_net_log_observer()->StopWatchForTraceStart();
   EXPECT_EQ(3u, trace_events_size());
-  const base::Value* item1 = &trace_events()->GetList()[0];
+  const base::Value* item1 = &trace_events()->GetListDeprecated()[0];
   ASSERT_TRUE(item1->is_dict());
-  const base::Value* item2 = &trace_events()->GetList()[1];
+  const base::Value* item2 = &trace_events()->GetListDeprecated()[1];
   ;
   ASSERT_TRUE(item2->is_dict());
-  const base::Value* item3 = &trace_events()->GetList()[2];
+  const base::Value* item3 = &trace_events()->GetListDeprecated()[2];
   ;
   ASSERT_TRUE(item3->is_dict());
 
@@ -298,9 +300,9 @@
   auto entries = net_log_observer()->GetEntries();
   EXPECT_EQ(3u, entries.size());
   EXPECT_EQ(2u, trace_events_size());
-  const base::Value* item1 = &trace_events()->GetList()[0];
+  const base::Value* item1 = &trace_events()->GetListDeprecated()[0];
   ASSERT_TRUE(item1->is_dict());
-  const base::Value* item2 = &trace_events()->GetList()[1];
+  const base::Value* item2 = &trace_events()->GetListDeprecated()[1];
   ASSERT_TRUE(item2->is_dict());
 
   TraceEntryInfo actual_item1 = GetTraceEntryInfoFromValue(*item1);
@@ -338,7 +340,7 @@
   EXPECT_EQ(2u, entries.size());
   EXPECT_EQ(1u, trace_events_size());
 
-  const base::Value* item1 = &trace_events()->GetList()[0];
+  const base::Value* item1 = &trace_events()->GetListDeprecated()[0];
   ASSERT_TRUE(item1->is_dict());
 
   TraceEntryInfo actual_item1 = GetTraceEntryInfoFromValue(*item1);
@@ -418,9 +420,9 @@
   auto entries = net_log_observer()->GetEntries();
   EXPECT_EQ(2u, entries.size());
   EXPECT_EQ(2u, trace_events_size());
-  const base::Value* item1 = &trace_events()->GetList()[0];
+  const base::Value* item1 = &trace_events()->GetListDeprecated()[0];
   ASSERT_TRUE(item1->is_dict());
-  const base::Value* item2 = &trace_events()->GetList()[1];
+  const base::Value* item2 = &trace_events()->GetListDeprecated()[1];
   ASSERT_TRUE(item2->is_dict());
 
   TraceEntryInfo actual_item1 = GetTraceEntryInfoFromValue(*item1);
diff --git a/net/network_error_logging/network_error_logging_service_unittest.cc b/net/network_error_logging/network_error_logging_service_unittest.cc
index fe7084b..c8c3ff2 100644
--- a/net/network_error_logging/network_error_logging_service_unittest.cc
+++ b/net/network_error_logging/network_error_logging_service_unittest.cc
@@ -1252,7 +1252,8 @@
                               NetworkErrorLoggingService::kInnerUrlKey);
   base::ExpectStringValue(
       kCertUrl_.spec(),
-      sxg_body->FindKey(NetworkErrorLoggingService::kCertUrlKey)->GetList()[0]);
+      sxg_body->FindKey(NetworkErrorLoggingService::kCertUrlKey)
+          ->GetListDeprecated()[0]);
 }
 
 TEST_P(NetworkErrorLoggingServiceTest, FailureReportQueued_SignedExchange) {
@@ -1303,7 +1304,8 @@
                               NetworkErrorLoggingService::kInnerUrlKey);
   base::ExpectStringValue(
       kCertUrl_.spec(),
-      sxg_body->FindKey(NetworkErrorLoggingService::kCertUrlKey)->GetList()[0]);
+      sxg_body->FindKey(NetworkErrorLoggingService::kCertUrlKey)
+          ->GetListDeprecated()[0]);
 }
 
 TEST_P(NetworkErrorLoggingServiceTest, MismatchingSubdomain_SignedExchange) {
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index d984117b..6b4f63b 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -138,7 +138,7 @@
   std::string header_prefix = base::StrCat({key, ": "});
   std::string expected_header = base::StrCat({header_prefix, expected_value});
 
-  auto header_list = headers->GetList();
+  auto header_list = headers->GetListDeprecated();
   auto header_it = header_list.begin();
   bool header_found = false;
   while (header_it != header_list.end()) {
diff --git a/net/reporting/reporting_delivery_agent_unittest.cc b/net/reporting/reporting_delivery_agent_unittest.cc
index 1000959..341d8b7 100644
--- a/net/reporting/reporting_delivery_agent_unittest.cc
+++ b/net/reporting/reporting_delivery_agent_unittest.cc
@@ -158,9 +158,9 @@
     auto value = pending_uploads()[0]->GetValue();
 
     ASSERT_TRUE(value->is_list());
-    ASSERT_EQ(1u, value->GetList().size());
+    ASSERT_EQ(1u, value->GetListDeprecated().size());
 
-    base::Value& report = value->GetList()[0];
+    base::Value& report = value->GetListDeprecated()[0];
     ASSERT_TRUE(report.is_dict());
     EXPECT_EQ(5u, report.DictSize());
 
@@ -234,9 +234,9 @@
     const auto value = pending_uploads()[0]->GetValue();
 
     ASSERT_TRUE(value->is_list());
-    ASSERT_EQ(1u, value->GetList().size());
+    ASSERT_EQ(1u, value->GetListDeprecated().size());
 
-    const base::Value& report = value->GetList()[0];
+    const base::Value& report = value->GetListDeprecated()[0];
     ASSERT_TRUE(report.is_dict());
 
     ExpectDictIntegerValue(0, report, "age");
@@ -312,9 +312,9 @@
     auto value = pending_uploads()[0]->GetValue();
 
     ASSERT_TRUE(value->is_list());
-    ASSERT_EQ(1u, value->GetList().size());
+    ASSERT_EQ(1u, value->GetListDeprecated().size());
 
-    base::Value& report = value->GetList()[0];
+    base::Value& report = value->GetListDeprecated()[0];
     ASSERT_TRUE(report.is_dict());
     EXPECT_EQ(5u, report.DictSize());
 
@@ -391,9 +391,9 @@
     auto value = pending_uploads()[0]->GetValue();
 
     ASSERT_TRUE(value->is_list());
-    ASSERT_EQ(1u, value->GetList().size());
+    ASSERT_EQ(1u, value->GetListDeprecated().size());
 
-    base::Value& report = value->GetList()[0];
+    base::Value& report = value->GetListDeprecated()[0];
     ASSERT_TRUE(report.is_dict());
     EXPECT_EQ(5u, report.DictSize());
 
diff --git a/net/reporting/reporting_header_parser.cc b/net/reporting/reporting_header_parser.cc
index 3bd3d1a..968006c 100644
--- a/net/reporting/reporting_header_parser.cc
+++ b/net/reporting/reporting_header_parser.cc
@@ -166,7 +166,7 @@
 
   std::vector<ReportingEndpoint::EndpointInfo> endpoints;
 
-  for (const base::Value& endpoint : endpoint_list->GetList()) {
+  for (const base::Value& endpoint : endpoint_list->GetListDeprecated()) {
     ReportingEndpoint::EndpointInfo parsed_endpoint;
     if (ProcessEndpoint(delegate, group_key, endpoint, &parsed_endpoint))
       endpoints.push_back(std::move(parsed_endpoint));
@@ -286,8 +286,8 @@
 
   std::vector<ReportingEndpointGroup> parsed_header;
 
-  for (size_t i = 0; i < value->GetList().size(); i++) {
-    const base::Value& group_value = value->GetList()[i];
+  for (size_t i = 0; i < value->GetListDeprecated().size(); i++) {
+    const base::Value& group_value = value->GetListDeprecated()[i];
     ReportingEndpointGroup parsed_endpoint_group;
     if (ProcessEndpointGroup(delegate, cache, network_isolation_key, origin,
                              group_value, &parsed_endpoint_group)) {
@@ -295,7 +295,7 @@
     }
   }
 
-  if (parsed_header.empty() && value->GetList().size() > 0) {
+  if (parsed_header.empty() && value->GetListDeprecated().size() > 0) {
     RecordReportingHeaderType(ReportingHeaderType::kReportToInvalid);
   }
 
diff --git a/net/spdy/spdy_log_util_unittest.cc b/net/spdy/spdy_log_util_unittest.cc
index 339b255..723b130d 100644
--- a/net/spdy/spdy_log_util_unittest.cc
+++ b/net/spdy/spdy_log_util_unittest.cc
@@ -75,14 +75,14 @@
   auto* header_list = dict->FindKey("headers");
   ASSERT_TRUE(header_list);
   ASSERT_TRUE(header_list->is_list());
-  ASSERT_EQ(2u, header_list->GetList().size());
+  ASSERT_EQ(2u, header_list->GetListDeprecated().size());
 
-  ASSERT_TRUE(header_list->GetList()[0].is_string());
-  EXPECT_EQ("foo: bar", header_list->GetList()[0].GetString());
+  ASSERT_TRUE(header_list->GetListDeprecated()[0].is_string());
+  EXPECT_EQ("foo: bar", header_list->GetListDeprecated()[0].GetString());
 
-  ASSERT_TRUE(header_list->GetList()[1].is_string());
+  ASSERT_TRUE(header_list->GetListDeprecated()[1].is_string());
   EXPECT_EQ("cookie: [10 bytes were stripped]",
-            header_list->GetList()[1].GetString());
+            header_list->GetListDeprecated()[1].GetString());
 
   dict = base::Value::ToUniquePtrValue(Http2HeaderBlockNetLogParams(
       &headers, NetLogCaptureMode::kIncludeSensitive));
@@ -94,13 +94,14 @@
   header_list = dict->FindKey("headers");
   ASSERT_TRUE(header_list);
   ASSERT_TRUE(header_list->is_list());
-  ASSERT_EQ(2u, header_list->GetList().size());
+  ASSERT_EQ(2u, header_list->GetListDeprecated().size());
 
-  ASSERT_TRUE(header_list->GetList()[0].is_string());
-  EXPECT_EQ("foo: bar", header_list->GetList()[0].GetString());
+  ASSERT_TRUE(header_list->GetListDeprecated()[0].is_string());
+  EXPECT_EQ("foo: bar", header_list->GetListDeprecated()[0].GetString());
 
-  ASSERT_TRUE(header_list->GetList()[1].is_string());
-  EXPECT_EQ("cookie: name=value", header_list->GetList()[1].GetString());
+  ASSERT_TRUE(header_list->GetListDeprecated()[1].is_string());
+  EXPECT_EQ("cookie: name=value",
+            header_list->GetListDeprecated()[1].GetString());
 }
 
 // Regression test for https://crbug.com/800282.
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index 92a64f2..c15f4b72 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -271,7 +271,7 @@
       std::unique_ptr<base::Value> value(
           session_->spdy_session_pool()->SpdySessionPoolInfoToValue());
       CHECK(value && value->is_list());
-      return value->GetList().size();
+      return value->GetListDeprecated().size();
     }
 
     HttpNetworkTransaction* trans() { return trans_.get(); }
@@ -4862,23 +4862,24 @@
   auto* header_list = entries[pos].params.FindKey("headers");
   ASSERT_TRUE(header_list);
   ASSERT_TRUE(header_list->is_list());
-  ASSERT_EQ(5u, header_list->GetList().size());
+  ASSERT_EQ(5u, header_list->GetListDeprecated().size());
 
-  ASSERT_TRUE(header_list->GetList()[0].is_string());
-  EXPECT_EQ(":method: GET", header_list->GetList()[0].GetString());
+  ASSERT_TRUE(header_list->GetListDeprecated()[0].is_string());
+  EXPECT_EQ(":method: GET", header_list->GetListDeprecated()[0].GetString());
 
-  ASSERT_TRUE(header_list->GetList()[1].is_string());
+  ASSERT_TRUE(header_list->GetListDeprecated()[1].is_string());
   EXPECT_EQ(":authority: www.example.org",
-            header_list->GetList()[1].GetString());
+            header_list->GetListDeprecated()[1].GetString());
 
-  ASSERT_TRUE(header_list->GetList()[2].is_string());
-  EXPECT_EQ(":scheme: https", header_list->GetList()[2].GetString());
+  ASSERT_TRUE(header_list->GetListDeprecated()[2].is_string());
+  EXPECT_EQ(":scheme: https", header_list->GetListDeprecated()[2].GetString());
 
-  ASSERT_TRUE(header_list->GetList()[3].is_string());
-  EXPECT_EQ(":path: /", header_list->GetList()[3].GetString());
+  ASSERT_TRUE(header_list->GetListDeprecated()[3].is_string());
+  EXPECT_EQ(":path: /", header_list->GetListDeprecated()[3].GetString());
 
-  ASSERT_TRUE(header_list->GetList()[4].is_string());
-  EXPECT_EQ("user-agent: Chrome", header_list->GetList()[4].GetString());
+  ASSERT_TRUE(header_list->GetListDeprecated()[4].is_string());
+  EXPECT_EQ("user-agent: Chrome",
+            header_list->GetListDeprecated()[4].GetString());
 }
 
 // Since we buffer the IO from the stream to the renderer, this test verifies
@@ -10464,7 +10465,7 @@
   ASSERT_TRUE(settings);
   ASSERT_TRUE(settings->is_list());
 
-  base::Value::ConstListView list = settings->GetList();
+  base::Value::ConstListView list = settings->GetListDeprecated();
   ASSERT_FALSE(list.empty());
   // Get last setting parameter.
   const base::Value& greased_setting = list[list.size() - 1];
diff --git a/net/tools/transport_security_state_generator/input_file_parsers.cc b/net/tools/transport_security_state_generator/input_file_parsers.cc
index bfd18fc..5eee1b6a 100644
--- a/net/tools/transport_security_state_generator/input_file_parsers.cc
+++ b/net/tools/transport_security_state_generator/input_file_parsers.cc
@@ -319,7 +319,7 @@
     return false;
   }
 
-  const auto preload_entries_list = preload_entries->GetList();
+  const auto preload_entries_list = preload_entries->GetListDeprecated();
   for (size_t i = 0; i < preload_entries_list.size(); ++i) {
     const base::Value& parsed = preload_entries_list[i];
     if (!parsed.is_dict()) {
@@ -391,7 +391,7 @@
     return false;
   }
 
-  const auto pinsets_list = pinsets_value->GetList();
+  const auto pinsets_list = pinsets_value->GetListDeprecated();
   for (size_t i = 0; i < pinsets_list.size(); ++i) {
     const base::Value& parsed = pinsets_list[i];
     if (!parsed.is_dict()) {
@@ -417,7 +417,7 @@
     const base::Value* pinset_static_hashes_list =
         parsed.FindListKey("static_spki_hashes");
     if (pinset_static_hashes_list) {
-      for (const auto& hash : pinset_static_hashes_list->GetList()) {
+      for (const auto& hash : pinset_static_hashes_list->GetListDeprecated()) {
         if (!hash.is_string()) {
           LOG(ERROR) << "Could not parse static spki hash "
                      << hash.DebugString() << " in the input JSON";
@@ -430,7 +430,8 @@
     const base::Value* pinset_bad_static_hashes_list =
         parsed.FindListKey("bad_static_spki_hashes");
     if (pinset_bad_static_hashes_list) {
-      for (const auto& hash : pinset_bad_static_hashes_list->GetList()) {
+      for (const auto& hash :
+           pinset_bad_static_hashes_list->GetListDeprecated()) {
         if (!hash.is_string()) {
           LOG(ERROR) << "Could not parse bad static spki hash "
                      << hash.DebugString() << " in the input JSON";
diff --git a/net/websockets/websocket_basic_stream.cc b/net/websockets/websocket_basic_stream.cc
index 263624b..542122f 100644
--- a/net/websockets/websocket_basic_stream.cc
+++ b/net/websockets/websocket_basic_stream.cc
@@ -111,6 +111,19 @@
   return dict;
 }
 
+base::Value NetLogFrameHeaderParam(const WebSocketFrameHeader* header) {
+  base::Value dict(base::Value::Type::DICTIONARY);
+  dict.SetBoolKey("final", header->final);
+  dict.SetBoolKey("reserved1", header->reserved1);
+  dict.SetBoolKey("reserved2", header->reserved2);
+  dict.SetBoolKey("reserved3", header->reserved3);
+  dict.SetIntKey("opcode", header->opcode);
+  dict.SetBoolKey("masked", header->masked);
+  dict.SetDoubleKey("payload_length",
+                    static_cast<double>(header->payload_length));
+  return dict;
+}
+
 }  // namespace
 
 WebSocketBasicStream::BufferSizeManager::BufferSizeManager() = default;
@@ -374,6 +387,10 @@
     auto& chunk = (*frame_chunks)[i];
     DCHECK(chunk == frame_chunks->back() || chunk->final_chunk)
         << "Only last chunk can have |final_chunk| set to be false.";
+    if (const auto& header = chunk->header) {
+      net_log_.AddEvent(net::NetLogEventType::WEBSOCKET_RECV_FRAME_HEADER,
+                        [&] { return NetLogFrameHeaderParam(header.get()); });
+    }
     std::unique_ptr<WebSocketFrame> frame;
     int result = ConvertChunkToFrame(std::move(chunk), &frame);
     if (result != OK)
diff --git a/printing/print_settings_conversion.cc b/printing/print_settings_conversion.cc
index 016887c..ed18b7a 100644
--- a/printing/print_settings_conversion.cc
+++ b/printing/print_settings_conversion.cc
@@ -82,7 +82,8 @@
   const base::Value* page_range_array =
       job_settings.FindListKey(kSettingPageRange);
   if (page_range_array) {
-    for (const base::Value& page_range : page_range_array->GetList()) {
+    for (const base::Value& page_range :
+         page_range_array->GetListDeprecated()) {
       if (!page_range.is_dict())
         continue;
 
diff --git a/remoting/base/auto_thread_task_runner.cc b/remoting/base/auto_thread_task_runner.cc
index 47b0f0e..0364e5b 100644
--- a/remoting/base/auto_thread_task_runner.cc
+++ b/remoting/base/auto_thread_task_runner.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/check.h"
+#include "base/time/time.h"
 
 namespace remoting {
 
diff --git a/remoting/client/notification/gstatic_json_fetcher_unittest.cc b/remoting/client/notification/gstatic_json_fetcher_unittest.cc
index 4a261eb..331cf68 100644
--- a/remoting/client/notification/gstatic_json_fetcher_unittest.cc
+++ b/remoting/client/notification/gstatic_json_fetcher_unittest.cc
@@ -44,7 +44,7 @@
   if (!arg || !arg->is_list()) {
     return false;
   }
-  auto list = arg->GetList();
+  auto list = arg->GetListDeprecated();
   return list.size() == 1 && list[0].is_string() &&
          list[0].GetString() == "123";
 }
diff --git a/remoting/client/notification/notification_client.cc b/remoting/client/notification/notification_client.cc
index e3d248d5..1ceba178 100644
--- a/remoting/client/notification/notification_client.cc
+++ b/remoting/client/notification/notification_client.cc
@@ -287,7 +287,7 @@
     return;
   }
 
-  for (const auto& rule : rules->GetList()) {
+  for (const auto& rule : rules->GetListDeprecated()) {
     std::string message_text_filename;
     std::string link_text_filename;
     auto message = ParseAndMatchRule(rule, user_email, &message_text_filename,
diff --git a/remoting/codec/webrtc_video_encoder_gpu.cc b/remoting/codec/webrtc_video_encoder_gpu.cc
index e6cc24e..8973a95 100644
--- a/remoting/codec/webrtc_video_encoder_gpu.cc
+++ b/remoting/codec/webrtc_video_encoder_gpu.cc
@@ -4,6 +4,7 @@
 
 #include "remoting/codec/webrtc_video_encoder_gpu.h"
 
+#include <limits>
 #include <memory>
 #include <utility>
 
@@ -14,6 +15,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/shared_memory_mapping.h"
 #include "base/memory/unsafe_shared_memory_region.h"
+#include "base/numerics/checked_math.h"
 #include "base/task/bind_post_task.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
@@ -265,10 +267,12 @@
   if (params.bitrate_kbps > 0 && params.fps > 0) {
     // TODO(zijiehe): Forward frame_rate from FrameParams.
     bitrate_filter_.SetBandwidthEstimateKbps(params.bitrate_kbps);
+    base::CheckedNumeric<uint32_t> checked_bitrate = base::CheckMul<uint32_t>(
+        std::max(bitrate_filter_.GetTargetBitrateKbps(), 0), 1000);
+    uint32_t bitrate_bps =
+        checked_bitrate.ValueOrDefault(std::numeric_limits<uint32_t>::max());
     video_encode_accelerator_->RequestEncodingParametersChange(
-        media::Bitrate::ConstantBitrate(bitrate_filter_.GetTargetBitrateKbps() *
-                                        1000),
-        params.fps);
+        media::Bitrate::ConstantBitrate(bitrate_bps), params.fps);
   }
   video_encode_accelerator_->Encode(video_frame, params.key_frame);
 }
@@ -351,8 +355,8 @@
   // TODO(zijiehe): implement some logical way to set an initial bitrate.
   // Currently we set the bitrate to 8M bits / 1M bytes per frame, and 30 frames
   // per second.
-  media::Bitrate initial_bitrate =
-      media::Bitrate::ConstantBitrate(kTargetFrameRate * 1024 * 1024 * 8);
+  media::Bitrate initial_bitrate = media::Bitrate::ConstantBitrate(
+      static_cast<uint32_t>(kTargetFrameRate * 1024 * 1024 * 8));
 
   const media::VideoEncodeAccelerator::Config config(
       input_format, input_visible_size_, codec_profile_, initial_bitrate);
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc
index 80594cc..2353be2 100644
--- a/remoting/host/it2me/it2me_host.cc
+++ b/remoting/host/it2me/it2me_host.cc
@@ -376,7 +376,7 @@
   if (policies->GetList(policy::key::kRemoteAccessHostDomainList,
                         &host_domain_list)) {
     std::vector<std::string> host_domain_list_vector;
-    for (const auto& value : host_domain_list->GetList()) {
+    for (const auto& value : host_domain_list->GetListDeprecated()) {
       host_domain_list_vector.push_back(value.GetString());
     }
     UpdateHostDomainListPolicy(std::move(host_domain_list_vector));
@@ -386,7 +386,7 @@
   if (policies->GetList(policy::key::kRemoteAccessHostClientDomainList,
                         &client_domain_list)) {
     std::vector<std::string> client_domain_list_vector;
-    for (const auto& value : client_domain_list->GetList()) {
+    for (const auto& value : client_domain_list->GetListDeprecated()) {
       client_domain_list_vector.push_back(value.GetString());
     }
     UpdateClientDomainListPolicy(std::move(client_domain_list_vector));
diff --git a/remoting/host/mojom/webauthn_proxy.mojom b/remoting/host/mojom/webauthn_proxy.mojom
index dcc74a7..35bd786 100644
--- a/remoting/host/mojom/webauthn_proxy.mojom
+++ b/remoting/host/mojom/webauthn_proxy.mojom
@@ -27,6 +27,19 @@
   string response_data;
 };
 
+// The response object for WebAuthnProxy.Get().
+union WebAuthnGetResponse {
+  // The `DOMException`, if any, yielded by the remote request.
+  WebAuthnExceptionDetails error_details;
+
+  // A string-serialized representation of the `PublicKeyCredential`
+  // (https://w3c.github.io/webauthn/#publickeycredential), if any, yielded
+  // by the remote request.
+  // Note that it is opaque to chromoting host processes and will be passed
+  // verbatim to the Chrome webAuthenticationProxy extension API.
+  string response_data;
+};
+
 // An interface for the client (CRD WebAuthn Native Messaging Host) to cancel
 // an ongoing remote Create or Get request.
 interface WebAuthnRequestCanceller {
@@ -76,4 +89,19 @@
   Create(string request_data,
          pending_receiver<WebAuthnRequestCanceller> request_canceller) =>
       (WebAuthnCreateResponse? response);
+
+  // Handles a navigator.credentials.get() call remotely.
+  //
+  // |request_data|: the string-serialized representation of the parameters
+  //     passed to the get() call. It is opaque to chromoting host processes
+  //     and will be passed verbatim to the client.
+  // |request_canceller|: interface for the caller to cancel the Get request
+  //     before it has been resolved. The receiver will be closed once the
+  //     cancelation has succeeded, or a GetResponse has been returned.
+  //
+  // If |response| is null, it means that the remote get() call has yielded
+  // `null`, which is still a valid response according to the spec.
+  Get(string request_data,
+      pending_receiver<WebAuthnRequestCanceller> request_canceller) =>
+      (WebAuthnGetResponse? response);
 };
diff --git a/remoting/host/pairing_registry_delegate_linux_unittest.cc b/remoting/host/pairing_registry_delegate_linux_unittest.cc
index ca5ff7a3..7da8d07 100644
--- a/remoting/host/pairing_registry_delegate_linux_unittest.cc
+++ b/remoting/host/pairing_registry_delegate_linux_unittest.cc
@@ -35,7 +35,7 @@
   delegate->SetRegistryPathForTesting(temp_registry_);
 
   // Check that registry is initially empty.
-  EXPECT_TRUE(delegate->LoadAll()->GetList().empty());
+  EXPECT_TRUE(delegate->LoadAll()->GetListDeprecated().empty());
 
   // Add a couple of pairings.
   PairingRegistry::Pairing pairing1(base::Time::Now(), "xxx", "xxx", "xxx");
@@ -44,7 +44,7 @@
   EXPECT_TRUE(delegate->Save(pairing2));
 
   // Verify that there are two pairings in the store now.
-  EXPECT_EQ(delegate->LoadAll()->GetList().size(), 2u);
+  EXPECT_EQ(delegate->LoadAll()->GetListDeprecated().size(), 2u);
 
   // Verify that they can be retrieved.
   EXPECT_EQ(delegate->Load(pairing1.client_id()), pairing1);
@@ -58,7 +58,7 @@
   EXPECT_EQ(delegate->Load(pairing2.client_id()), pairing2);
 
   // Verify that the only value that left is |pairing2|.
-  EXPECT_EQ(delegate->LoadAll()->GetList().size(), 1u);
+  EXPECT_EQ(delegate->LoadAll()->GetListDeprecated().size(), 1u);
   std::unique_ptr<base::ListValue> pairings = delegate->LoadAll();
   base::DictionaryValue* json;
   EXPECT_TRUE(pairings->GetDictionary(0, &json));
@@ -66,7 +66,7 @@
 
   // Delete the rest and verify.
   EXPECT_TRUE(delegate->DeleteAll());
-  EXPECT_TRUE(delegate->LoadAll()->GetList().empty());
+  EXPECT_TRUE(delegate->LoadAll()->GetListDeprecated().empty());
 }
 
 // Verifies that the delegate is stateless by using two different instances.
diff --git a/remoting/host/pairing_registry_delegate_win_unittest.cc b/remoting/host/pairing_registry_delegate_win_unittest.cc
index 28b8a7a..f9abaa9 100644
--- a/remoting/host/pairing_registry_delegate_win_unittest.cc
+++ b/remoting/host/pairing_registry_delegate_win_unittest.cc
@@ -53,7 +53,7 @@
   delegate->SetRootKeys(privileged_.Handle(), unprivileged_.Handle());
 
   // Check that registry is initially empty.
-  EXPECT_TRUE(delegate->LoadAll()->GetList().empty());
+  EXPECT_TRUE(delegate->LoadAll()->GetListDeprecated().empty());
 
   // Add a couple of pairings.
   PairingRegistry::Pairing pairing1(base::Time::Now(), "xxx", "xxx", "xxx");
@@ -62,7 +62,7 @@
   EXPECT_TRUE(delegate->Save(pairing2));
 
   // Verify that there are two pairings in the store now.
-  EXPECT_EQ(delegate->LoadAll()->GetList().size(), 2u);
+  EXPECT_EQ(delegate->LoadAll()->GetListDeprecated().size(), 2u);
 
   // Verify that they can be retrieved.
   EXPECT_EQ(delegate->Load(pairing1.client_id()), pairing1);
@@ -76,7 +76,7 @@
   EXPECT_EQ(delegate->Load(pairing2.client_id()), pairing2);
 
   // Verify that the only remaining value is |pairing2|.
-  EXPECT_EQ(delegate->LoadAll()->GetList().size(), 1u);
+  EXPECT_EQ(delegate->LoadAll()->GetListDeprecated().size(), 1u);
   std::unique_ptr<base::ListValue> pairings = delegate->LoadAll();
   base::DictionaryValue* json;
   EXPECT_TRUE(pairings->GetDictionary(0, &json));
@@ -84,7 +84,7 @@
 
   // Delete the rest and verify.
   EXPECT_TRUE(delegate->DeleteAll());
-  EXPECT_TRUE(delegate->LoadAll()->GetList().empty());
+  EXPECT_TRUE(delegate->LoadAll()->GetListDeprecated().empty());
 }
 
 // Verifies that the delegate is stateless by using two different instances.
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index 12950ac..5204711d 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -1240,7 +1240,7 @@
   }
 
   host_domain_list_.clear();
-  for (const auto& value : list->GetList()) {
+  for (const auto& value : list->GetListDeprecated()) {
     host_domain_list_.push_back(value.GetString());
   }
 
@@ -1259,7 +1259,7 @@
   }
 
   client_domain_list_.clear();
-  for (const auto& value : list->GetList()) {
+  for (const auto& value : list->GetListDeprecated()) {
     client_domain_list_.push_back(value.GetString());
   }
 
diff --git a/remoting/host/webauthn/remote_webauthn_constants.cc b/remoting/host/webauthn/remote_webauthn_constants.cc
index c6619322..1c16c63 100644
--- a/remoting/host/webauthn/remote_webauthn_constants.cc
+++ b/remoting/host/webauthn/remote_webauthn_constants.cc
@@ -11,6 +11,7 @@
 const char kIsUvpaaMessageType[] = "isUvpaa";
 const char kGetRemoteStateMessageType[] = "getRemoteState";
 const char kCreateMessageType[] = "create";
+const char kGetMessageType[] = "get";
 const char kCancelMessageType[] = "cancel";
 
 const char kIsUvpaaResponseIsAvailableKey[] = "isAvailable";
@@ -18,6 +19,8 @@
 const char kCancelResponseWasCanceledKey[] = "wasCanceled";
 const char kCreateRequestDataKey[] = "requestData";
 const char kCreateResponseDataKey[] = "responseData";
+const char kGetRequestDataKey[] = "requestData";
+const char kGetResponseDataKey[] = "responseData";
 const char kWebAuthnErrorKey[] = "error";
 const char kWebAuthnErrorNameKey[] = "name";
 const char kWebAuthnErrorMessageKey[] = "message";
diff --git a/remoting/host/webauthn/remote_webauthn_constants.h b/remoting/host/webauthn/remote_webauthn_constants.h
index bdaba464..d9ca47ac7 100644
--- a/remoting/host/webauthn/remote_webauthn_constants.h
+++ b/remoting/host/webauthn/remote_webauthn_constants.h
@@ -13,6 +13,7 @@
 extern const char kIsUvpaaMessageType[];
 extern const char kGetRemoteStateMessageType[];
 extern const char kCreateMessageType[];
+extern const char kGetMessageType[];
 extern const char kCancelMessageType[];
 
 // NMH message keys.
@@ -21,6 +22,8 @@
 extern const char kCancelResponseWasCanceledKey[];
 extern const char kCreateRequestDataKey[];
 extern const char kCreateResponseDataKey[];
+extern const char kGetRequestDataKey[];
+extern const char kGetResponseDataKey[];
 extern const char kWebAuthnErrorKey[];
 extern const char kWebAuthnErrorNameKey[];
 extern const char kWebAuthnErrorMessageKey[];
diff --git a/remoting/host/webauthn/remote_webauthn_message_handler.cc b/remoting/host/webauthn/remote_webauthn_message_handler.cc
index 84cbc6b..c8fd2aa 100644
--- a/remoting/host/webauthn/remote_webauthn_message_handler.cc
+++ b/remoting/host/webauthn/remote_webauthn_message_handler.cc
@@ -42,6 +42,13 @@
   return mojo_error;
 }
 
+mojom::WebAuthnExceptionDetailsPtr CreateMojoAbortError() {
+  auto mojo_error = mojom::WebAuthnExceptionDetails::New();
+  mojo_error->name = "AbortError";
+  mojo_error->message = "Request has been canceled by the host.";
+  return mojo_error;
+}
+
 }  // namespace
 
 RemoteWebAuthnMessageHandler::RemoteWebAuthnMessageHandler(
@@ -86,6 +93,9 @@
       OnCreateResponse(remote_webauthn->id(),
                        remote_webauthn->create_response());
       break;
+    case protocol::RemoteWebAuthn::kGetResponse:
+      OnGetResponse(remote_webauthn->id(), remote_webauthn->get_response());
+      break;
     case protocol::RemoteWebAuthn::kCancelResponse:
       OnCancelResponse(remote_webauthn->id(),
                        remote_webauthn->cancel_response());
@@ -133,8 +143,7 @@
 
   uint64_t id = AssignNextMessageId();
   create_callbacks_[id] = std::move(callback);
-  message_id_to_request_canceller_[id] = request_cancellers_.Add(
-      this, std::move(request_canceller), /* context= */ id);
+  AddRequestCanceller(id, std::move(request_canceller));
 
   protocol::RemoteWebAuthn remote_webauthn;
   remote_webauthn.set_id(id);
@@ -143,13 +152,29 @@
   Send(remote_webauthn, base::DoNothing());
 }
 
+void RemoteWebAuthnMessageHandler::Get(
+    const std::string& request_data,
+    mojo::PendingReceiver<mojom::WebAuthnRequestCanceller> request_canceller,
+    GetCallback callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  uint64_t id = AssignNextMessageId();
+  get_callbacks_[id] = std::move(callback);
+  AddRequestCanceller(id, std::move(request_canceller));
+
+  protocol::RemoteWebAuthn remote_webauthn;
+  remote_webauthn.set_id(id);
+  remote_webauthn.mutable_get_request()->set_request_details_json(request_data);
+  Send(remote_webauthn, base::DoNothing());
+}
+
 void RemoteWebAuthnMessageHandler::Cancel(CancelCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   uint64_t id = request_cancellers_.current_context();
 
-  // TODO(yuweih): Check |get_callbacks_| here.
-  if (!base::Contains(create_callbacks_, id)) {
+  if (!base::Contains(create_callbacks_, id) &&
+      !base::Contains(get_callbacks_, id)) {
     LOG(ERROR) << "No ongoing request is associated with message ID " << id;
     std::move(callback).Run(false);
     RemoveRequestCancellerByMessageId(id);
@@ -184,6 +209,7 @@
   message_id_to_request_canceller_.clear();
   is_uvpaa_callbacks_.clear();
   create_callbacks_.clear();
+  get_callbacks_.clear();
   cancel_callbacks_.clear();
 }
 
@@ -239,6 +265,34 @@
   FindAndRunCallback(create_callbacks_, id, std::move(mojo_response));
 }
 
+void RemoteWebAuthnMessageHandler::OnGetResponse(
+    uint64_t id,
+    const protocol::RemoteWebAuthn_GetResponse& response) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  mojom::WebAuthnGetResponsePtr mojo_response;
+  switch (response.result_case()) {
+    case protocol::RemoteWebAuthn::GetResponse::ResultCase::kError:
+      mojo_response = mojom::WebAuthnGetResponse::NewErrorDetails(
+          ProtobufErrorToMojoError(response.error()));
+      break;
+    case protocol::RemoteWebAuthn::GetResponse::ResultCase::kResponseJson:
+      mojo_response =
+          mojom::WebAuthnGetResponse::NewResponseData(response.response_json());
+      break;
+    case protocol::RemoteWebAuthn::GetResponse::ResultCase::RESULT_NOT_SET:
+      // Do nothing and send a nullptr to the mojo client. This means the remote
+      // get() call has yielded `null`, which is still a valid response
+      // according to the spec.
+      break;
+    default:
+      NOTREACHED() << "Unknown get result case: " << response.result_case();
+  }
+
+  RemoveRequestCancellerByMessageId(id);
+  FindAndRunCallback(get_callbacks_, id, std::move(mojo_response));
+}
+
 void RemoteWebAuthnMessageHandler::OnCancelResponse(
     uint64_t id,
     const protocol::RemoteWebAuthn_CancelResponse& response) {
@@ -252,20 +306,27 @@
     return;
   }
 
-  if (base::Contains(create_callbacks_, id)) {
+  bool cancelling_create_request = base::Contains(create_callbacks_, id);
+  bool cancelling_get_request = base::Contains(get_callbacks_, id);
+
+  if (cancelling_create_request || cancelling_get_request) {
     FindAndRunCallback(cancel_callbacks_, id, /* was_canceled= */ true);
-    auto mojo_error = mojom::WebAuthnExceptionDetails::New();
-    mojo_error->name = "AbortError";
-    mojo_error->message = "Request has been canceled by the host.";
-    FindAndRunCallback(
-        create_callbacks_, id,
-        mojom::WebAuthnCreateResponse::NewErrorDetails(std::move(mojo_error)));
+    if (cancelling_create_request) {
+      FindAndRunCallback(create_callbacks_, id,
+                         mojom::WebAuthnCreateResponse::NewErrorDetails(
+                             CreateMojoAbortError()));
+    }
+    if (cancelling_get_request) {
+      // The ID should belong to only one callback list.
+      DCHECK(!cancelling_create_request);
+      FindAndRunCallback(
+          get_callbacks_, id,
+          mojom::WebAuthnGetResponse::NewErrorDetails(CreateMojoAbortError()));
+    }
     RemoveRequestCancellerByMessageId(id);
     return;
   }
 
-  // TODO(yuweih): Check |get_callbacks_| here.
-
   LOG(WARNING) << "Can't find cancelable request associated with ID " << id;
   FindAndRunCallback(cancel_callbacks_, id, /* was_canceled= */ false);
   RemoveRequestCancellerByMessageId(id);
@@ -277,6 +338,15 @@
   return current_message_id_++;
 }
 
+void RemoteWebAuthnMessageHandler::AddRequestCanceller(
+    uint64_t message_id,
+    mojo::PendingReceiver<mojom::WebAuthnRequestCanceller> request_canceller) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  message_id_to_request_canceller_[message_id] = request_cancellers_.Add(
+      this, std::move(request_canceller), /* context= */ message_id);
+}
+
 void RemoteWebAuthnMessageHandler::RemoveRequestCancellerByMessageId(
     uint64_t message_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/remoting/host/webauthn/remote_webauthn_message_handler.h b/remoting/host/webauthn/remote_webauthn_message_handler.h
index 44420c2..b64a6b3 100644
--- a/remoting/host/webauthn/remote_webauthn_message_handler.h
+++ b/remoting/host/webauthn/remote_webauthn_message_handler.h
@@ -24,6 +24,7 @@
 namespace protocol {
 class RemoteWebAuthn_CancelResponse;
 class RemoteWebAuthn_CreateResponse;
+class RemoteWebAuthn_GetResponse;
 class RemoteWebAuthn_IsUvpaaResponse;
 }  // namespace protocol
 
@@ -51,6 +52,10 @@
       const std::string& request_data,
       mojo::PendingReceiver<mojom::WebAuthnRequestCanceller> request_canceller,
       CreateCallback callback) override;
+  void Get(
+      const std::string& request_data,
+      mojo::PendingReceiver<mojom::WebAuthnRequestCanceller> request_canceller,
+      GetCallback callback) override;
 
   // mojom::WebAuthnRequestCanceller implementation.
   void Cancel(CancelCallback callback) override;
@@ -75,12 +80,17 @@
   void OnCreateResponse(
       uint64_t id,
       const protocol::RemoteWebAuthn_CreateResponse& response);
+  void OnGetResponse(uint64_t id,
+                     const protocol::RemoteWebAuthn_GetResponse& response);
   void OnCancelResponse(
       uint64_t id,
       const protocol::RemoteWebAuthn_CancelResponse& response);
 
   uint64_t AssignNextMessageId();
 
+  void AddRequestCanceller(
+      uint64_t message_id,
+      mojo::PendingReceiver<mojom::WebAuthnRequestCanceller> request_canceller);
   void RemoveRequestCancellerByMessageId(uint64_t message_id);
   void OnRequestCancellerDisconnected();
 
@@ -94,6 +104,7 @@
       is_uvpaa_callbacks_ GUARDED_BY_CONTEXT(sequence_checker_);
   CallbackMap<CreateCallback> create_callbacks_
       GUARDED_BY_CONTEXT(sequence_checker_);
+  CallbackMap<GetCallback> get_callbacks_ GUARDED_BY_CONTEXT(sequence_checker_);
   CallbackMap<CancelCallback> cancel_callbacks_
       GUARDED_BY_CONTEXT(sequence_checker_);
 
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
index 6f7166f..d81bea0 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host.cc
@@ -83,6 +83,8 @@
     ProcessGetRemoteState(std::move(response));
   } else if (type == kCreateMessageType) {
     ProcessCreate(request, std::move(response));
+  } else if (type == kGetMessageType) {
+    ProcessGet(request, std::move(response));
   } else if (type == kCancelMessageType) {
     ProcessCancel(request, std::move(response));
   } else {
@@ -141,58 +143,57 @@
 
   DCHECK(task_runner_->BelongsToCurrentThread());
 
-  if (!EnsureIpcConnection()) {
-    // TODO(yuweih): See if this is the right error to use here.
-    response.SetKey(kWebAuthnErrorKey, CreateWebAuthnExceptionDetailsDict(
-                                           "InvalidStateError",
-                                           "Failed to connect to IPC server."));
-    SendMessageToClient(std::move(response));
+  if (!ConnectIpcOrSendError(response)) {
     return;
   }
-
-  // navigator.credentials.create() throws NotSupportedError if it is called
-  // with unexpected parameters.
-
-  const base::Value* message_id = request.FindKey(kMessageId);
+  const base::Value* message_id = FindMessageIdOrSendError(response);
   if (!message_id) {
-    response.SetKey(
-        kWebAuthnErrorKey,
-        CreateWebAuthnExceptionDetailsDict(
-            "NotSupportedError", "Message ID not found in create request."));
-    SendMessageToClient(std::move(response));
     return;
   }
-
   const std::string* request_data =
-      request.FindStringKey(kCreateRequestDataKey);
+      FindRequestDataOrSendError(request, kCreateRequestDataKey, response);
   if (!request_data) {
-    response.SetKey(
-        kWebAuthnErrorKey,
-        CreateWebAuthnExceptionDetailsDict(
-            "NotSupportedError", "Request data not found in create request."));
-    SendMessageToClient(std::move(response));
     return;
   }
 
-  mojo::PendingRemote<mojom::WebAuthnRequestCanceller>
-      pending_request_canceller;
-  auto request_canceller_receiver =
-      pending_request_canceller.InitWithNewPipeAndPassReceiver();
-  id_to_request_canceller_.emplace(
-      message_id->Clone(),
-      request_cancellers_.Add(std::move(pending_request_canceller)));
-
   remote_->Create(
-      *request_data, std::move(request_canceller_receiver),
+      *request_data, AddRequestCanceller(message_id->Clone()),
       base::BindOnce(&RemoteWebAuthnNativeMessagingHost::OnCreateResponse,
                      base::Unretained(this), std::move(response)));
 }
 
+void RemoteWebAuthnNativeMessagingHost::ProcessGet(const base::Value& request,
+                                                   base::Value response) {
+  // Get request: {id: string, type: 'get', requestData: string}
+  // Get response: {
+  //   id: string, type: 'getResponse', responseData?: string,
+  //   error?: {name: string, message: string}}
+
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
+  if (!ConnectIpcOrSendError(response)) {
+    return;
+  }
+  const base::Value* message_id = FindMessageIdOrSendError(response);
+  if (!message_id) {
+    return;
+  }
+  const std::string* request_data =
+      FindRequestDataOrSendError(request, kGetRequestDataKey, response);
+  if (!request_data) {
+    return;
+  }
+
+  remote_->Get(*request_data, AddRequestCanceller(message_id->Clone()),
+               base::BindOnce(&RemoteWebAuthnNativeMessagingHost::OnGetResponse,
+                              base::Unretained(this), std::move(response)));
+}
+
 void RemoteWebAuthnNativeMessagingHost::ProcessCancel(
     const base::Value& request,
     base::Value response) {
   // Cancel request: {id: string, type: 'cancel'}
-  // Create response:
+  // Cancel response:
   //   {id: string, type: 'cancelResponse', wasCanceled: boolean}
 
   if (!EnsureIpcConnection()) {
@@ -299,6 +300,39 @@
   SendMessageToClient(std::move(response));
 }
 
+void RemoteWebAuthnNativeMessagingHost::OnGetResponse(
+    base::Value response,
+    mojom::WebAuthnGetResponsePtr remote_response) {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
+  // If |remote_response| is null, it means that the remote get() call has
+  // yielded `null`, which is still a valid response according to the spec. In
+  // this case we just send back an empty get response.
+  if (!remote_response.is_null()) {
+    switch (remote_response->which()) {
+      case mojom::WebAuthnGetResponse::Tag::kErrorDetails:
+        response.SetKey(
+            kWebAuthnErrorKey,
+            MojoErrorToErrorDict(remote_response->get_error_details()));
+        break;
+      case mojom::WebAuthnGetResponse::Tag::kResponseData:
+        response.SetStringKey(kGetResponseDataKey,
+                              remote_response->get_response_data());
+        break;
+      default:
+        NOTREACHED() << "Unexpected get response tag: "
+                     << static_cast<uint32_t>(remote_response->which());
+    }
+  }
+
+  const base::Value* message_id = response.FindKey(kMessageId);
+  if (message_id) {
+    RemoveRequestCancellerByMessageId(*message_id);
+  }
+
+  SendMessageToClient(std::move(response));
+}
+
 void RemoteWebAuthnNativeMessagingHost::OnCancelResponse(base::Value response,
                                                          bool was_canceled) {
   DCHECK(task_runner_->BelongsToCurrentThread());
@@ -374,6 +408,65 @@
   client_->PostMessageFromNativeHost(message_json);
 }
 
+bool RemoteWebAuthnNativeMessagingHost::ConnectIpcOrSendError(
+    base::Value& response) {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
+  if (EnsureIpcConnection()) {
+    return true;
+  }
+  // TODO(yuweih): See if this is the right error to use here.
+  response.SetKey(kWebAuthnErrorKey,
+                  CreateWebAuthnExceptionDetailsDict(
+                      "InvalidStateError", "Failed to connect to IPC server."));
+  SendMessageToClient(std::move(response));
+  return false;
+}
+
+const base::Value* RemoteWebAuthnNativeMessagingHost::FindMessageIdOrSendError(
+    base::Value& response) {
+  const base::Value* message_id = response.FindKey(kMessageId);
+  if (message_id) {
+    return message_id;
+  }
+  response.SetKey(kWebAuthnErrorKey,
+                  CreateWebAuthnExceptionDetailsDict(
+                      "NotSupportedError", "Message ID not found in request."));
+  SendMessageToClient(std::move(response));
+  return nullptr;
+}
+
+const std::string*
+RemoteWebAuthnNativeMessagingHost::FindRequestDataOrSendError(
+    const base::Value& request,
+    const std::string& request_data_key,
+    base::Value& response) {
+  const std::string* request_data = request.FindStringKey(request_data_key);
+  if (request_data) {
+    return request_data;
+  }
+  response.SetKey(
+      kWebAuthnErrorKey,
+      CreateWebAuthnExceptionDetailsDict(
+          "NotSupportedError", "Request data not found in the request."));
+  SendMessageToClient(std::move(response));
+  return nullptr;
+}
+
+mojo::PendingReceiver<mojom::WebAuthnRequestCanceller>
+RemoteWebAuthnNativeMessagingHost::AddRequestCanceller(base::Value message_id) {
+  DCHECK(task_runner_->BelongsToCurrentThread());
+
+  mojo::PendingRemote<mojom::WebAuthnRequestCanceller>
+      pending_request_canceller;
+  auto request_canceller_receiver =
+      pending_request_canceller.InitWithNewPipeAndPassReceiver();
+  id_to_request_canceller_.emplace(
+      std::move(message_id),
+      request_cancellers_.Add(std::move(pending_request_canceller)));
+  return request_canceller_receiver;
+}
+
 void RemoteWebAuthnNativeMessagingHost::RemoveRequestCancellerByMessageId(
     const base::Value& message_id) {
   DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host.h b/remoting/host/webauthn/remote_webauthn_native_messaging_host.h
index 9a6e884..0e65ac2 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host.h
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host.h
@@ -14,6 +14,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/values.h"
 #include "extensions/browser/api/messaging/native_message_host.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "remoting/host/chromoting_host_services_provider.h"
@@ -49,6 +50,7 @@
   void ProcessGetRemoteState(base::Value response);
   void ProcessIsUvpaa(const base::Value& request, base::Value response);
   void ProcessCreate(const base::Value& request, base::Value response);
+  void ProcessGet(const base::Value& request, base::Value response);
   void ProcessCancel(const base::Value& request, base::Value response);
 
   void OnQueryVersionResult(uint32_t version);
@@ -56,6 +58,8 @@
   void OnIsUvpaaResponse(base::Value response, bool is_available);
   void OnCreateResponse(base::Value response,
                         mojom::WebAuthnCreateResponsePtr remote_response);
+  void OnGetResponse(base::Value response,
+                     mojom::WebAuthnGetResponsePtr remote_response);
   void OnCancelResponse(base::Value response, bool was_canceled);
 
   void QueryNextRemoteState();
@@ -67,6 +71,27 @@
   bool EnsureIpcConnection();
   void SendMessageToClient(base::Value message);
 
+  // Attempts to connect IPC. If it succeeds, |response| will not be touched and
+  // `true` will be returned; if it fails, |response| will be attached with a
+  // WebAuthn error dict and sent to the NMH client, and `false` will be
+  // returned.
+  bool ConnectIpcOrSendError(base::Value& response);
+
+  // Finds and returns the message ID from |response|. If message ID is not
+  // found, |response| will be attached with a WebAuthn error dict and sent to
+  // the NMH client, and `nullptr` will be returned.
+  const base::Value* FindMessageIdOrSendError(base::Value& response);
+
+  // Finds and returns request[request_data_key]. If request_data_key is not
+  // found, |response| will be attached with a WebAuthn error dict and sent to
+  // the NMH client, and `nullptr` will be returned.
+  const std::string* FindRequestDataOrSendError(
+      const base::Value& request,
+      const std::string& request_data_key,
+      base::Value& response);
+
+  mojo::PendingReceiver<mojom::WebAuthnRequestCanceller> AddRequestCanceller(
+      base::Value message_id);
   void RemoveRequestCancellerByMessageId(const base::Value& message_id);
   void OnRequestCancellerDisconnected(
       mojo::RemoteSetElementId disconnecting_canceller);
diff --git a/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc b/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
index b2451fad..0543cdb 100644
--- a/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
+++ b/remoting/host/webauthn/remote_webauthn_native_messaging_host_unittest.cc
@@ -50,6 +50,22 @@
   ASSERT_EQ(*response.FindIntKey(kMessageId), message_id);
 }
 
+void VerifyFakeErrorResponse(const base::Value& response) {
+  const auto* json_error = response.FindKey(kWebAuthnErrorKey);
+  ASSERT_NE(json_error, nullptr);
+  ASSERT_EQ(*json_error->FindStringKey(kWebAuthnErrorNameKey),
+            "NotSupportedError");
+  ASSERT_EQ(*json_error->FindStringKey(kWebAuthnErrorMessageKey),
+            "Test error message");
+}
+
+mojom::WebAuthnExceptionDetailsPtr CreateFakeMojoError() {
+  auto mojo_error = mojom::WebAuthnExceptionDetails::New();
+  mojo_error->name = "NotSupportedError";
+  mojo_error->message = "Test error message";
+  return mojo_error;
+}
+
 class MockWebAuthnProxy : public mojom::WebAuthnProxy {
  public:
   MOCK_METHOD(void,
@@ -62,6 +78,12 @@
                mojo::PendingReceiver<mojom::WebAuthnRequestCanceller>,
                CreateCallback),
               (override));
+  MOCK_METHOD(void,
+              Get,
+              (const std::string&,
+               mojo::PendingReceiver<mojom::WebAuthnRequestCanceller>,
+               GetCallback),
+              (override));
 };
 
 class MockWebAuthnRequestCanceller : public mojom::WebAuthnRequestCanceller {
@@ -310,11 +332,8 @@
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Create_ErrorResponse) {
   ExpectGetSessionServices();
   ExpectBindWebAuthnProxy();
-  auto mojo_error = mojom::WebAuthnExceptionDetails::New();
-  mojo_error->name = "NotSupportedError";
-  mojo_error->message = "Test error message";
   auto mojo_response =
-      mojom::WebAuthnCreateResponse::NewErrorDetails(std::move(mojo_error));
+      mojom::WebAuthnCreateResponse::NewErrorDetails(CreateFakeMojoError());
   EXPECT_CALL(webauthn_proxy_, Create("fake", _, _))
       .WillOnce(base::test::RunOnceCallback<2>(std::move(mojo_response)));
   auto request = CreateRequestMessage(kCreateMessageType);
@@ -324,13 +343,8 @@
   const base::Value& response = ReadMessage();
 
   VerifyResponseMessage(response, kCreateMessageType);
+  VerifyFakeErrorResponse(response);
   ASSERT_EQ(response.FindStringKey(kCreateResponseDataKey), nullptr);
-  const auto* json_error = response.FindKey(kWebAuthnErrorKey);
-  ASSERT_NE(json_error, nullptr);
-  ASSERT_EQ(*json_error->FindStringKey(kWebAuthnErrorNameKey),
-            "NotSupportedError");
-  ASSERT_EQ(*json_error->FindStringKey(kWebAuthnErrorMessageKey),
-            "Test error message");
 }
 
 TEST_F(RemoteWebAuthnNativeMessagingHostTest, Create_DataResponse) {
@@ -351,6 +365,86 @@
   ASSERT_EQ(response.FindKey(kWebAuthnErrorKey), nullptr);
 }
 
+TEST_F(RemoteWebAuthnNativeMessagingHostTest, Get_RequestMissingData_Error) {
+  ExpectGetSessionServices();
+  ExpectBindWebAuthnProxy();
+
+  // Request message missing |requestData| field.
+  auto request = CreateRequestMessage(kGetMessageType);
+  SendMessage(std::move(request));
+
+  const base::Value& response = ReadMessage();
+
+  VerifyResponseMessage(response, kGetMessageType);
+  ASSERT_EQ(response.FindStringKey(kGetResponseDataKey), nullptr);
+  ASSERT_NE(response.FindKey(kWebAuthnErrorKey), nullptr);
+}
+
+TEST_F(RemoteWebAuthnNativeMessagingHostTest, Get_IpcConnectionFailed_Error) {
+  ExpectGetSessionServices(false);
+  auto request = CreateRequestMessage(kGetMessageType);
+  request.SetStringKey(kGetRequestDataKey, "fake");
+  SendMessage(std::move(request));
+
+  const base::Value& response = ReadMessage();
+
+  VerifyResponseMessage(response, kGetMessageType);
+  ASSERT_EQ(response.FindStringKey(kGetResponseDataKey), nullptr);
+  ASSERT_NE(response.FindKey(kWebAuthnErrorKey), nullptr);
+}
+
+TEST_F(RemoteWebAuthnNativeMessagingHostTest, Get_EmptyResponse) {
+  ExpectGetSessionServices();
+  ExpectBindWebAuthnProxy();
+  EXPECT_CALL(webauthn_proxy_, Get("fake", _, _))
+      .WillOnce(base::test::RunOnceCallback<2>(nullptr));
+  auto request = CreateRequestMessage(kGetMessageType);
+  request.SetStringKey(kGetRequestDataKey, "fake");
+  SendMessage(std::move(request));
+
+  const base::Value& response = ReadMessage();
+
+  VerifyResponseMessage(response, kGetMessageType);
+  ASSERT_EQ(response.FindStringKey(kGetResponseDataKey), nullptr);
+  ASSERT_EQ(response.FindKey(kWebAuthnErrorKey), nullptr);
+}
+
+TEST_F(RemoteWebAuthnNativeMessagingHostTest, Get_ErrorResponse) {
+  ExpectGetSessionServices();
+  ExpectBindWebAuthnProxy();
+  auto mojo_response =
+      mojom::WebAuthnGetResponse::NewErrorDetails(CreateFakeMojoError());
+  EXPECT_CALL(webauthn_proxy_, Get("fake", _, _))
+      .WillOnce(base::test::RunOnceCallback<2>(std::move(mojo_response)));
+  auto request = CreateRequestMessage(kGetMessageType);
+  request.SetStringKey(kGetRequestDataKey, "fake");
+  SendMessage(std::move(request));
+
+  const base::Value& response = ReadMessage();
+
+  VerifyResponseMessage(response, kGetMessageType);
+  VerifyFakeErrorResponse(response);
+  ASSERT_EQ(response.FindStringKey(kGetResponseDataKey), nullptr);
+}
+
+TEST_F(RemoteWebAuthnNativeMessagingHostTest, Get_DataResponse) {
+  ExpectGetSessionServices();
+  ExpectBindWebAuthnProxy();
+  auto mojo_response =
+      mojom::WebAuthnGetResponse::NewResponseData("fake response");
+  EXPECT_CALL(webauthn_proxy_, Get("fake", _, _))
+      .WillOnce(base::test::RunOnceCallback<2>(std::move(mojo_response)));
+  auto request = CreateRequestMessage(kGetMessageType);
+  request.SetStringKey(kGetRequestDataKey, "fake");
+  SendMessage(std::move(request));
+
+  const base::Value& response = ReadMessage();
+
+  VerifyResponseMessage(response, kGetMessageType);
+  ASSERT_EQ(*response.FindStringKey(kGetResponseDataKey), "fake response");
+  ASSERT_EQ(response.FindKey(kWebAuthnErrorKey), nullptr);
+}
+
 TEST_F(RemoteWebAuthnNativeMessagingHostTest,
        Cancel_IpcConnectionFailed_Failure) {
   ExpectGetSessionServices(false);
@@ -420,6 +514,50 @@
   std::move(create_cb).Run(nullptr);
 }
 
+TEST_F(RemoteWebAuthnNativeMessagingHostTest, CancelGetRequest) {
+  MockWebAuthnRequestCanceller mock_canceller_impl;
+  ExpectGetSessionServices();
+  ExpectBindWebAuthnProxy();
+  mojo::Receiver<mojom::WebAuthnRequestCanceller> request_canceller{
+      &mock_canceller_impl};
+  mojom::WebAuthnProxy::GetCallback get_cb;
+  base::RunLoop webauthn_proxy_get_runloop;
+  EXPECT_CALL(webauthn_proxy_, Get("fake", _, _))
+      .WillOnce([&](const std::string&,
+                    mojo::PendingReceiver<mojom::WebAuthnRequestCanceller>
+                        pending_receiver,
+                    mojom::WebAuthnProxy::GetCallback cb) {
+        request_canceller.Bind(std::move(pending_receiver));
+        get_cb = std::move(cb);
+        webauthn_proxy_get_runloop.Quit();
+      });
+  EXPECT_CALL(mock_canceller_impl, Cancel(_))
+      .WillOnce(base::test::RunOnceCallback<0>(true));
+
+  auto request = CreateRequestMessage(kGetMessageType, /* message_id= */ 1);
+  request.SetStringKey(kGetRequestDataKey, "fake");
+  SendMessage(std::move(request));
+  webauthn_proxy_get_runloop.Run();
+
+  request = CreateRequestMessage(kCancelMessageType, /* message_id= */ 1);
+  SendMessage(std::move(request));
+  const base::Value& response_1 = ReadMessage();
+
+  VerifyResponseMessage(response_1, kCancelMessageType);
+  ASSERT_EQ(*response_1.FindBoolKey(kCancelResponseWasCanceledKey), true);
+
+  // Do it again and verify that it should fail this time.
+  request = CreateRequestMessage(kCancelMessageType, /* message_id= */ 1);
+  SendMessage(std::move(request));
+  const base::Value& response_2 = ReadMessage();
+
+  VerifyResponseMessage(response_2, kCancelMessageType);
+  ASSERT_EQ(*response_2.FindBoolKey(kCancelResponseWasCanceledKey), false);
+
+  // |get_cb| must be run before it gets disposed.
+  std::move(get_cb).Run(nullptr);
+}
+
 TEST_F(RemoteWebAuthnNativeMessagingHostTest,
        CancelWithDisconnectedCanceller_Failure) {
   ExpectGetSessionServices();
diff --git a/remoting/proto/remote_webauthn.proto b/remoting/proto/remote_webauthn.proto
index 9250421..d88744b3 100644
--- a/remoting/proto/remote_webauthn.proto
+++ b/remoting/proto/remote_webauthn.proto
@@ -10,9 +10,9 @@
 
 // Composite message type for messages sent over the remote-webauthn data
 // channel.
-// Next ID: 8
+// Next ID: 10
 message RemoteWebAuthn {
-  // message that represents a DOMException, yielded by the remote request
+  // Message that represents a DOMException, yielded by the remote request
   // during a Create or Get request.
   // Next ID: 3
   message ExceptionDetails {
@@ -52,6 +52,30 @@
     }
   }
 
+  // Requests the client to handle a navigator.credentials.get() call.
+  // Next ID: 2
+  message GetRequest {
+    // A JSON serialized representation of CredentialRequestOptions passed to
+    // navigator.credentials.get().
+    optional string request_details_json = 1;
+  }
+
+  // Response for GetRequest.
+  // Next ID: 3
+  message GetResponse {
+    // If neither of the fields is set, it means that the remote get() call
+    // has yielded `null`, which is still a valid response according to the
+    // spec.
+    oneof result {
+      // The `DOMException`, if any, yielded by the remote request.
+      ExceptionDetails error = 1;
+
+      // A JSON serialized representation of the `PublicKeyCredential`
+      // (https://w3c.github.io/webauthn/#publickeycredential), if any.
+      string response_json = 2;
+    }
+  }
+
   // Requests the client to abort an ongoing Create or Get request.
   // The |id| field of this message should be set to the same value as the
   // to-be-canceled GetRequest/CreateRequest's |id| field.
@@ -78,5 +102,8 @@
 
     CancelRequest cancel_request = 6;
     CancelResponse cancel_response = 7;
+
+    GetRequest get_request = 8;
+    GetResponse get_response = 9;
   }
 }
diff --git a/remoting/protocol/ice_config.cc b/remoting/protocol/ice_config.cc
index d4fec7c..9b49beb 100644
--- a/remoting/protocol/ice_config.cc
+++ b/remoting/protocol/ice_config.cc
@@ -138,7 +138,7 @@
   // Parse iceServers list and store them in |ice_config|.
   bool errors_found = false;
   ice_config.max_bitrate_kbps = 0;
-  for (const auto& server : ice_servers_list->GetList()) {
+  for (const auto& server : ice_servers_list->GetListDeprecated()) {
     if (!server.is_dict()) {
       errors_found = true;
       continue;
@@ -171,7 +171,7 @@
                            static_cast<int>(new_bitrate_double.value()));
     }
 
-    for (const auto& url : urls_list->GetList()) {
+    for (const auto& url : urls_list->GetListDeprecated()) {
       const std::string* url_str = url.GetIfString();
       if (!url_str) {
         errors_found = true;
diff --git a/remoting/protocol/pairing_registry.cc b/remoting/protocol/pairing_registry.cc
index cc173e69..3cc4361d 100644
--- a/remoting/protocol/pairing_registry.cc
+++ b/remoting/protocol/pairing_registry.cc
@@ -255,7 +255,7 @@
   DCHECK(caller_task_runner_->BelongsToCurrentThread());
 
   std::unique_ptr<base::ListValue> sanitized_pairings(new base::ListValue());
-  for (size_t i = 0; i < pairings->GetList().size(); ++i) {
+  for (size_t i = 0; i < pairings->GetListDeprecated().size(); ++i) {
     base::DictionaryValue* pairing_json;
     if (!pairings->GetDictionary(i, &pairing_json)) {
       LOG(WARNING) << "A pairing entry is not a dictionary.";
diff --git a/remoting/protocol/pairing_registry_unittest.cc b/remoting/protocol/pairing_registry_unittest.cc
index 15bf6f15..2a03793 100644
--- a/remoting/protocol/pairing_registry_unittest.cc
+++ b/remoting/protocol/pairing_registry_unittest.cc
@@ -123,10 +123,10 @@
   registry->GetAllPairings(base::BindOnce(&PairingRegistryTest::set_pairings,
                                           base::Unretained(this)));
 
-  ASSERT_EQ(2u, pairings_->GetList().size());
-  const base::Value& actual_pairing_1_value = pairings_->GetList()[0];
+  ASSERT_EQ(2u, pairings_->GetListDeprecated().size());
+  const base::Value& actual_pairing_1_value = pairings_->GetListDeprecated()[0];
   ASSERT_TRUE(actual_pairing_1_value.is_dict());
-  const base::Value& actual_pairing_2_value = pairings_->GetList()[1];
+  const base::Value& actual_pairing_2_value = pairings_->GetListDeprecated()[1];
   ASSERT_TRUE(actual_pairing_2_value.is_dict());
   const base::DictionaryValue* actual_pairing_1 =
       &base::Value::AsDictionaryValue(actual_pairing_1_value);
@@ -160,8 +160,8 @@
   registry->GetAllPairings(base::BindOnce(&PairingRegistryTest::set_pairings,
                                           base::Unretained(this)));
 
-  ASSERT_EQ(1u, pairings_->GetList().size());
-  const base::Value& actual_pairing_2_value = pairings_->GetList()[0];
+  ASSERT_EQ(1u, pairings_->GetListDeprecated().size());
+  const base::Value& actual_pairing_2_value = pairings_->GetListDeprecated()[0];
   ASSERT_TRUE(actual_pairing_2_value.is_dict());
   const base::DictionaryValue& actual_pairing_2 =
       base::Value::AsDictionaryValue(actual_pairing_2_value);
@@ -184,7 +184,7 @@
   registry->GetAllPairings(base::BindOnce(&PairingRegistryTest::set_pairings,
                                           base::Unretained(this)));
 
-  EXPECT_TRUE(pairings_->GetList().empty());
+  EXPECT_TRUE(pairings_->GetListDeprecated().empty());
 }
 
 ACTION_P(QuitMessageLoop, callback) {
@@ -196,7 +196,7 @@
 }
 
 MATCHER(NoPairings, "") {
-  return arg->GetList().empty();
+  return arg->GetListDeprecated().empty();
 }
 
 TEST_F(PairingRegistryTest, SerializedRequests) {
diff --git a/remoting/protocol/webrtc_audio_source_adapter.cc b/remoting/protocol/webrtc_audio_source_adapter.cc
index 0fb4594f..30344c8 100644
--- a/remoting/protocol/webrtc_audio_source_adapter.cc
+++ b/remoting/protocol/webrtc_audio_source_adapter.cc
@@ -11,6 +11,7 @@
 #include "base/observer_list.h"
 #include "base/synchronization/lock.h"
 #include "base/threading/thread_checker.h"
+#include "base/time/time.h"
 #include "remoting/proto/audio.pb.h"
 #include "remoting/protocol/audio_source.h"
 
diff --git a/rlz/chromeos/lib/rlz_value_store_chromeos.cc b/rlz/chromeos/lib/rlz_value_store_chromeos.cc
index 45dec69..60b5c60 100644
--- a/rlz/chromeos/lib/rlz_value_store_chromeos.cc
+++ b/rlz/chromeos/lib/rlz_value_store_chromeos.cc
@@ -330,7 +330,7 @@
   events->clear();
 
   bool remove_caf = false;
-  for (const base::Value& item : events_list->GetList()) {
+  for (const base::Value& item : events_list->GetListDeprecated()) {
     const std::string* event = item.GetIfString();
     if (!event)
       continue;
@@ -469,7 +469,7 @@
     list_value =
         rlz_store_.SetPath(list_name, base::Value(base::Value::Type::LIST));
   }
-  if (!base::Contains(list_value->GetList(), value)) {
+  if (!base::Contains(list_value->GetListDeprecated(), value)) {
     list_value->Append(std::move(value));
   }
   return true;
@@ -497,7 +497,7 @@
   if (!list_value)
     return false;
 
-  return base::Contains(list_value->GetList(), value);
+  return base::Contains(list_value->GetListDeprecated(), value);
 }
 
 bool RlzValueStoreChromeOS::HasAccessPointRlz(AccessPoint access_point) const {
diff --git a/services/data_decoder/public/cpp/safe_xml_parser.cc b/services/data_decoder/public/cpp/safe_xml_parser.cc
index cdca29b..1ee4cb92 100644
--- a/services/data_decoder/public/cpp/safe_xml_parser.cc
+++ b/services/data_decoder/public/cpp/safe_xml_parser.cc
@@ -60,7 +60,7 @@
     return false;
 
   const base::Value* text_node = nullptr;
-  for (const base::Value& value : children->GetList()) {
+  for (const base::Value& value : children->GetListDeprecated()) {
     if (IsXmlElementOfType(value, mojom::XmlParser::kTextNodeType) ||
         IsXmlElementOfType(value, mojom::XmlParser::kCDataNodeType)) {
       text_node = &value;
@@ -103,7 +103,7 @@
   if (!children)
     return 0;
   int child_count = 0;
-  for (const base::Value& value : children->GetList()) {
+  for (const base::Value& value : children->GetListDeprecated()) {
     DCHECK(value.is_dict());
     std::string tag_name;
     bool success = GetXmlElementTagName(value, &tag_name);
@@ -118,7 +118,7 @@
   const base::Value* children = GetXmlElementChildren(element);
   if (!children)
     return nullptr;
-  for (const base::Value& value : children->GetList()) {
+  for (const base::Value& value : children->GetListDeprecated()) {
     DCHECK(value.is_dict());
     if (IsXmlElementOfType(value, type)) {
       return &value;
@@ -132,7 +132,7 @@
   const base::Value* children = GetXmlElementChildren(element);
   if (!children)
     return nullptr;
-  for (const base::Value& value : children->GetList()) {
+  for (const base::Value& value : children->GetListDeprecated()) {
     DCHECK(value.is_dict());
     if (IsXmlElementNamed(value, tag))
       return &value;
@@ -148,7 +148,7 @@
   if (!children)
     return false;
   bool found = false;
-  for (const base::Value& child : children->GetList()) {
+  for (const base::Value& child : children->GetListDeprecated()) {
     DCHECK(child.is_dict());
     if (IsXmlElementNamed(child, tag)) {
       found = true;
diff --git a/services/data_decoder/xml_parser.cc b/services/data_decoder/xml_parser.cc
index 97ede91..b158c79 100644
--- a/services/data_decoder/xml_parser.cc
+++ b/services/data_decoder/xml_parser.cc
@@ -70,7 +70,7 @@
     children = element->SetKey(mojom::XmlParser::kChildrenKey,
                                base::Value(base::Value::Type::LIST));
   children->Append(std::move(child));
-  return &children->GetList().back();
+  return &children->GetListDeprecated().back();
 }
 
 void PopulateNamespaces(base::Value* node_value, XmlReader* xml_reader) {
diff --git a/services/device/geolocation/network_location_provider_unittest.cc b/services/device/geolocation/network_location_provider_unittest.cc
index 11ecc7d6..2e05c8f1 100644
--- a/services/device/geolocation/network_location_provider_unittest.cc
+++ b/services/device/geolocation/network_location_provider_unittest.cc
@@ -308,7 +308,8 @@
         ASSERT_TRUE(expected_json_value.is_dict());
         const base::DictionaryValue& expected_json =
             base::Value::AsDictionaryValue(expected_json_value);
-        const base::Value& actual_json_value = wifi_aps_json->GetList()[i];
+        const base::Value& actual_json_value =
+            wifi_aps_json->GetListDeprecated()[i];
         ASSERT_TRUE(actual_json_value.is_dict());
         const base::DictionaryValue& actual_json =
             base::Value::AsDictionaryValue(actual_json_value);
diff --git a/services/device/geolocation/network_location_request.cc b/services/device/geolocation/network_location_request.cc
index 8f5a06e..f016590 100644
--- a/services/device/geolocation/network_location_request.cc
+++ b/services/device/geolocation/network_location_request.cc
@@ -287,7 +287,7 @@
     AddInteger("signalToNoiseRatio", ap_data->signal_to_noise, wifi_dict.get());
     wifi_access_point_list->Append(std::move(wifi_dict));
   }
-  if (!wifi_access_point_list->GetList().empty())
+  if (!wifi_access_point_list->GetListDeprecated().empty())
     request->Set("wifiAccessPoints", std::move(wifi_access_point_list));
 }
 
diff --git a/services/image_annotation/annotator.cc b/services/image_annotation/annotator.cc
index 3feb3a1..f5c01db9 100644
--- a/services/image_annotation/annotator.cc
+++ b/services/image_annotation/annotator.cc
@@ -103,7 +103,7 @@
   std::string all_ocr_text;
   int word_count = 0;
   double word_confidence_sum = 0.0;
-  for (const base::Value& ocr_region : ocr_regions->GetList()) {
+  for (const base::Value& ocr_region : ocr_regions->GetListDeprecated()) {
     if (!ocr_region.is_dict())
       continue;
 
@@ -112,7 +112,7 @@
       continue;
 
     std::string region_ocr_text;
-    for (const base::Value& word : words->GetList()) {
+    for (const base::Value& word : words->GetListDeprecated()) {
       if (!word.is_dict())
         continue;
 
@@ -192,7 +192,7 @@
   if (!desc_list || !desc_list->is_list())
     return {adult, std::move(results)};
 
-  for (const base::Value& desc : desc_list->GetList()) {
+  for (const base::Value& desc : desc_list->GetListDeprecated()) {
     if (!desc.is_dict())
       continue;
 
@@ -241,7 +241,7 @@
   if (!icon_list || !icon_list->is_list())
     return {};
 
-  for (const base::Value& icon : icon_list->GetList()) {
+  for (const base::Value& icon : icon_list->GetListDeprecated()) {
     if (!icon.is_dict())
       continue;
 
@@ -303,7 +303,7 @@
     return {};
 
   std::map<std::string, mojom::AnnotateImageResultPtr> out;
-  for (const base::Value& result : results->GetList()) {
+  for (const base::Value& result : results->GetListDeprecated()) {
     if (!result.is_dict())
       continue;
 
@@ -323,7 +323,8 @@
     std::vector<mojom::AnnotationPtr> annotations;
     mojom::AnnotationPtr ocr_annotation;
     mojom::AnnotationPtr icon_annotation;
-    for (const base::Value& engine_result : engine_results->GetList()) {
+    for (const base::Value& engine_result :
+         engine_results->GetListDeprecated()) {
       if (!engine_result.is_dict())
         continue;
 
@@ -995,7 +996,7 @@
   }
 
   std::vector<std::string> new_server_languages;
-  for (const base::Value& lang : langs->GetList()) {
+  for (const base::Value& lang : langs->GetListDeprecated()) {
     if (!lang.is_string()) {
       DVLOG(1) << "Lang in response JSON is not a string";
       return;
diff --git a/services/network/first_party_sets/first_party_set_parser.cc b/services/network/first_party_sets/first_party_set_parser.cc
index 38a9caa..3348ad7 100644
--- a/services/network/first_party_sets/first_party_set_parser.cc
+++ b/services/network/first_party_sets/first_party_set_parser.cc
@@ -102,7 +102,7 @@
     return false;
 
   // Add each member to our mapping (assuming the member is a string).
-  for (const auto& item : maybe_members_list->GetList()) {
+  for (const auto& item : maybe_members_list->GetListDeprecated()) {
     // Members may not be a member of another set, and may not be an owner of
     // another set.
     if (!item.is_string())
@@ -114,7 +114,7 @@
     map.emplace(*member, *canonical_owner);
     elements.insert(std::move(*member));
   }
-  return !maybe_members_list->GetList().empty();
+  return !maybe_members_list->GetListDeprecated().empty();
 }
 
 }  // namespace
@@ -199,7 +199,7 @@
 
   base::flat_map<net::SchemefulSite, net::SchemefulSite> map;
   base::flat_set<net::SchemefulSite> elements;
-  for (const auto& value : maybe_value->GetList()) {
+  for (const auto& value : maybe_value->GetListDeprecated()) {
     if (!ParseSet(value, map, elements))
       return {};
   }
diff --git a/services/network/network_context.h b/services/network/network_context.h
index e2fb0ef..b180447 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -503,10 +503,6 @@
     return proxy_lookup_requests_.size();
   }
 
-  NetworkServiceProxyDelegate* proxy_delegate() const {
-    return proxy_delegate_;
-  }
-
   void set_network_qualities_pref_delegate_for_testing(
       std::unique_ptr<NetworkQualitiesPrefDelegate>
           network_qualities_pref_delegate) {
diff --git a/services/network/network_context_unittest.cc b/services/network/network_context_unittest.cc
index adcd9f1e..bc642d55 100644
--- a/services/network/network_context_unittest.cc
+++ b/services/network/network_context_unittest.cc
@@ -508,13 +508,13 @@
             {"groups", group.ToString(), "idle_sockets"}},
         base::Value::Type::LIST);
     if (idle_sockets)
-      count += idle_sockets->GetList().size();
+      count += idle_sockets->GetListDeprecated().size();
     base::Value* connect_jobs = pool_info.FindPathOfType(
         base::span<const base::StringPiece>{
             {"groups", group.ToString(), "connect_jobs"}},
         base::Value::Type::LIST);
     if (connect_jobs)
-      count += connect_jobs->GetList().size();
+      count += connect_jobs->GetListDeprecated().size();
     return count;
   }
 
diff --git a/services/network/origin_policy/origin_policy_parser.cc b/services/network/origin_policy/origin_policy_parser.cc
index 8f1c193b..02953de6 100644
--- a/services/network/origin_policy/origin_policy_parser.cc
+++ b/services/network/origin_policy/origin_policy_parser.cc
@@ -51,7 +51,7 @@
   if (!raw_ids) {
     return false;
   }
-  for (const auto& id : raw_ids->GetList()) {
+  for (const auto& id : raw_ids->GetListDeprecated()) {
     if (id.is_string()) {
       const std::string& id_string = id.GetString();
       if (IsValidOriginPolicyId(id_string)) {
@@ -67,7 +67,7 @@
     const base::Value& content_security) {
   const base::Value* policies = content_security.FindListKey("policies");
   if (policies) {
-    for (const auto& policy : policies->GetList()) {
+    for (const auto& policy : policies->GetListDeprecated()) {
       if (policy.is_string()) {
         policy_contents_->content_security_policies.push_back(
             policy.GetString());
@@ -78,7 +78,7 @@
   const base::Value* policies_report_only =
       content_security.FindListKey("policies_report_only");
   if (policies_report_only) {
-    for (const auto& policy : policies_report_only->GetList()) {
+    for (const auto& policy : policies_report_only->GetListDeprecated()) {
       if (policy.is_string()) {
         policy_contents_->content_security_policies_report_only.push_back(
             policy.GetString());
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index 329324e..87841e2 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -194,11 +194,6 @@
 const base::Feature kSCTAuditingPersistReports{
     "SCTAuditingPersistReports", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// This feature is used for tuning several loading-related data pipe
-// parameters. See crbug.com/1041006.
-const base::Feature kLoaderDataPipeTuningFeature{
-    "LoaderDataPipeTuning", base::FEATURE_ENABLED_BY_DEFAULT};
-
 namespace {
 // The default Mojo ring buffer size, used to send the content body.
 static constexpr uint32_t kDefaultDataPipeAllocationSize = 512 * 1024;
@@ -211,8 +206,7 @@
 // small of a number will generate many tasks but setting a too large of a
 // number will lead to thread janks. This value was optimized via Finch:
 // see crbug.com/1041006.
-static constexpr uint32_t kDefaultMaxNumConsumedBytesInTask = 64 * 1024;
-static constexpr uint32_t kLargerMaxNumConsumedBytesInTask = 1024 * 1024;
+static constexpr uint32_t kMaxNumConsumedBytesInTask = 1024 * 1024;
 }  // namespace
 
 // static
@@ -220,8 +214,6 @@
   // For low-memory devices, always use the (smaller) default buffer size.
   if (base::SysInfo::AmountOfPhysicalMemoryMB() <= 512)
     return kDefaultDataPipeAllocationSize;
-  if (!base::FeatureList::IsEnabled(features::kLoaderDataPipeTuningFeature))
-    return kDefaultDataPipeAllocationSize;
   switch (option) {
     case DataPipeAllocationSize::kDefaultSizeOnly:
       return kDefaultDataPipeAllocationSize;
@@ -232,9 +224,7 @@
 
 // static
 uint32_t GetLoaderChunkSize() {
-  if (!base::FeatureList::IsEnabled(features::kLoaderDataPipeTuningFeature))
-    return kDefaultMaxNumConsumedBytesInTask;
-  return kLargerMaxNumConsumedBytesInTask;
+  return kMaxNumConsumedBytesInTask;
 }
 
 // Check disk cache to see if the queued requests (especially those don't need
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index 3ec8ec3..0748f76 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -75,9 +75,6 @@
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kSCTAuditingPersistReports;
 
-COMPONENT_EXPORT(NETWORK_CPP)
-extern const base::Feature kLoaderDataPipeTuningFeature;
-
 enum class DataPipeAllocationSize {
   kDefaultSizeOnly,
   kLargerSizeIfPossible,
diff --git a/services/network/public/mojom/network_service_test.mojom b/services/network/public/mojom/network_service_test.mojom
index bdf7ccb..6a91c05 100644
--- a/services/network/public/mojom/network_service_test.mojom
+++ b/services/network/public/mojom/network_service_test.mojom
@@ -4,6 +4,7 @@
 
 module network.mojom;
 
+import "mojo/public/mojom/base/file_path.mojom";
 import "mojo/public/mojom/base/memory_pressure_level.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "services/network/public/mojom/network_change_manager.mojom";
@@ -128,4 +129,7 @@
   // default.
   [Sync]
   SetSCTAuditingRetryDelay(mojo_base.mojom.TimeDelta? delay) => ();
+
+  // Opens a file with the given `path`, and returns whether it is valid.
+  OpenFile(mojo_base.mojom.FilePath path) => (bool result);
 };
diff --git a/services/network/sct_auditing/sct_auditing_handler.cc b/services/network/sct_auditing/sct_auditing_handler.cc
index 3a004a8..860b4e4 100644
--- a/services/network/sct_auditing/sct_auditing_handler.cc
+++ b/services/network/sct_auditing/sct_auditing_handler.cc
@@ -126,7 +126,7 @@
   }
 
   size_t num_reporters_deserialized = 0u;
-  for (const base::Value& sct_entry : value->GetList()) {
+  for (const base::Value& sct_entry : value->GetListDeprecated()) {
     if (!sct_entry.is_dict()) {
       continue;
     }
diff --git a/services/network/trust_tokens/trust_token_key_commitment_parser.cc b/services/network/trust_tokens/trust_token_key_commitment_parser.cc
index 4ab8b0eb..f4c88771 100644
--- a/services/network/trust_tokens/trust_token_key_commitment_parser.cc
+++ b/services/network/trust_tokens/trust_token_key_commitment_parser.cc
@@ -135,7 +135,7 @@
     return false;
 
   for (const base::Value& maybe_os_value :
-       maybe_request_issuance_locally_on->GetList()) {
+       maybe_request_issuance_locally_on->GetListDeprecated()) {
     if (!maybe_os_value.is_string())
       return false;
     absl::optional<mojom::TrustTokenKeyCommitmentResult::Os> maybe_os =
diff --git a/services/video_capture/device_media_to_mojo_adapter.cc b/services/video_capture/device_media_to_mojo_adapter.cc
index 1488c8a..43127275 100644
--- a/services/video_capture/device_media_to_mojo_adapter.cc
+++ b/services/video_capture/device_media_to_mojo_adapter.cc
@@ -156,6 +156,10 @@
   device_->OnUtilizationReport(/*frame_feedback_id=*/0, feedback);
 }
 
+void DeviceMediaToMojoAdapter::RequestRefreshFrame() {
+  device_->RequestRefreshFrame();
+}
+
 void DeviceMediaToMojoAdapter::Stop() {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (!device_started_)
diff --git a/services/video_capture/device_media_to_mojo_adapter.h b/services/video_capture/device_media_to_mojo_adapter.h
index b87b9632..c4f231d4 100644
--- a/services/video_capture/device_media_to_mojo_adapter.h
+++ b/services/video_capture/device_media_to_mojo_adapter.h
@@ -50,6 +50,7 @@
                        SetPhotoOptionsCallback callback) override;
   void TakePhoto(TakePhotoCallback callback) override;
   void ProcessFeedback(const media::VideoCaptureFeedback& feedback) override;
+  void RequestRefreshFrame() override;
 
   void Stop();
   void OnClientConnectionErrorOrClose();
diff --git a/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.cc b/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.cc
index 56c0255..6f66652c 100644
--- a/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.cc
+++ b/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.cc
@@ -135,6 +135,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
+void GpuMemoryBufferVirtualDeviceMojoAdapter::RequestRefreshFrame() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
 void GpuMemoryBufferVirtualDeviceMojoAdapter::Stop() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!video_frame_handler_.is_bound())
diff --git a/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.h b/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.h
index b5df2c7..ade2713 100644
--- a/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.h
+++ b/services/video_capture/gpu_memory_buffer_virtual_device_mojo_adapter.h
@@ -62,6 +62,7 @@
                        SetPhotoOptionsCallback callback) override;
   void TakePhoto(TakePhotoCallback callback) override;
   void ProcessFeedback(const media::VideoCaptureFeedback& feedback) override;
+  void RequestRefreshFrame() override;
 
   void Stop();
 
diff --git a/services/video_capture/lacros/device_proxy_lacros.cc b/services/video_capture/lacros/device_proxy_lacros.cc
index b0ea6ff..1c59cc4 100644
--- a/services/video_capture/lacros/device_proxy_lacros.cc
+++ b/services/video_capture/lacros/device_proxy_lacros.cc
@@ -19,6 +19,12 @@
     : device_(std::move(proxy_remote)) {
   receiver_.Bind(std::move(device_receiver));
   receiver_.set_disconnect_handler(std::move(cleanup_callback));
+
+  // Note that currently all versioned calls that we need to make are
+  // best effort, and can just be dropped if we haven't gotten an updated
+  // version yet. If that changes, we'll need to track that we have an
+  // outstanding query and respond accordingly.
+  device_.QueryVersion(base::DoNothing());
 }
 
 DeviceProxyLacros::~DeviceProxyLacros() = default;
@@ -60,4 +66,12 @@
   device_->ProcessFeedback(std::move(feedback));
 }
 
+void DeviceProxyLacros::RequestRefreshFrame() {
+  if (device_.version() >=
+      int{crosapi::mojom::VideoCaptureDevice::MethodMinVersions::
+              kRequestRefreshFrameMinVersion}) {
+    device_->RequestRefreshFrame();
+  }
+}
+
 }  // namespace video_capture
diff --git a/services/video_capture/lacros/device_proxy_lacros.h b/services/video_capture/lacros/device_proxy_lacros.h
index 312a989..8a1a8e2 100644
--- a/services/video_capture/lacros/device_proxy_lacros.h
+++ b/services/video_capture/lacros/device_proxy_lacros.h
@@ -41,6 +41,7 @@
                        SetPhotoOptionsCallback callback) override;
   void TakePhoto(TakePhotoCallback callback) override;
   void ProcessFeedback(const media::VideoCaptureFeedback& feedback) override;
+  void RequestRefreshFrame() override;
 
   std::unique_ptr<VideoFrameHandlerProxyLacros> handler_;
 
diff --git a/services/video_capture/lacros/video_frame_handler_proxy_lacros.cc b/services/video_capture/lacros/video_frame_handler_proxy_lacros.cc
index 206f8c3..dc6b2e6 100644
--- a/services/video_capture/lacros/video_frame_handler_proxy_lacros.cc
+++ b/services/video_capture/lacros/video_frame_handler_proxy_lacros.cc
@@ -169,6 +169,9 @@
   } else if (buffer_handle->is_gpu_memory_buffer_handle()) {
     media_handle->set_gpu_memory_buffer_handle(ToGfxGpuMemoryBufferHandle(
         std::move(buffer_handle->get_gpu_memory_buffer_handle())));
+  } else if (buffer_handle->is_read_only_shmem_region()) {
+    media_handle->set_read_only_shmem_region(
+        std::move(buffer_handle->get_read_only_shmem_region()));
   } else {
     NOTREACHED() << "Unexpected new buffer type";
   }
diff --git a/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc b/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc
index 13b2c38..31240c4 100644
--- a/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc
+++ b/services/video_capture/public/cpp/receiver_media_to_mojo_adapter.cc
@@ -4,33 +4,20 @@
 
 #include "services/video_capture/public/cpp/receiver_media_to_mojo_adapter.h"
 
+#include "media/capture/video/video_frame_receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 
 namespace video_capture {
 
 namespace {
-
-// Lets the mojo handler know that the buffer is no longer used upon going out
-// of scope.
-class ScopedVideoAccessHandlerNotifier
-    : public media::VideoCaptureDevice::Client::Buffer::ScopedAccessPermission {
- public:
-  ScopedVideoAccessHandlerNotifier(
-      scoped_refptr<VideoFrameAccessHandlerRemote> frame_access_handler_remote,
-      int32_t buffer_id)
-      : frame_access_handler_remote_(std::move(frame_access_handler_remote)),
-        buffer_id_(buffer_id) {}
-  ~ScopedVideoAccessHandlerNotifier() override {
-    (*frame_access_handler_remote_)->OnFinishedConsumingBuffer(buffer_id_);
-  }
-
- private:
-  scoped_refptr<VideoFrameAccessHandlerRemote> frame_access_handler_remote_;
-  int32_t buffer_id_;
-};
-
-}  // anonymous namespace
+void OnFramePropagationComplete(
+    scoped_refptr<VideoFrameAccessHandlerRemote> frame_access_handler_remote,
+    int32_t buffer_id) {
+  // Notify the VideoFrameAccessHandler that the buffer is no longer valid.
+  (*frame_access_handler_remote)->OnFinishedConsumingBuffer(buffer_id);
+}
+}  // namespace
 
 ReceiverMediaToMojoAdapter::ReceiverMediaToMojoAdapter(
     std::unique_ptr<media::VideoFrameReceiver> receiver)
@@ -60,8 +47,9 @@
 
   media::ReadyFrameInBuffer media_buffer(
       buffer->buffer_id, buffer->frame_feedback_id,
-      std::make_unique<ScopedVideoAccessHandlerNotifier>(frame_access_handler_,
-                                                         buffer->buffer_id),
+      std::make_unique<media::ScopedFrameDoneHelper>(
+          base::BindOnce(&OnFramePropagationComplete, frame_access_handler_,
+                         buffer->buffer_id)),
       std::move(buffer->frame_info));
 
   std::vector<media::ReadyFrameInBuffer> media_scaled_buffers;
@@ -69,8 +57,9 @@
   for (auto& scaled_buffer : scaled_buffers) {
     media_scaled_buffers.emplace_back(
         scaled_buffer->buffer_id, scaled_buffer->frame_feedback_id,
-        std::make_unique<ScopedVideoAccessHandlerNotifier>(
-            frame_access_handler_, scaled_buffer->buffer_id),
+        std::make_unique<media::ScopedFrameDoneHelper>(
+            base::BindOnce(&OnFramePropagationComplete, frame_access_handler_,
+                           scaled_buffer->buffer_id)),
         std::move(scaled_buffer->frame_info));
   }
   receiver_->OnFrameReadyInBuffer(std::move(media_buffer),
diff --git a/services/video_capture/public/mojom/device.mojom b/services/video_capture/public/mojom/device.mojom
index 6aa4a1cc..ed4e57b 100644
--- a/services/video_capture/public/mojom/device.mojom
+++ b/services/video_capture/public/mojom/device.mojom
@@ -29,4 +29,23 @@
   // |feedback| contains consumer feedback like resource utilization,
   // maximum requested frame-rate and resolution.
   ProcessFeedback(media.mojom.VideoCaptureFeedback feedback);
+
+  // In cases where the video capturer self-pauses (e.g., a screen capturer
+  // where the screen's content has not changed in a while), consumers may call
+  // this to request a "refresh frame" be delivered to the Client.  This is used
+  // in a number of circumstances, such as:
+  //
+  //   1. An additional consumer of video frames is starting up and requires a
+  //      first frame (as opposed to not receiving a frame for an indeterminate
+  //      amount of time).
+  //   2. A few repeats of the same frame would allow a lossy video encoder to
+  //      improve the video quality of unchanging content.
+  //
+  // The default implementation is a no-op. VideoCaptureDevice implementations
+  // are not required to honor this request, especially if they do not
+  // self-pause and/or if honoring the request would cause them to exceed their
+  // configured maximum frame rate. Any VideoCaptureDevice that does self-pause,
+  // however, should provide an implementation of this method that makes
+  // reasonable attempts to honor these requests.
+  RequestRefreshFrame();
 };
diff --git a/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc b/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc
index 3b7b234..675cd6a 100644
--- a/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc
+++ b/services/video_capture/shared_memory_virtual_device_mojo_adapter.cc
@@ -197,6 +197,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
+void SharedMemoryVirtualDeviceMojoAdapter::RequestRefreshFrame() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
 void SharedMemoryVirtualDeviceMojoAdapter::Stop() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!video_frame_handler_.is_bound())
diff --git a/services/video_capture/shared_memory_virtual_device_mojo_adapter.h b/services/video_capture/shared_memory_virtual_device_mojo_adapter.h
index c126014..9b012dd 100644
--- a/services/video_capture/shared_memory_virtual_device_mojo_adapter.h
+++ b/services/video_capture/shared_memory_virtual_device_mojo_adapter.h
@@ -52,6 +52,7 @@
                        SetPhotoOptionsCallback callback) override;
   void TakePhoto(TakePhotoCallback callback) override;
   void ProcessFeedback(const media::VideoCaptureFeedback& feedback) override;
+  void RequestRefreshFrame() override;
 
   void Stop();
 
diff --git a/services/video_capture/texture_virtual_device_mojo_adapter.cc b/services/video_capture/texture_virtual_device_mojo_adapter.cc
index f7a43cc..02ee149d 100644
--- a/services/video_capture/texture_virtual_device_mojo_adapter.cc
+++ b/services/video_capture/texture_virtual_device_mojo_adapter.cc
@@ -129,6 +129,10 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
+void TextureVirtualDeviceMojoAdapter::RequestRefreshFrame() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
 void TextureVirtualDeviceMojoAdapter::Stop() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!video_frame_handler_.is_bound())
diff --git a/services/video_capture/texture_virtual_device_mojo_adapter.h b/services/video_capture/texture_virtual_device_mojo_adapter.h
index 94173cc..6e4809b 100644
--- a/services/video_capture/texture_virtual_device_mojo_adapter.h
+++ b/services/video_capture/texture_virtual_device_mojo_adapter.h
@@ -54,6 +54,7 @@
                        SetPhotoOptionsCallback callback) override;
   void TakePhoto(TakePhotoCallback callback) override;
   void ProcessFeedback(const media::VideoCaptureFeedback& feedback) override;
+  void RequestRefreshFrame() override;
 
   void Stop();
 
diff --git a/storage/browser/quota/quota_manager_impl.cc b/storage/browser/quota/quota_manager_impl.cc
index 609893d..0901cd0 100644
--- a/storage/browser/quota/quota_manager_impl.cc
+++ b/storage/browser/quota/quota_manager_impl.cc
@@ -725,7 +725,7 @@
         callback_(std::move(callback)),
         completion_closure_(std::move(completion_closure)) {
     DCHECK(manager_);
-    // TODO(crbug/1292216): Convert back into DCHECKS one issue is resolved.
+    // TODO(crbug/1292216): Convert back into DCHECKs once issue is resolved.
     CHECK(callback_);
     CHECK(completion_closure_);
   }
@@ -741,7 +741,8 @@
   void Run() {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 #if DCHECK_IS_ON()
-    DCHECK(!run_called_) << __func__ << " already called";
+    // TODO(crbug/1292216): Convert back into DCHECK once issue is resolved.
+    CHECK(!run_called_) << __func__ << " already called";
     run_called_ = true;
 #endif  // DCHECK_IS_ON()
 
@@ -788,7 +789,10 @@
       FinishDeletion();
   }
 
-  bool completed() { return !callback_; }
+  bool completed() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return !callback_;
+  }
 
  private:
   void DidDeleteBucketData(int tracing_id,
@@ -807,8 +811,10 @@
 
   void FinishDeletion() {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    // TODO(crbug/1292216): Convert back into DCHECKS one issue is resolved.
+    // TODO(crbug/1292216): Convert back into DCHECKs once issue is resolved.
     CHECK_EQ(remaining_clients_, 0u);
+    CHECK(callback_) << __func__ << " called after Complete";
+    CHECK(completion_closure_) << __func__ << " called after Complete";
 
     // Only remove the bucket from the database if we didn't skip any client
     // types.
@@ -830,7 +836,8 @@
 
   void Complete(bool success) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-    // TODO(crbug/1292216): Convert back into DCHECKS one issue is resolved.
+    // TODO(crbug/1292216): Convert back into DCHECKs once issue is resolved.
+    CHECK_EQ(remaining_clients_, 0u);
     CHECK(callback_);
     CHECK(completion_closure_);
 
@@ -839,6 +846,8 @@
                 : blink::mojom::QuotaStatusCode::kErrorInvalidModification);
 
     // Deletes `this`.
+    // TODO(crbug/1292216): Delete once issue is resolved.
+    CHECK(completion_closure_);
     std::move(completion_closure_).Run(this);
   }
 
@@ -849,8 +858,9 @@
   int error_count_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
   size_t remaining_clients_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
   int skipped_clients_ GUARDED_BY_CONTEXT(sequence_checker_) = 0;
-  StatusCallback callback_;
-  base::OnceCallback<void(BucketDataDeleter*)> completion_closure_;
+  StatusCallback callback_ GUARDED_BY_CONTEXT(sequence_checker_);
+  base::OnceCallback<void(BucketDataDeleter*)> completion_closure_
+      GUARDED_BY_CONTEXT(sequence_checker_);
 
 #if DCHECK_IS_ON()
   bool run_called_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
diff --git a/testing/buildbot/OWNERS b/testing/buildbot/OWNERS
index 140f252..e38644c0 100644
--- a/testing/buildbot/OWNERS
+++ b/testing/buildbot/OWNERS
@@ -5,7 +5,6 @@
 # compile targets) please get a review from someone in //infra/OWNERS.
 file://infra/OWNERS
 
-bsheedy@chromium.org
 jam@chromium.org
 jochen@chromium.org
 sky@chromium.org
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index ad9dec8..b33d7881 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -2222,7 +2222,8 @@
               "ssd": "0"
             }
           ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 5
         },
         "test": "ash_unittests",
         "test_id_prefix": "ninja://ash:ash_unittests/"
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index ec2b8b5..d93aab51 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -1704,7 +1704,8 @@
               "os": "Ubuntu-18.04"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 5
         },
         "test": "ash_unittests",
         "test_id_prefix": "ninja://ash:ash_unittests/"
@@ -3328,7 +3329,8 @@
               "os": "Ubuntu-18.04"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 5
         },
         "test": "ash_unittests",
         "test_id_prefix": "ninja://ash:ash_unittests/"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 6fded01d..8b1ef05 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -29895,7 +29895,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -29948,7 +29948,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -30001,7 +30001,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -30054,7 +30054,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -30107,7 +30107,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -30160,7 +30160,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -31155,7 +31155,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -31208,7 +31208,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -31261,7 +31261,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -31314,7 +31314,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -31367,7 +31367,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -31420,7 +31420,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -38254,7 +38254,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -38310,7 +38310,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -38366,7 +38366,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -38422,7 +38422,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -38478,7 +38478,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -38534,7 +38534,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -39586,7 +39586,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -39642,7 +39642,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -39698,7 +39698,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -39754,7 +39754,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -39810,7 +39810,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -39866,7 +39866,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -45316,7 +45316,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -45526,7 +45526,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -47462,7 +47462,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -47517,7 +47517,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -47898,7 +47898,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -47953,7 +47953,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -50900,7 +50900,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -50953,7 +50953,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -51006,7 +51006,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -51059,7 +51059,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -51740,7 +51740,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -51793,7 +51793,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -51846,7 +51846,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -51899,7 +51899,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -55136,7 +55136,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -55189,7 +55189,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -55242,7 +55242,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -55766,7 +55766,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -55819,7 +55819,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -55872,7 +55872,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -60384,7 +60384,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -60437,7 +60437,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -60490,7 +60490,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -60543,7 +60543,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -60596,7 +60596,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -60649,7 +60649,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -61644,7 +61644,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -61697,7 +61697,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -61750,7 +61750,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -61803,7 +61803,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -61856,7 +61856,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -61909,7 +61909,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -68730,7 +68730,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -68783,7 +68783,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -68836,7 +68836,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -68889,7 +68889,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -68942,7 +68942,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -68995,7 +68995,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -69990,7 +69990,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -70043,7 +70043,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -70096,7 +70096,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -70149,7 +70149,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -70202,7 +70202,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -70255,7 +70255,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -80379,7 +80379,8 @@
               "os": "Ubuntu-18.04"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 5
         },
         "test": "ash_unittests",
         "test_id_prefix": "ninja://ash:ash_unittests/"
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 13f1aae..2a13eae9 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -5305,174 +5305,6 @@
       }
     ]
   },
-  "Android FYI SkiaRenderer GL (Nexus 5X)": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=android-chromium",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --disable-software-compositing-fallback --disable-headless-mode --force-online-connection-state-for-indicator",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test_android_chrome",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "egl_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
-      }
-    ]
-  },
-  "Android FYI SkiaRenderer Vulkan (Pixel 2)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-vulkan=native",
-          "--disable-vulkan-fallback-to-gl-for-testing",
-          "--enable-features=UseSkiaRenderer,Vulkan",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "vulkan_content_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "device_os": "PQ3A.190801.002",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=android-chromium",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-cmd-decoder=validating --force-online-connection-state-for-indicator",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test_android_chrome",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "vulkan_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "device_os": "PQ3A.190801.002",
-              "device_os_flavor": "google",
-              "device_os_type": "userdebug",
-              "device_type": "walleye",
-              "os": "Android"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test_android_chrome/"
-      }
-    ]
-  },
   "ChromeOS FYI Release (amd64-generic)": {
     "additional_compile_targets": [
       "chromiumos_preflight"
@@ -9760,6 +9592,50 @@
       },
       {
         "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-cmd-decoder=validating",
+          "--dont-restore-color-profile-after-test",
+          "--test-machine-name",
+          "${buildername}",
+          "--git-revision=${got_revision}"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "vulkan_pixel_skia_gold_test",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-19.0.2",
+              "os": "Ubuntu-19.04",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
           "webgl_conformance",
           "--show-stdout",
           "--browser=release",
@@ -10881,6 +10757,50 @@
       },
       {
         "args": [
+          "pixel",
+          "--show-stdout",
+          "--browser=release",
+          "--passthrough",
+          "-v",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-cmd-decoder=validating",
+          "--dont-restore-color-profile-after-test",
+          "--test-machine-name",
+          "${buildername}",
+          "--git-revision=${got_revision}"
+        ],
+        "isolate_name": "telemetry_gpu_integration_test",
+        "merge": {
+          "args": [],
+          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
+        },
+        "name": "vulkan_pixel_skia_gold_test",
+        "precommit_args": [
+          "--gerrit-issue=${patch_issue}",
+          "--gerrit-patchset=${patch_set}",
+          "--buildbucket-id=${buildbucket_build_id}"
+        ],
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "should_retry_with_patch": false,
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "containment_type": "AUTO",
+          "dimension_sets": [
+            {
+              "gpu": "10de:2184-440.100",
+              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
+              "pool": "chromium.tests.gpu"
+            }
+          ],
+          "idempotent": false,
+          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
+      },
+      {
+        "args": [
           "webgl_conformance",
           "--show-stdout",
           "--browser=release",
@@ -10956,823 +10876,6 @@
       }
     ]
   },
-  "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--no-xvfb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "args": [
-          "--no-xvfb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/gpu.linux.skiarenderer_dawn_viz_unittests.filter"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer,UiGpuRasterization,SkiaDawn --enable-gpu-rasterization --use-vulkan=native",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "dawn_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer,UiGpuRasterization,SkiaDawn --enable-gpu-rasterization --use-vulkan=native",
-          "--dont-restore-color-profile-after-test",
-          "--test-filter=ScreenshotSync_GPURasterWithDivs"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      }
-    ]
-  },
-  "Linux FYI SkiaRenderer Vulkan (Intel HD 630)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--enable-gpu",
-          "--test-launcher-bot-mode",
-          "--test-launcher-jobs=1",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter",
-          "--enable-features=UseSkiaRenderer,UiGpuRasterization,Vulkan",
-          "--use-vulkan=native",
-          "--enable-gpu-rasterization",
-          "--disable-software-compositing-fallback",
-          "--disable-vulkan-fallback-to-gl-for-testing",
-          "--disable-headless-mode",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "vulkan_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "args": [
-          "--enable-gpu",
-          "--test-launcher-bot-mode",
-          "--test-launcher-jobs=1",
-          "--disable-headless-mode",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "vulkan_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vulkan_tests",
-        "test_id_prefix": "ninja://gpu/vulkan:vulkan_tests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "context_lost_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gpu_process_launch_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "hardware_accelerated_feature_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "maps_pixel_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "skia_renderer_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-cmd-decoder=validating",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "vulkan_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "8086:5912-19.0.2",
-              "os": "Ubuntu-19.04",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      }
-    ]
-  },
-  "Linux FYI SkiaRenderer Vulkan (NVIDIA)": {
-    "gtest_tests": [
-      {
-        "args": [
-          "--enable-gpu",
-          "--test-launcher-bot-mode",
-          "--test-launcher-jobs=1",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter",
-          "--enable-features=UseSkiaRenderer,UiGpuRasterization,Vulkan",
-          "--use-vulkan=native",
-          "--enable-gpu-rasterization",
-          "--disable-software-compositing-fallback",
-          "--disable-vulkan-fallback-to-gl-for-testing",
-          "--disable-headless-mode",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "vulkan_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "args": [
-          "--enable-gpu",
-          "--test-launcher-bot-mode",
-          "--test-launcher-jobs=1",
-          "--disable-headless-mode",
-          "--no-xvfb"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "vulkan_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "vulkan_tests",
-        "test_id_prefix": "ninja://gpu/vulkan:vulkan_tests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "context_lost_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gpu_process_launch_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "hardware_accelerated_feature_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "maps_pixel_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "skia_renderer_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-cmd-decoder=validating",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "vulkan_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-440.100",
-              "os": "Ubuntu-18.04.5|Ubuntu-18.04.6",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      }
-    ]
-  },
   "Mac FYI ASAN (Intel)": {
     "gtest_tests": [
       {
@@ -28333,133 +27436,6 @@
       }
     ]
   },
-  "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)": {
-    "gtest_tests": [
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-27.21.14.5638",
-              "os": "Windows-10-18363",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-27.21.14.5638",
-              "os": "Windows-10-18363",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer,SkiaDawn",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "dawn_pixel_skia_gold_test",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-27.21.14.5638",
-              "os": "Windows-10-18363",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chrome-gpu-gold@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "screenshot_sync",
-          "--show-stdout",
-          "--browser=release_x64",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-features=UseSkiaRenderer,SkiaDawn",
-          "--dont-restore-color-profile-after-test",
-          "--test-filter=ScreenshotSync_GPURasterWithDivs::ScreenshotSync_SWRasterWithDivs"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "screenshot_sync_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "gpu": "10de:2184-27.21.14.5638",
-              "os": "Windows-10-18363",
-              "pool": "chromium.tests.gpu"
-            }
-          ],
-          "idempotent": false,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      }
-    ]
-  },
   "Win10 FYI x86 Release (NVIDIA)": {
     "gtest_tests": [
       {
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 786d46b..2418d0a 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -6894,7 +6894,6 @@
   "Mac10.15 Tests": {
     "gtest_tests": [
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6913,7 +6912,6 @@
         "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6935,7 +6933,6 @@
         "args": [
           "angle_unittests"
         ],
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -6955,7 +6952,6 @@
         "use_isolated_scripts_api": true
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6974,7 +6970,6 @@
         "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6993,7 +6988,6 @@
         "test_id_prefix": "ninja://base:base_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7012,7 +7006,6 @@
         "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7031,7 +7024,6 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7050,7 +7042,6 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7069,7 +7060,6 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7089,7 +7079,6 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7108,7 +7097,6 @@
         "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7130,7 +7118,6 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7149,7 +7136,6 @@
         "test_id_prefix": "ninja://media/capture:capture_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7168,7 +7154,6 @@
         "test_id_prefix": "ninja://media/cast:cast_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7187,7 +7172,6 @@
         "test_id_prefix": "ninja://cc:cc_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7206,7 +7190,6 @@
         "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7225,7 +7208,6 @@
         "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7244,7 +7226,6 @@
         "test_id_prefix": "ninja://components:components_browsertests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7263,7 +7244,6 @@
         "test_id_prefix": "ninja://components:components_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7283,7 +7263,6 @@
         "test_id_prefix": "ninja://content/test:content_browsertests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7302,7 +7281,6 @@
         "test_id_prefix": "ninja://content/test:content_nocompile_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7321,7 +7299,6 @@
         "test_id_prefix": "ninja://content/test:content_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7340,7 +7317,6 @@
         "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7359,7 +7335,6 @@
         "test_id_prefix": "ninja://components/cronet:cronet_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7378,7 +7353,6 @@
         "test_id_prefix": "ninja://components/cronet:cronet_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7397,7 +7371,6 @@
         "test_id_prefix": "ninja://crypto:crypto_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7416,7 +7389,6 @@
         "test_id_prefix": "ninja://device:device_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7435,7 +7407,6 @@
         "test_id_prefix": "ninja://ui/display:display_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7454,7 +7425,6 @@
         "test_id_prefix": "ninja://ui/events:events_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7473,7 +7443,6 @@
         "test_id_prefix": "ninja://extensions:extensions_browsertests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7492,7 +7461,6 @@
         "test_id_prefix": "ninja://extensions:extensions_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7511,7 +7479,6 @@
         "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7530,7 +7497,6 @@
         "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7549,7 +7515,6 @@
         "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7568,7 +7533,6 @@
         "test_id_prefix": "ninja://gin:gin_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7587,7 +7551,6 @@
         "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7606,7 +7569,6 @@
         "test_id_prefix": "ninja://gpu:gpu_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7625,7 +7587,6 @@
         "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7644,7 +7605,6 @@
         "test_id_prefix": "ninja://headless:headless_browsertests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7663,7 +7623,6 @@
         "test_id_prefix": "ninja://headless:headless_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7683,7 +7642,6 @@
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7702,7 +7660,6 @@
         "test_id_prefix": "ninja://ipc:ipc_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7721,7 +7678,6 @@
         "test_id_prefix": "ninja://ui/latency:latency_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7740,7 +7696,6 @@
         "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7759,7 +7714,6 @@
         "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7778,7 +7732,6 @@
         "test_id_prefix": "ninja://media:media_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7797,7 +7750,6 @@
         "test_id_prefix": "ninja://ui/message_center:message_center_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7816,7 +7768,6 @@
         "test_id_prefix": "ninja://media/midi:midi_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7835,7 +7786,6 @@
         "test_id_prefix": "ninja://mojo:mojo_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7854,7 +7804,6 @@
         "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7873,7 +7822,6 @@
         "test_id_prefix": "ninja://net:net_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7892,7 +7840,6 @@
         "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7911,7 +7858,6 @@
         "test_id_prefix": "ninja://pdf:pdf_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7930,7 +7876,6 @@
         "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7949,7 +7894,6 @@
         "test_id_prefix": "ninja://tools/mac/power:power_sampler_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7968,7 +7912,6 @@
         "test_id_prefix": "ninja://ppapi:ppapi_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -7987,7 +7930,6 @@
         "test_id_prefix": "ninja://printing:printing_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8006,7 +7948,6 @@
         "test_id_prefix": "ninja://remoting:remoting_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8025,7 +7966,6 @@
         "test_id_prefix": "ninja://sandbox/mac:sandbox_mac_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8044,7 +7984,6 @@
         "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8063,7 +8002,6 @@
         "test_id_prefix": "ninja://services:services_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8082,7 +8020,6 @@
         "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8101,7 +8038,6 @@
         "test_id_prefix": "ninja://skia:skia_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8120,7 +8056,6 @@
         "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8139,7 +8074,6 @@
         "test_id_prefix": "ninja://sql:sql_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8158,7 +8092,6 @@
         "test_id_prefix": "ninja://storage:storage_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8177,7 +8110,6 @@
         "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8196,7 +8128,6 @@
         "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8215,7 +8146,6 @@
         "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8239,7 +8169,6 @@
           "--ui-test-action-max-timeout=45000",
           "--ui-test-action-timeout=40000"
         ],
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8258,7 +8187,6 @@
         "test_id_prefix": "ninja://chrome/updater:updater_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8277,7 +8205,6 @@
         "test_id_prefix": "ninja://url:url_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8296,7 +8223,6 @@
         "test_id_prefix": "ninja://ui/views:views_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8315,7 +8241,6 @@
         "test_id_prefix": "ninja://components/viz:viz_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8334,7 +8259,6 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8354,7 +8278,6 @@
         "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
       },
       {
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8376,7 +8299,6 @@
     "isolated_scripts": [
       {
         "isolate_name": "blink_python_tests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8402,7 +8324,6 @@
           "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [
             "--verbose"
@@ -8432,7 +8353,6 @@
           "--test-type=integration"
         ],
         "isolate_name": "chromedriver_py_tests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8455,7 +8375,6 @@
       },
       {
         "isolate_name": "chromedriver_replay_unittests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8478,7 +8397,6 @@
           "--gtest-benchmark-name=components_perftests"
         ],
         "isolate_name": "components_perftests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [
             "--smoke-test-mode"
@@ -8500,7 +8418,6 @@
       },
       {
         "isolate_name": "content_shell_crash_test",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8524,7 +8441,6 @@
       },
       {
         "isolate_name": "flatbuffers_unittests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8548,7 +8464,6 @@
       },
       {
         "isolate_name": "grit_python_unittests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8571,7 +8486,6 @@
       },
       {
         "isolate_name": "mac_signing_tests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8591,7 +8505,6 @@
       },
       {
         "isolate_name": "mojo_python_unittests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8614,7 +8527,6 @@
       },
       {
         "isolate_name": "telemetry_gpu_unittests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8642,7 +8554,6 @@
           "--extra-browser-args=--disable-gpu"
         ],
         "isolate_name": "telemetry_unittests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8670,7 +8581,6 @@
           "--gtest-benchmark-name=views_perftests"
         ],
         "isolate_name": "views_perftests",
-        "isolate_profile_data": true,
         "merge": {
           "args": [
             "--smoke-test-mode"
@@ -8695,6 +8605,7 @@
   "Mac11 Tests": {
     "gtest_tests": [
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8713,6 +8624,7 @@
         "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8734,6 +8646,7 @@
         "args": [
           "angle_unittests"
         ],
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -8753,6 +8666,7 @@
         "use_isolated_scripts_api": true
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8771,6 +8685,7 @@
         "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8789,6 +8704,7 @@
         "test_id_prefix": "ninja://base:base_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8807,6 +8723,7 @@
         "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8825,6 +8742,7 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8843,6 +8761,7 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8861,6 +8780,7 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8880,6 +8800,7 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8898,6 +8819,7 @@
         "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8917,6 +8839,7 @@
       },
       {
         "ci_only": true,
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8939,6 +8862,7 @@
         "args": [
           "--gtest_filter=-*UsingRealWebcam*"
         ],
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8957,6 +8881,7 @@
         "test_id_prefix": "ninja://media/capture:capture_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8975,6 +8900,7 @@
         "test_id_prefix": "ninja://media/cast:cast_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -8993,6 +8919,7 @@
         "test_id_prefix": "ninja://cc:cc_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9011,6 +8938,7 @@
         "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9029,6 +8957,7 @@
         "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9047,6 +8976,7 @@
         "test_id_prefix": "ninja://components:components_browsertests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9065,6 +8995,7 @@
         "test_id_prefix": "ninja://components:components_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9085,6 +9016,7 @@
         "test_id_prefix": "ninja://content/test:content_browsertests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9103,6 +9035,7 @@
         "test_id_prefix": "ninja://content/test:content_nocompile_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9121,6 +9054,7 @@
         "test_id_prefix": "ninja://content/test:content_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9139,6 +9073,7 @@
         "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9157,6 +9092,7 @@
         "test_id_prefix": "ninja://components/cronet:cronet_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9175,6 +9111,7 @@
         "test_id_prefix": "ninja://components/cronet:cronet_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9193,6 +9130,7 @@
         "test_id_prefix": "ninja://crypto:crypto_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9211,6 +9149,7 @@
         "test_id_prefix": "ninja://device:device_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9229,6 +9168,7 @@
         "test_id_prefix": "ninja://ui/display:display_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9247,6 +9187,7 @@
         "test_id_prefix": "ninja://ui/events:events_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9265,6 +9206,7 @@
         "test_id_prefix": "ninja://extensions:extensions_browsertests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9283,6 +9225,7 @@
         "test_id_prefix": "ninja://extensions:extensions_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9301,6 +9244,7 @@
         "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9319,6 +9263,7 @@
         "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9337,6 +9282,7 @@
         "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9355,6 +9301,7 @@
         "test_id_prefix": "ninja://gin:gin_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9373,6 +9320,7 @@
         "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9391,6 +9339,7 @@
         "test_id_prefix": "ninja://gpu:gpu_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9409,6 +9358,7 @@
         "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9427,6 +9377,7 @@
         "test_id_prefix": "ninja://headless:headless_browsertests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9445,6 +9396,7 @@
         "test_id_prefix": "ninja://headless:headless_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9465,6 +9417,7 @@
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9483,6 +9436,7 @@
         "test_id_prefix": "ninja://ipc:ipc_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9501,6 +9455,7 @@
         "test_id_prefix": "ninja://ui/latency:latency_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9519,6 +9474,7 @@
         "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9537,6 +9493,7 @@
         "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9555,6 +9512,7 @@
         "test_id_prefix": "ninja://media:media_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9573,6 +9531,7 @@
         "test_id_prefix": "ninja://ui/message_center:message_center_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9591,6 +9550,7 @@
         "test_id_prefix": "ninja://media/midi:midi_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9609,6 +9569,7 @@
         "test_id_prefix": "ninja://mojo:mojo_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9627,6 +9588,7 @@
         "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9645,6 +9607,7 @@
         "test_id_prefix": "ninja://net:net_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9663,6 +9626,7 @@
         "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9681,6 +9645,7 @@
         "test_id_prefix": "ninja://pdf:pdf_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9699,6 +9664,7 @@
         "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9717,6 +9683,7 @@
         "test_id_prefix": "ninja://tools/mac/power:power_sampler_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9735,6 +9702,7 @@
         "test_id_prefix": "ninja://ppapi:ppapi_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9753,6 +9721,7 @@
         "test_id_prefix": "ninja://printing:printing_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9771,6 +9740,7 @@
         "test_id_prefix": "ninja://remoting:remoting_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9789,6 +9759,7 @@
         "test_id_prefix": "ninja://sandbox/mac:sandbox_mac_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9807,6 +9778,7 @@
         "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9825,6 +9797,7 @@
         "test_id_prefix": "ninja://services:services_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9843,6 +9816,7 @@
         "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9861,6 +9835,7 @@
         "test_id_prefix": "ninja://skia:skia_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9879,6 +9854,7 @@
         "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9897,6 +9873,7 @@
         "test_id_prefix": "ninja://sql:sql_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9915,6 +9892,7 @@
         "test_id_prefix": "ninja://storage:storage_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9936,6 +9914,7 @@
         "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9954,6 +9933,7 @@
         "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9972,6 +9952,7 @@
         "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -9995,6 +9976,7 @@
           "--ui-test-action-max-timeout=45000",
           "--ui-test-action-timeout=40000"
         ],
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10013,6 +9995,7 @@
         "test_id_prefix": "ninja://chrome/updater:updater_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10031,6 +10014,7 @@
         "test_id_prefix": "ninja://url:url_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10049,6 +10033,7 @@
         "test_id_prefix": "ninja://ui/views:views_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10067,6 +10052,7 @@
         "test_id_prefix": "ninja://components/viz:viz_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10085,6 +10071,7 @@
         "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10104,6 +10091,7 @@
         "test_id_prefix": "ninja://chrome/test:xr_browser_tests/"
       },
       {
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -10125,6 +10113,7 @@
     "isolated_scripts": [
       {
         "isolate_name": "blink_python_tests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10150,6 +10139,7 @@
           "--num-retries=3"
         ],
         "isolate_name": "blink_web_tests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [
             "--verbose"
@@ -10180,6 +10170,7 @@
           "--test-type=integration"
         ],
         "isolate_name": "chromedriver_py_tests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10202,6 +10193,7 @@
       },
       {
         "isolate_name": "chromedriver_replay_unittests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10224,6 +10216,7 @@
           "--gtest-benchmark-name=components_perftests"
         ],
         "isolate_name": "components_perftests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [
             "--smoke-test-mode"
@@ -10245,6 +10238,7 @@
       },
       {
         "isolate_name": "content_shell_crash_test",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10268,6 +10262,7 @@
       },
       {
         "isolate_name": "flatbuffers_unittests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10291,6 +10286,7 @@
       },
       {
         "isolate_name": "grit_python_unittests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10313,6 +10309,7 @@
       },
       {
         "isolate_name": "mac_signing_tests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10332,6 +10329,7 @@
       },
       {
         "isolate_name": "mojo_python_unittests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10354,6 +10352,7 @@
       },
       {
         "isolate_name": "telemetry_gpu_unittests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10381,6 +10380,7 @@
         ],
         "ci_only": true,
         "isolate_name": "telemetry_perf_unittests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10409,6 +10409,7 @@
           "--extra-browser-args=--disable-gpu"
         ],
         "isolate_name": "telemetry_unittests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -10436,6 +10437,7 @@
           "--gtest-benchmark-name=views_perftests"
         ],
         "isolate_name": "views_perftests",
+        "isolate_profile_data": true,
         "merge": {
           "args": [
             "--smoke-test-mode"
@@ -13963,7 +13965,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -14017,7 +14019,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -14177,7 +14179,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -14231,7 +14233,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -18460,7 +18462,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -18514,7 +18516,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -18568,7 +18570,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -18622,7 +18624,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -19530,7 +19532,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -19584,7 +19586,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -19638,7 +19640,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -19692,7 +19694,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -20907,7 +20909,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -20960,7 +20962,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -21013,7 +21015,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -21066,7 +21068,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 4
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/"
       },
@@ -21432,7 +21434,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -21485,7 +21487,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -21538,7 +21540,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
@@ -21591,7 +21593,7 @@
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 6
         },
         "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/"
       },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index aed0956..5123b04 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -3517,7 +3517,8 @@
               "os": "Ubuntu-18.04"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 5
         },
         "test": "ash_unittests",
         "test_id_prefix": "ninja://ash:ash_unittests/"
@@ -5381,7 +5382,8 @@
               "os": "Ubuntu-16.04"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 5
         },
         "test": "ash_unittests",
         "test_id_prefix": "ninja://ash:ash_unittests/"
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn
index 8907008..ad4d4106 100644
--- a/testing/buildbot/filters/BUILD.gn
+++ b/testing/buildbot/filters/BUILD.gn
@@ -23,7 +23,6 @@
     "//testing/buildbot/filters/android.emulator.cc_unittests.filter",
     "//testing/buildbot/filters/android.emulator_11_12.cc_unittests.filter",
     "//testing/buildbot/filters/fuchsia.debug.cc_unittests.filter",
-    "//testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter",
     "//testing/buildbot/filters/gpu.skiarenderer_dawn_cc_unittests.filter",
   ]
 }
@@ -125,7 +124,6 @@
     "//testing/buildbot/filters/cast-linux.content_browsertests.filter",
     "//testing/buildbot/filters/chromium.webrtc.fyi.android.tests.dbg.content_browsertests.filter",
     "//testing/buildbot/filters/fuchsia.content_browsertests.filter",
-    "//testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter",
     "//testing/buildbot/filters/linux-lacros.content_browsertests.filter",
     "//testing/buildbot/filters/site_isolation_android.content_browsertests.filter",
     "//testing/buildbot/filters/vulkan.content_browsertests.filter",
@@ -373,7 +371,6 @@
     "//testing/buildbot/filters/android.emulator_11.viz_unittests.filter",
     "//testing/buildbot/filters/fuchsia.debug.viz_unittests.filter",
     "//testing/buildbot/filters/fuchsia.viz_unittests.filter",
-    "//testing/buildbot/filters/gpu.linux.skiarenderer_dawn_viz_unittests.filter",
   ]
 }
 
diff --git a/testing/buildbot/filters/android.emulator_11_12.cc_unittests.filter b/testing/buildbot/filters/android.emulator_11_12.cc_unittests.filter
index 904a1f3..2b0e4bde 100644
--- a/testing/buildbot/filters/android.emulator_11_12.cc_unittests.filter
+++ b/testing/buildbot/filters/android.emulator_11_12.cc_unittests.filter
@@ -1,9 +1,7 @@
 # https://crbug.com/1189284
 # Not applicable to emulator due to not supporting VK_KHR_external_memory_fd
--OopImagePixelTest.*
 -OopPixelTest.*
 -P/OopClearPixelTest.*
--P/OopImagePixelTest.*
 -P/OopPathPixelTest.*
 -P/OopTextBlobPixelTest.*
 -TransferCacheTest.Basic
diff --git a/testing/buildbot/filters/fuchsia.debug.cc_unittests.filter b/testing/buildbot/filters/fuchsia.debug.cc_unittests.filter
index 995c1d59..cb102b6 100644
--- a/testing/buildbot/filters/fuchsia.debug.cc_unittests.filter
+++ b/testing/buildbot/filters/fuchsia.debug.cc_unittests.filter
@@ -1,8 +1,6 @@
 # https://crbug.com/1241502
 -All/ImageTransferCacheEntryTest.*
--OopImagePixelTest.*
 -OopPixelTest.*
 -P/OopClearPixelTest.*
--P/OopImagePixelTest.*
 -P/OopPathPixelTest.*
 -P/OopTextBlobPixelTest.*
diff --git a/testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter b/testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter
deleted file mode 100644
index b228c5a..0000000
--- a/testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter
+++ /dev/null
@@ -1,3 +0,0 @@
-# crbug.com/1088479: Partial Raster isn't supported using Skia Dawn Vulkan
--All/LayerTreeHostTilesTestPartialInvalidation.PartialRaster/SkiaDawn_OOP
--All/LayerTreeHostTilesTestPartialInvalidationMultiThread.PartialRaster/SkiaDawn_OOP
diff --git a/testing/buildbot/filters/gpu.linux.skiarenderer_dawn_viz_unittests.filter b/testing/buildbot/filters/gpu.linux.skiarenderer_dawn_viz_unittests.filter
deleted file mode 100644
index 1743a29..0000000
--- a/testing/buildbot/filters/gpu.linux.skiarenderer_dawn_viz_unittests.filter
+++ /dev/null
@@ -1 +0,0 @@
-# TODO(rivr): Remove this file once SkiaRenderer Dawn is more stable.
diff --git a/testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter b/testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter
deleted file mode 100644
index 2f26d5cd..0000000
--- a/testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter
+++ /dev/null
@@ -1,18 +0,0 @@
-# TODO(jonross): Remove once Finch completes.
-
-# Consistent Timeout. https://crbug.com/1116577
--BackForwardCacheBrowserTest.ReplacedNavigationEntry
-
-# Highly Flaky, even without Vulkan https://crbug.com/1134297
--All/DumpAccessibilityTreeTest.Accessibility*
--All/ScrollBehaviorBrowserTest.OverflowScrollInterruptedByWheelScroll/1
-
-# Consistent failures.  https://crbug.com/1164594
--SRC_ExternalClearKey/EncryptedMediaTest.Playback_VideoOnly_WebM_AV1_10bit/0
--MSE_ExternalClearKey/EncryptedMediaTest.Playback_VideoOnly_WebM_AV1_10bit/0
--MSE_ExternalClearKey/EncryptedMediaTest.Playback_VideoOnly_MP4_AV1_10bit/0
-
-# Consistent failures. https://crbug.com/1208515
--FormControlsBrowserTest.Textarea
--FormControlsBrowserTest.Select
--FormControlsBrowserTest.Input
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 89f7f07..322c5968 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -304,6 +304,7 @@
     "type": "console_test_launcher",
   },
   "browser_tests": {
+    # TODO(crbug.com/1293351): remove this.
     "python3": False,
     "label": "//chrome/test:browser_tests",
     "type": "windowed_test_launcher",
@@ -729,7 +730,6 @@
     "type": "console_test_launcher",
   },
   "crashpad_tests": {
-    "python3": False,
     "label": "//third_party/crashpad/crashpad:crashpad_tests",
     "type": "console_test_launcher",
   },
@@ -969,7 +969,6 @@
     "type": "console_test_launcher",
   },
   "headless_browsertests": {
-    "python3": False,
     "label": "//headless:headless_browsertests",
     "type": "console_test_launcher",
   },
@@ -1558,7 +1557,6 @@
     "type": "additional_compile_target",
   },
   "remoting_unittests": {
-    "python3": False,
     "label": "//remoting:remoting_unittests",
     "type": "console_test_launcher",
   },
@@ -1643,7 +1641,6 @@
     "type": "console_test_launcher",
   },
   "services_unittests": {
-    "python3": False,
     "label": "//services:services_unittests",
     "type": "windowed_test_launcher",
   },
@@ -1886,7 +1883,6 @@
     "type": "windowed_test_launcher",
   },
   "unit_tests": {
-    "python3": False,
     "label": "//chrome/test:unit_tests",
     "type": "windowed_test_launcher",
   },
@@ -2151,7 +2147,6 @@
     ],
   },
   "zlib_unittests": {
-    "python3": False,
     "label": "//third_party/zlib:zlib_unittests",
     "type": "console_test_launcher",
   },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 4689c54..bfa3fb8 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2964,8 +2964,6 @@
       # Disabled due to dbus crashes crbug.com/927465
       'Linux FYI Release (Intel HD 630)',
       'Linux FYI Release (NVIDIA)',
-      'Linux FYI SkiaRenderer Vulkan (Intel HD 630)',
-      'Linux FYI SkiaRenderer Vulkan (NVIDIA)',
       'Linux Release (NVIDIA)',
     ],
   },
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 04436b9..9ed502cc 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -2760,36 +2760,6 @@
       },
     },
 
-    'gpu_fyi_vulkan_gtests': {
-      'vulkan_content_browsertests': {
-        'args': [
-          '--enable-gpu',
-          '--test-launcher-bot-mode',
-          '--test-launcher-jobs=1',
-          '--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter',
-          '--enable-features=UseSkiaRenderer,UiGpuRasterization,Vulkan',
-          '--use-vulkan=native',
-          '--enable-gpu-rasterization',
-          '--disable-software-compositing-fallback',
-          '--disable-vulkan-fallback-to-gl-for-testing',
-          '--disable-headless-mode',
-        ],
-        'linux_args': [ '--no-xvfb' ],
-        'test': 'content_browsertests',
-      },
-      'vulkan_tests': {
-        'args': [
-          '--enable-gpu',
-          '--test-launcher-bot-mode',
-          '--test-launcher-jobs=1',
-          '--disable-headless-mode',
-        ],
-        'linux_args': [ '--no-xvfb' ],
-        'test': 'vulkan_tests',
-      },
-
-    },
-
     'gpu_fyi_vulkan_swiftshader_gtests': {
       'vulkan_swiftshader_content_browsertests': {
         'args': [
@@ -3138,189 +3108,6 @@
       },
     },
 
-    'gpu_skia_renderer_dawn_gtests': {
-      'cc_unittests': {
-        'linux_args': [
-          '--no-xvfb',
-          '--test-launcher-filter-file=../../testing/buildbot/filters/gpu.linux.skiarenderer_dawn_cc_unittests.filter',
-        ],
-      },
-      'viz_unittests': {
-        'linux_args': [
-          '--no-xvfb',
-          '--test-launcher-filter-file=../../testing/buildbot/filters/gpu.linux.skiarenderer_dawn_viz_unittests.filter',
-        ],
-      },
-    },
-
-    'gpu_skia_renderer_dawn_telemetry_tests': {
-      'dawn_pixel_skia': {
-        'name': 'dawn_pixel_skia_gold_test',
-        'args': [
-          '--dont-restore-color-profile-after-test',
-          '--test-machine-name',
-          '${buildername}',
-        ],
-        'android_args': [
-          # TODO(crbug.com/1093085): Remove this once we fix the tests.
-          '--extra-browser-args=--force-online-connection-state-for-indicator',
-        ],
-        'win_args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer,SkiaDawn',
-        ],
-        'linux_args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer,UiGpuRasterization,SkiaDawn --enable-gpu-rasterization --use-vulkan=native',
-        ],
-        'mixins': [
-          'chrome-gpu-gold-service-account',
-          'skia_gold_test',
-          'has_native_resultdb_integration',
-        ],
-        'telemetry_test_name': 'pixel',
-      },
-      'screenshot_sync': {
-        'args': [
-          '--dont-restore-color-profile-after-test',
-        ],
-        'android_args': [
-          # TODO(crbug.com/1093085): Remove this once we fix the tests.
-          '--extra-browser-args=--force-online-connection-state-for-indicator',
-        ],
-        'win_args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer,SkiaDawn',
-          # TODO(crbug.com/1021566): Enable the rest of these tests once Canvas
-          # is supported on Skia Dawn.
-          '--test-filter=ScreenshotSync_GPURasterWithDivs::ScreenshotSync_SWRasterWithDivs',
-        ],
-        'linux_args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer,UiGpuRasterization,SkiaDawn --enable-gpu-rasterization --use-vulkan=native',
-          '--test-filter=ScreenshotSync_GPURasterWithDivs',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-    },
-
-    'gpu_skia_renderer_egl_telemetry_tests': {
-      'egl_pixel_skia': {
-        'name': 'egl_pixel_skia_gold_test',
-        'args': [
-          '--dont-restore-color-profile-after-test',
-          '--test-machine-name',
-          '${buildername}',
-          '--extra-browser-args=--enable-features=UseSkiaRenderer --use-gl=egl --enable-gpu-rasterization --disable-software-compositing-fallback --disable-headless-mode',
-        ],
-        'android_args': [
-          # TODO(crbug.com/1093085): Remove this once we fix the tests.
-          '--extra-browser-args=--force-online-connection-state-for-indicator',
-        ],
-        'mixins': [
-          'chrome-gpu-gold-service-account',
-          'skia_gold_test',
-          'has_native_resultdb_integration',
-        ],
-        'telemetry_test_name': 'pixel',
-      },
-    },
-
-    'gpu_skia_renderer_non_vulkan_telemetry_tests': {
-      'context_lost': {
-        'args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-          '$$MAGIC_SUBSTITUTION_GPUIsASANFlag',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'gpu_process': {
-        'name': 'gpu_process_launch_tests',
-        'args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'hardware_accelerated_feature': {
-        'args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'maps': {
-        'name': 'maps_pixel_test',
-        'args': [
-          '--dont-restore-color-profile-after-test',
-          '--test-machine-name',
-          '${buildername}',
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-        ],
-        'android_args': [
-          # TODO(crbug.com/1093085): Remove this once we fix the tests.
-          '--extra-browser-args=--force-online-connection-state-for-indicator',
-        ],
-        'mixins': [
-          'chrome-gpu-gold-service-account',
-          'skia_gold_test',
-          'has_native_resultdb_integration',
-        ],
-      },
-      'screenshot_sync': {
-        'args': [
-          '--dont-restore-color-profile-after-test',
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-        ],
-        'android_args': [
-          # TODO(crbug.com/1093085): Remove this once we fix the tests.
-          '--extra-browser-args=--force-online-connection-state-for-indicator',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'skia_renderer_pixel_skia_gold_test': {
-        'name': 'skia_renderer_pixel_skia_gold_test',
-        'args': [
-          '--dont-restore-color-profile-after-test',
-          '--test-machine-name',
-          '${buildername}',
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-        ],
-        'android_args': [
-          # TODO(crbug.com/1093085): Remove this once we fix the tests.
-          '--extra-browser-args=--force-online-connection-state-for-indicator',
-        ],
-        'mixins': [
-          'chrome-gpu-gold-service-account',
-          'skia_gold_test',
-          'has_native_resultdb_integration',
-        ],
-        'telemetry_test_name': 'pixel',
-      },
-    },
-
-    'gpu_skia_renderer_vulkan_gtests': {
-      'vulkan_content_browsertests': {
-        'args': [
-          '--use-vulkan=native',
-          '--disable-vulkan-fallback-to-gl-for-testing',
-          '--enable-features=UseSkiaRenderer,Vulkan',
-          '--test-launcher-filter-file=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_content_browsertests.filter',
-        ],
-        'swarming': {
-          'shards': 10,
-        },
-        'android_swarming': {
-          'shards': 12,
-        },
-        'test': 'content_browsertests',
-      },
-    },
-
     'gpu_skia_renderer_vulkan_telemetry_tests': {
       'vulkan_pixel_skia': {
         'name': 'vulkan_pixel_skia_gold_test',
@@ -4085,13 +3872,13 @@
     'ios_eg2_cq_tests': {
       'ios_chrome_integration_eg2tests_module': {
         'swarming': {
-          'shards': 3,
+          'shards': 4,
         },
       },
       'ios_chrome_signin_eg2tests_module': {},
       'ios_chrome_ui_eg2tests_module': {
         'swarming': {
-          'shards': 5,
+          'shards': 6,
         },
       },
       'ios_web_shell_eg2tests_module': {},
@@ -4311,7 +4098,11 @@
     'linux_chromeos_specific_gtests': {
       # Chrome OS only.
       'ash_components_unittests': {},
-      'ash_unittests': {},
+      'ash_unittests': {
+        'swarming': {
+          'shards': 5,
+        },
+      },
       'ash_webui_unittests': {},
       'aura_unittests': {},
       'chromeos_components_unittests': {},
@@ -6456,6 +6247,19 @@
       'gpu_webgl_conformance_gl_passthrough_telemetry_tests',
     ],
 
+    # TODO(jonross): remove this once Vulkan Swiftshader and Vulkan GL interop
+    # paths are merged. This should mirror
+    # `gpu_fyi_linux_release_telemetry_tests` but with additional
+    # `gpu_skia_renderer_vulkan_telemetry_tests`
+    'gpu_fyi_linux_release_vulkan_telemetry_tests': [
+      'gpu_common_and_optional_telemetry_tests',
+      'gpu_mediapipe_passthrough_telemetry_tests',
+      'gpu_passthrough_telemetry_tests',
+      'gpu_webgl2_conformance_gl_passthrough_telemetry_tests',
+      'gpu_webgl_conformance_gl_passthrough_telemetry_tests',
+      'gpu_skia_renderer_vulkan_telemetry_tests',
+    ],
+
     'gpu_fyi_mac_debug_gtests': [
       'gpu_angle_unit_gtests',
       'gpu_common_gtests_passthrough',
@@ -6715,11 +6519,6 @@
       'gpu_webgl2_conformance_validating_telemetry_tests',
     ],
 
-    'gpu_skia_renderer_telemetry_tests': [
-      'gpu_skia_renderer_non_vulkan_telemetry_tests',
-      'gpu_skia_renderer_vulkan_telemetry_tests',
-    ],
-
     'gpu_swangle_telemetry_tests': [
       'gpu_webgl_conformance_swangle_passthrough_telemetry_tests',
     ],
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 62d87fd..fb4b442 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -4110,33 +4110,6 @@
                 'android_webview_gpu_telemetry_tests': 'android_webview_gpu_telemetry_tests',
         },
       },
-      'Android FYI SkiaRenderer GL (Nexus 5X)': {
-              'os_type': 'android',
-              'browser_config': 'android-chromium',
-              'skip_merge_script': True,
-              'mixins': [
-                      'has_native_resultdb_integration',
-              'marshmallow',
-              'bullhead',
-              ],
-              'test_suites': {
-                      'gpu_telemetry_tests': 'gpu_skia_renderer_egl_telemetry_tests',
-              }
-      },
-      'Android FYI SkiaRenderer Vulkan (Pixel 2)': {
-              'os_type': 'android',
-              'browser_config': 'android-chromium',
-              'skip_merge_script': True,
-              'mixins': [
-                      'has_native_resultdb_integration',
-              'pie_fleet',
-              'walleye',
-              ],
-              'test_suites': {
-                      'gtest_tests': 'gpu_skia_renderer_vulkan_gtests',
-                      'gpu_telemetry_tests': 'gpu_skia_renderer_vulkan_telemetry_tests',
-              },
-      },
       'ChromeOS FYI Release (amd64-generic)': {
               'additional_compile_targets': [
                       'chromiumos_preflight',
@@ -4283,7 +4256,7 @@
               ],
               'test_suites': {
                       'gtest_tests': 'gpu_fyi_linux_release_gtests',
-                      'gpu_telemetry_tests': 'gpu_fyi_linux_release_telemetry_tests',
+                      'gpu_telemetry_tests': 'gpu_fyi_linux_release_vulkan_telemetry_tests',
               },
       },
       'Linux FYI Release (Intel UHD 630)': {
@@ -4305,40 +4278,7 @@
               ],
               'test_suites': {
                       'gtest_tests': 'gpu_fyi_linux_release_gtests',
-                      'gpu_telemetry_tests': 'gpu_fyi_linux_release_telemetry_tests',
-              },
-      },
-      'Linux FYI SkiaRenderer Dawn Release (Intel HD 630)': {
-              'os_type': 'linux',
-              'browser_config': 'release',
-              'mixins': [
-                      'linux_intel_hd_630_stable',
-              ],
-              'test_suites': {
-                      'gtest_tests': 'gpu_skia_renderer_dawn_gtests',
-                      'gpu_telemetry_tests': 'gpu_skia_renderer_dawn_telemetry_tests',
-              },
-      },
-      'Linux FYI SkiaRenderer Vulkan (Intel HD 630)': {
-              'os_type': 'linux',
-              'browser_config': 'release',
-              'mixins': [
-                      'linux_intel_hd_630_stable',
-              ],
-              'test_suites': {
-                      'gtest_tests': 'gpu_fyi_vulkan_gtests',
-                      'gpu_telemetry_tests': 'gpu_skia_renderer_telemetry_tests',
-              },
-      },
-      'Linux FYI SkiaRenderer Vulkan (NVIDIA)': {
-              'os_type': 'linux',
-              'browser_config': 'release',
-              'mixins': [
-                      'linux_nvidia_gtx_1660_stable',
-              ],
-              'test_suites': {
-                      'gtest_tests': 'gpu_fyi_vulkan_gtests',
-                      'gpu_telemetry_tests': 'gpu_skia_renderer_telemetry_tests',
+                      'gpu_telemetry_tests': 'gpu_fyi_linux_release_vulkan_telemetry_tests',
               },
       },
       'Mac FYI ASAN (Intel)': {
@@ -4723,17 +4663,6 @@
           'isolated_scripts': 'win_specific_xr_perf_tests',
         },
       },
-      'Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)': {
-        'os_type': 'win',
-        'browser_config': 'release_x64',
-        'mixins': [
-          'win10_nvidia_gtx_1660_stable',
-        ],
-        'test_suites': {
-          'gtest_tests': 'gpu_skia_renderer_dawn_gtests',
-          'gpu_telemetry_tests': 'gpu_skia_renderer_dawn_telemetry_tests',
-        },
-      },
       'Win10 FYI x86 Release (NVIDIA)': {
         'browser_config': 'release',
         'os_type': 'win',
@@ -5089,7 +5018,6 @@
       },
       'Mac10.15 Tests': {
         'mixins': [
-            'isolate_profile_data',
             'mac_10.15',
         ],
         'test_suites': {
@@ -5100,6 +5028,7 @@
       'Mac11 Tests': {
         'mixins': [
             'mac_11_x64',
+            'isolate_profile_data',
         ],
         'test_suites': {
           'gtest_tests': 'chromium_mac_gtests_no_nacl',
diff --git a/testing/scripts/finch.gni b/testing/scripts/finch.gni
index b71cc52..e9e1262 100644
--- a/testing/scripts/finch.gni
+++ b/testing/scripts/finch.gni
@@ -26,7 +26,7 @@
 
     data = [
       "//build/android/",
-      "//testing/scripts/variations_smoke_test_data/webview_test_seed",
+      "//testing/scripts/variations_smoke_test_data/",
       "//tools/android/",
     ]
     data_deps = [
diff --git a/testing/scripts/get_compile_targets.py b/testing/scripts/get_compile_targets.py
index 247c66d..76ef48a5 100755
--- a/testing/scripts/get_compile_targets.py
+++ b/testing/scripts/get_compile_targets.py
@@ -33,10 +33,10 @@
                     'PRESUBMIT.py',
                     'sizes_common.py',
                     'variations_seed_access_helper.py',
-                    'variations_http_test_server.py',
                     'wpt_android_lib.py',
                     'wpt_common.py',
                     'wpt_common_unittest.py',
+                    'run_variations_smoke_tests.py',
                     'run_performance_tests_unittest.py'):
       continue
 
diff --git a/testing/scripts/run_variations_smoke_tests.py b/testing/scripts/run_variations_smoke_tests.py
index e60cbe4..cc515e6 100755
--- a/testing/scripts/run_variations_smoke_tests.py
+++ b/testing/scripts/run_variations_smoke_tests.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env vpython
+#!/usr/bin/env vpython3
 # Copyright 2021 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
@@ -7,6 +7,7 @@
 """
 
 import argparse
+import http
 import json
 import logging
 import os
@@ -14,24 +15,17 @@
 import sys
 import tempfile
 import time
-import six.moves.urllib.error
+from functools import partial
+from http.server import SimpleHTTPRequestHandler
 from threading import Thread
 
 import common
-import six
 import variations_seed_access_helper as seed_helper
-from variations_http_test_server import HTTPServer
-from variations_http_test_server import HTTPHandler
-
-if six.PY3:
-  import http
 
 _THIS_DIR = os.path.dirname(os.path.abspath(__file__))
 _SRC_DIR = os.path.join(_THIS_DIR, os.path.pardir, os.path.pardir)
-_WEBDRIVER_PATH = os.path.join(_SRC_DIR, 'third_party', 'webdriver', 'pylib')
 _VARIATIONS_TEST_DATA = 'variations_smoke_test_data'
 
-sys.path.insert(0, _WEBDRIVER_PATH)
 from selenium import webdriver
 from selenium.webdriver import ChromeOptions
 from selenium.common.exceptions import NoSuchElementException
@@ -63,14 +57,10 @@
   port = 8000
   directory = os.path.join(_THIS_DIR, _VARIATIONS_TEST_DATA, "http_server")
   httpd = None
-  if six.PY3:
-    handler = partial(http.server.SimpleHTTPRequestHandler, directory=directory)
-    httpd = http.server.HTTPServer((hostname, port), handler)
-    httpd.timeout = 0.5
-    httpd.allow_reuse_address = True
-    httpd.server_bind()
-  else:
-    httpd = HTTPServer(directory, (hostname, port))
+  handler = partial(SimpleHTTPRequestHandler, directory=directory)
+  httpd = http.server.HTTPServer((hostname, port), handler)
+  httpd.timeout = 0.5
+  httpd.allow_reuse_address = True
   return httpd
 
 
@@ -246,11 +236,7 @@
 
     shutil.rmtree(log_file, ignore_errors=True)
     if driver:
-      try:
-        driver.quit()
-      except six.moves.urllib.error.URLError:
-        # Ignore the error as ChromeDriver may have already exited.
-        pass
+      driver.quit()
 
   return 0
 
@@ -263,14 +249,10 @@
   """
   httpd = _get_httpd()
   thread = None
-  if six.PY3:
-    address = "http://{}:{}".format(httpd.server_name, httpd.server_port)
-    logging.info("%s is used as local http server.", address)
-    thread = Thread(target=httpd.serve_forever)
-    thread.setDaemon(True)
-  else:
-    thread = Thread(target=httpd.serve_forever)
-    thread.daemon = True
+  address = "http://{}:{}".format(httpd.server_name, httpd.server_port)
+  logging.info("%s is used as local http server.", address)
+  thread = Thread(target=httpd.serve_forever)
+  thread.setDaemon(True)
   thread.start()
   return httpd
 
diff --git a/testing/scripts/variations_http_test_server.py b/testing/scripts/variations_http_test_server.py
deleted file mode 100644
index b910688..0000000
--- a/testing/scripts/variations_http_test_server.py
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright 2021 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""A http server implementation based on SimpleHTTPServer or http.server and
-serves content from a base_path.
-"""
-
-import os
-try:
-  # Python 2
-  from SimpleHTTPServer import SimpleHTTPRequestHandler
-  from BaseHTTPServer import HTTPServer as BaseHTTPServer
-except ImportError:
-  # Python 3
-  from http.server import SimpleHTTPRequestHandler
-  from http.server import HTTPServer as BaseHTTPServer
-
-class HTTPHandler(SimpleHTTPRequestHandler):
-  """This handler allows to specify a bath_path. """
-  def translate_path(self, path):
-    """Uses server.base_path to combine full path."""
-    path = SimpleHTTPRequestHandler.translate_path(self, path)
-    real_path = os.path.relpath(path, os.getcwd())
-    return os.path.join(self.server.base_path, real_path)
-
-class HTTPServer(BaseHTTPServer):
-  """The main server, which you couild override base_path."""
-  def __init__(self, base_path, server_address,
-               RequestHandlerClass=HTTPHandler):
-    self.base_path = base_path
-    self.stop = False
-    BaseHTTPServer.__init__(self, server_address, RequestHandlerClass)
-
-  #pylint: disable=unused-argument
-  def serve_forever(self, poll_interval=0.1):
-    self.stop = False
-    while not self.stop:
-      self.handle_request()
-
-  def shutdown(self):
-    self.stop = True
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index abfbbd1..8ba2425c 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -366,6 +366,21 @@
             ]
         }
     ],
+    "ArcGmsCoreLowMemoryKillerProtection": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ArcGmsCoreLowMemoryKillerProtection"
+                    ]
+                }
+            ]
+        }
+    ],
     "ArcGuestZram": [
         {
             "platforms": [
@@ -939,6 +954,27 @@
             ]
         }
     ],
+    "AutofillUpstream": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_20220124",
+                    "enable_features": [
+                        "AutofillUpstream"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillUseAlternativeStateNameMap": [
         {
             "platforms": [
@@ -1726,6 +1762,28 @@
             ]
         }
     ],
+    "CombineResponseBody": [
+        {
+            "platforms": [
+                "android",
+                "android_weblayer",
+                "android_webview",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "CombineResponseBody"
+                    ]
+                }
+            ]
+        }
+    ],
     "CombinedNavigationOptimizations": [
         {
             "platforms": [
@@ -1984,30 +2042,6 @@
             ]
         }
     ],
-    "ContextMenuShopWithGoogleLens": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "EnabledWithTextShopImageWithGoogleLens",
-                    "params": {
-                        "disableOnIncognito": "true",
-                        "logUkm": "true",
-                        "minAgsaVersionNameForShopping": "11.17"
-                    },
-                    "enable_features": [
-                        "ContextMenuEnableLensShoppingAllowlist",
-                        "ContextMenuShopWithGoogleLens"
-                    ],
-                    "disable_features": [
-                        "ContextMenuSearchAndShopWithGoogleLens"
-                    ]
-                }
-            ]
-        }
-    ],
     "CrOSEnforceSystemAecNsAgc": [
         {
             "platforms": [
@@ -2149,6 +2183,28 @@
             ]
         }
     ],
+    "DefaultStyleSheetsEarlyInit": [
+        {
+            "platforms": [
+                "android",
+                "android_weblayer",
+                "android_webview",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_20220201",
+                    "enable_features": [
+                        "DefaultStyleSheetsEarlyInit"
+                    ]
+                }
+            ]
+        }
+    ],
     "DelayFirstParkingOfStrings": [
         {
             "platforms": [
@@ -2705,6 +2761,28 @@
             ]
         }
     ],
+    "EarlyBodyLoad": [
+        {
+            "platforms": [
+                "android",
+                "android_weblayer",
+                "android_webview",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "EarlyBodyLoad"
+                    ]
+                }
+            ]
+        }
+    ],
     "EarlyEstablishGpuChannel": [
         {
             "platforms": [
@@ -3952,6 +4030,21 @@
             ]
         }
     ],
+    "NearbyShareBackgroundScanningPower": [
+        {
+            "platforms": [
+                "chromeos"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "NearbySharingBackgroundScanning"
+                    ]
+                }
+            ]
+        }
+    ],
     "NetworkServiceDedicatedThread": [
         {
             "platforms": [
@@ -5891,6 +5984,31 @@
             ]
         }
     ],
+    "TabAudioMuting": [
+        {
+            "platforms": [
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "params": {
+                        "availability": "any",
+                        "event_trigger": "name:tab_audio_muting_iph_triggered;comparator:==0;window:120;storage:365",
+                        "event_used": "name:ab_audio_muting_toggle_viewed;comparator:==0;window:120;storage:365",
+                        "session_rate": "==0"
+                    },
+                    "enable_features": [
+                        "IPH_TabAudioMuting",
+                        "TabAudioMuting"
+                    ]
+                }
+            ]
+        }
+    ],
     "TabHoverCardImages": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index bea9044..3112279 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -1209,5 +1209,10 @@
 
 const base::Feature kNoForcedFrameUpdatesForWebTests{
     "NoForcedFrameUpdatesForWebTests", base::FEATURE_DISABLED_BY_DEFAULT};
+
+// This flag makes ElementRareData lazily initialize infrequently used fields as
+// another class called ElementSuperRareData to improve memory usage.
+const base::Feature kElementSuperRareData{"ElementSuperRareData",
+                                          base::FEATURE_DISABLED_BY_DEFAULT};
 }  // namespace features
 }  // namespace blink
diff --git a/third_party/blink/manual_tests/bugzilla-48077.html b/third_party/blink/manual_tests/bugzilla-48077.html
deleted file mode 100644
index 67bb1f1..0000000
--- a/third_party/blink/manual_tests/bugzilla-48077.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<html>
-<!--
-This test case is used to prove HTMLParserScheduler should be suspended when page loading is deferred. See https://bugs.webkit.org/show_bug.cgi?id=48077.
-However, this test case can work only when customHTMLTokenizerChunkSize() is equal to or smaller than 256. To reproduce the problem with other settings, try
-adding more tags into body.
-
-To use the test case, open it in browser, when the alert shows up, wait for a few seconds, and close the alert. If it shows "Error detected", that means the problem exists.
--->
-<script>
-var showingAlert = false;
-
-function log(message, replace)
-{
-    if (replace)
-        document.getElementById("result").innerHTML = message;
-    else
-        document.getElementById("result").innerHTML += "<br>" + message;
-}
-
-function showAlert()
-{
-    showingAlert = true;
-    alert("Test");
-    showingAlert = false;
-}
-
-// Insert a script element so the script will be executed when the resource is loaded.
-function insertScript()
-{
-    var head = document.getElementsByTagName("head")[0];
-    var myScript = document.createElement('script');
-    myScript.type = 'text/javascript';
-    myScript.src = 'resources/bugzilla-48077.js';
-    head.appendChild(myScript);
-}
-function check()
-{
-    // Check JS re-entrancy. If showingAlert is true, we are still in showAlert().
-    if (showingAlert)
-        log("Error detected!", false);
-    else
-        log("No error detected.", false);
-}
-
-// Do a time consuming job so we can make HTML parser run over time limit.
-function logTime()
-{
-    // time consuming job;
-    var startTime = new Date();
-    do {
-        var currentTime = new Date();
-        log(currentTime, true);
-    } while (currentTime - startTime < 1000);
-}
-</script>
-<body>
-<p id="result"></p>
-
-<script>
-insertScript();
-</script>
-
-<!-- Time consuming job to make HTML parser run over chunk time limit -->
-<script>
-logTime();
-</script>
-
-<!-- Lots of tags to make HTML parser run over chunk size limit -->
-<a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a>
-
-<!-- Time consuming job to make HTML parser run over chunk time limit -->
-<script>
-logTime();
-</script>
-
-<!-- Lots of tags to make HTML parser run over chunk size limit -->
-<a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a><a>1</a>
-
-
-<script>
-check();
-</script>
-
-
-
-</body>
-</html>
\ No newline at end of file
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index ef945b4..e120bfb 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -605,6 +605,8 @@
 // Disables forced frame updates for web tests. Used by web test runner only.
 BLINK_COMMON_EXPORT extern const base::Feature kNoForcedFrameUpdatesForWebTests;
 
+BLINK_COMMON_EXPORT extern const base::Feature kElementSuperRareData;
+
 }  // namespace features
 }  // namespace blink
 
diff --git a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
index adf72bd..ac4372e 100644
--- a/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
+++ b/third_party/blink/public/mojom/interest_group/interest_group_types.mojom
@@ -93,4 +93,8 @@
 
   // Other parameters are grouped in a struct that is passed to SellerWorklets.
   AuctionAdConfigNonSharedParams auction_ad_config_non_shared_params;
+
+  // Nested auctions whose results will also be fed to `seller`. Only the top
+  // level auction config can have component auctions.
+  array<AuctionAdConfig> component_auctions;
 };
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 496df724..82be283 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -3477,6 +3477,7 @@
   kV8UDPSocket_RemoteAddress_AttributeGetter = 4156,
   kV8UDPSocket_RemotePort_AttributeGetter = 4157,
   kV8UDPSocket_Writable_AttributeGetter = 4158,
+  kAbortSignalTimeout = 4159,
 
   // 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/public/platform/web_url_loader_mock_factory.h b/third_party/blink/public/platform/web_url_loader_mock_factory.h
index 7650a4c..3c42b2c4 100644
--- a/third_party/blink/public/platform/web_url_loader_mock_factory.h
+++ b/third_party/blink/public/platform/web_url_loader_mock_factory.h
@@ -65,8 +65,7 @@
   // Causes all pending asynchronous requests to be served. When this method
   // returns all the pending requests have been processed.
   // Note: this may not work as expected if more requests could be made
-  // asynchronously from different threads (e.g. when HTML parser thread
-  // is being involved).
+  // asynchronously from different threads.
   // DO NOT USE THIS for Frame loading; always use methods defined in
   // frame_test_helpers instead.
   virtual void ServeAsynchronousRequests() = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc
index b6caf985..f60a4719 100644
--- a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc
+++ b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.cc
@@ -90,6 +90,15 @@
                                             IgnorePause::kIgnore);
 }
 
+void ExceptionToRejectPromiseScope::ConvertExceptionToRejectPromise() {
+  // As exceptions must always be created in the current realm, reject
+  // promises must also be created in the current realm while regular promises
+  // are created in the relevant realm of the context object.
+  ScriptState* script_state = ScriptState::ForCurrentRealm(info_);
+  V8SetReturnValue(
+      info_, ScriptPromise::Reject(script_state, exception_state_).V8Value());
+}
+
 namespace bindings {
 
 void SetupIDLInterfaceTemplate(
diff --git a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
index 41eaf7f..82cdb11 100644
--- a/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
+++ b/third_party/blink/renderer/bindings/core/v8/generated_code_helper.h
@@ -16,7 +16,6 @@
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/bindings/v8_binding.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -45,15 +44,12 @@
     if (LIKELY(!exception_state_.HadException()))
       return;
 
-    // As exceptions must always be created in the current realm, reject
-    // promises must also be created in the current realm while regular promises
-    // are created in the relevant realm of the context object.
-    ScriptState* script_state = ScriptState::ForCurrentRealm(info_);
-    V8SetReturnValue(
-        info_, ScriptPromise::Reject(script_state, exception_state_).V8Value());
+    ConvertExceptionToRejectPromise();
   }
 
  private:
+  void ConvertExceptionToRejectPromise();
+
   const v8::FunctionCallbackInfo<v8::Value>& info_;
   ExceptionState& exception_state_;
 };
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.cc b/third_party/blink/renderer/core/document_transition/document_transition.cc
index f9c8b3d..bab7a5d 100644
--- a/third_party/blink/renderer/core/document_transition/document_transition.cc
+++ b/third_party/blink/renderer/core/document_transition/document_transition.cc
@@ -116,14 +116,7 @@
     start_promise_resolver_->Detach();
     start_promise_resolver_ = nullptr;
   }
-  if (style_tracker_) {
-    style_tracker_->Abort();
-    style_tracker_ = nullptr;
-  }
-  state_ = State::kIdle;
-  active_shared_elements_.clear();
-  signal_ = nullptr;
-  StopDeferringCommits();
+  ResetState();
 }
 
 bool DocumentTransition::HasPendingActivity() const {
@@ -137,9 +130,8 @@
     const DocumentTransitionPrepareOptions* options,
     ExceptionState& exception_state) {
   // Reject any previous prepare promises.
-  if (state_ == State::kPreparing || state_ == State::kPrepared) {
+  if (state_ == State::kPreparing || state_ == State::kPrepared)
     CancelPendingTransition(kAbortedFromPrepare);
-  }
 
   // Get the sequence id before any early outs so we will correctly process
   // callbacks from previous requests.
@@ -277,6 +269,7 @@
 
   signal_ = nullptr;
   StopDeferringCommits();
+
   if (options->hasSharedElements())
     SetActiveSharedElements(options->sharedElements());
 
@@ -292,11 +285,7 @@
 
     // TODO(khushalsagar) : Viz keeps copy results cached for 5 seconds at this
     // point. We should send an early release. See crbug.com/1266500.
-    SetActiveSharedElements({});
-    if (!RuntimeEnabledFeatures::DocumentTransitionVizEnabled()) {
-      style_tracker_->Abort();
-      style_tracker_ = nullptr;
-    }
+    ResetState();
     return ScriptPromise();
   }
 
@@ -374,15 +363,12 @@
   if (disable_end_transition_)
     return;
 
-  state_ = State::kIdle;
-  SetActiveSharedElements({});
-
   if (!RuntimeEnabledFeatures::DocumentTransitionVizEnabled()) {
     style_tracker_->StartFinished();
-    style_tracker_ = nullptr;
     pending_request_ = DocumentTransitionRequest::CreateRelease(document_tag_);
     NotifyHasChangesToCommit();
   }
+  ResetState(/*abort_style_tracker=*/false);
 }
 
 std::unique_ptr<DocumentTransitionRequest>
@@ -595,7 +581,7 @@
   TRACE_EVENT_NESTABLE_ASYNC_END0("blink",
                                   "DocumentTransition::DeferringCommits", this);
   deferring_commits_ = false;
-  if (!document_->GetPage())
+  if (!document_ || !document_->GetPage())
     return;
 
   document_->GetPage()->GetChromeClient().StopDeferringCommits(
@@ -613,11 +599,14 @@
     prepare_promise_resolver_ = nullptr;
   }
 
+  ResetState();
+}
+
+void DocumentTransition::ResetState(bool abort_style_tracker) {
   SetActiveSharedElements({});
-  if (style_tracker_) {
+  if (style_tracker_ && abort_style_tracker)
     style_tracker_->Abort();
-    style_tracker_ = nullptr;
-  }
+  style_tracker_ = nullptr;
   StopDeferringCommits();
   state_ = State::kIdle;
   signal_ = nullptr;
diff --git a/third_party/blink/renderer/core/document_transition/document_transition.h b/third_party/blink/renderer/core/document_transition/document_transition.h
index be752c7..400452c 100644
--- a/third_party/blink/renderer/core/document_transition/document_transition.h
+++ b/third_party/blink/renderer/core/document_transition/document_transition.h
@@ -131,6 +131,10 @@
 
   void Abort(AbortSignal* signal);
 
+  // Resets internal state, called in both abort situations and transition
+  // finished situations.
+  void ResetState(bool abort_style_tracker = true);
+
   Member<Document> document_;
 
   State state_ = State::kIdle;
diff --git a/third_party/blink/renderer/core/dom/abort_signal.cc b/third_party/blink/renderer/core/dom/abort_signal.cc
index 4bd989e0..424e5e5 100644
--- a/third_party/blink/renderer/core/dom/abort_signal.cc
+++ b/third_party/blink/renderer/core/dom/abort_signal.cc
@@ -7,6 +7,8 @@
 #include <utility>
 
 #include "base/callback.h"
+#include "base/time/time.h"
+#include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/event_target_names.h"
@@ -77,6 +79,7 @@
   return abort(script_state, reason);
 }
 
+// static
 AbortSignal* AbortSignal::abort(ScriptState* script_state, ScriptValue reason) {
   DCHECK(!reason.IsEmpty());
   AbortSignal* signal =
@@ -85,6 +88,41 @@
   return signal;
 }
 
+// static
+AbortSignal* AbortSignal::timeout(ScriptState* script_state,
+                                  uint64_t milliseconds) {
+  ExecutionContext* context = ExecutionContext::From(script_state);
+  AbortSignal* signal = MakeGarbageCollected<AbortSignal>(context);
+  // The spec requires us to use the timer task source, but there are a few
+  // timer task sources due to our throttling implementation. We match
+  // setTimeout for immediate timeouts, but use the high-nesting task type for
+  // all positive timeouts so they are eligible for throttling (i.e. no
+  // nesting-level exception).
+  TaskType task_type = milliseconds == 0
+                           ? TaskType::kJavascriptTimerImmediate
+                           : TaskType::kJavascriptTimerDelayedHighNesting;
+  // `signal` needs to be held with a strong reference to keep it alive in case
+  // there are or will be event handlers attached.
+  context->GetTaskRunner(task_type)->PostDelayedTask(
+      FROM_HERE,
+      WTF::Bind(&AbortSignal::AbortTimeoutFired, WrapPersistent(signal),
+                WrapPersistent(script_state)),
+      base::Milliseconds(milliseconds));
+  return signal;
+}
+
+void AbortSignal::AbortTimeoutFired(ScriptState* script_state) {
+  if (GetExecutionContext()->IsContextDestroyed() ||
+      !script_state->ContextIsValid()) {
+    return;
+  }
+  ScriptState::Scope scope(script_state);
+  auto* isolate = script_state->GetIsolate();
+  v8::Local<v8::Value> reason = V8ThrowDOMException::CreateOrEmpty(
+      isolate, DOMExceptionCode::kTimeoutError, "signal timed out");
+  SignalAbort(script_state, ScriptValue(isolate, reason));
+}
+
 ScriptValue AbortSignal::reason(ScriptState* script_state) const {
   DCHECK(script_state->GetIsolate()->InContext());
   if (abort_reason_.IsEmpty()) {
diff --git a/third_party/blink/renderer/core/dom/abort_signal.h b/third_party/blink/renderer/core/dom/abort_signal.h
index 1573d148..edb5da5 100644
--- a/third_party/blink/renderer/core/dom/abort_signal.h
+++ b/third_party/blink/renderer/core/dom/abort_signal.h
@@ -44,6 +44,7 @@
   // abort_signal.idl
   static AbortSignal* abort(ScriptState*);
   static AbortSignal* abort(ScriptState*, ScriptValue reason);
+  static AbortSignal* timeout(ScriptState*, uint64_t milliseconds);
   ScriptValue reason(ScriptState*) const;
   bool aborted() const { return !abort_reason_.IsEmpty(); }
   void throwIfAborted(ScriptState*, ExceptionState&) const;
@@ -88,6 +89,8 @@
   void Trace(Visitor*) const override;
 
  private:
+  void AbortTimeoutFired(ScriptState*);
+
   // https://dom.spec.whatwg.org/#abortsignal-abort-reason
   // There is one difference from the spec. The value is empty instead of
   // undefined when this signal is not aborted. This is because
diff --git a/third_party/blink/renderer/core/dom/abort_signal.idl b/third_party/blink/renderer/core/dom/abort_signal.idl
index 022d8c07..fa50f590 100644
--- a/third_party/blink/renderer/core/dom/abort_signal.idl
+++ b/third_party/blink/renderer/core/dom/abort_signal.idl
@@ -12,6 +12,12 @@
         Measure,
         NewObject
     ] static AbortSignal abort(optional any reason);
+    [
+        CallWith=ScriptState,
+        MeasureAs=AbortSignalTimeout,
+        NewObject,
+        RuntimeEnabled=AbortSignalTimeout
+    ] static AbortSignal timeout([EnforceRange] unsigned long long milliseconds);
 
     readonly attribute boolean aborted;
     [CallWith=ScriptState] readonly attribute any reason;
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 1513011..8b708fd 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -583,7 +583,7 @@
 
 uint64_t Document::global_tree_version_ = 0;
 
-static bool g_threaded_parsing_enabled_for_testing = true;
+static bool g_force_synchronous_parsing_for_testing = false;
 
 void IntrinsicSizeResizeObserverDelegate::OnResize(
     const HeapVector<Member<ResizeObserverEntry>>& entries) {
@@ -756,10 +756,7 @@
           this,
           &Document::DidAssociateFormControlsTimerFired),
       has_viewport_units_(false),
-      parser_sync_policy_(
-          RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled()
-              ? kAllowDeferredParsing
-              : kAllowAsynchronousParsing),
+      parser_sync_policy_(kAllowDeferredParsing),
       node_count_(0),
       // Use the source id from the document initializer if it is available.
       // Otherwise, generate a new source id to cover any cases that don't
@@ -3231,10 +3228,9 @@
 
   SetCompatibilityMode(kNoQuirksMode);
 
-  if (!ThreadedParsingEnabledForTesting()) {
+  if (ForceSynchronousParsingForTesting()) {
     parser_sync_policy = kForceSynchronousParsing;
-  } else if (parser_sync_policy != kForceSynchronousParsing &&
-             IsPrefetchOnly()) {
+  } else if (IsPrefetchOnly()) {
     // Prefetch must be synchronous.
     parser_sync_policy = kForceSynchronousParsing;
   }
@@ -7267,12 +7263,12 @@
   AdjustForAbsoluteZoom::AdjustRectF(rect, layout_object);
 }
 
-void Document::SetThreadedParsingEnabledForTesting(bool enabled) {
-  g_threaded_parsing_enabled_for_testing = enabled;
+void Document::SetForceSynchronousParsingForTesting(bool enabled) {
+  g_force_synchronous_parsing_for_testing = enabled;
 }
 
-bool Document::ThreadedParsingEnabledForTesting() {
-  return g_threaded_parsing_enabled_for_testing;
+bool Document::ForceSynchronousParsingForTesting() {
+  return g_force_synchronous_parsing_for_testing;
 }
 
 SnapCoordinator& Document::GetSnapCoordinator() {
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index c832bf7..f830883 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -1503,10 +1503,10 @@
 
   CanvasFontCache* GetCanvasFontCache();
 
-  // Used by unit tests so that all parsing will be main thread for
+  // Used by unit tests so that all parsing will be synchronous for
   // controlling parsing and chunking precisely.
-  static void SetThreadedParsingEnabledForTesting(bool);
-  static bool ThreadedParsingEnabledForTesting();
+  static void SetForceSynchronousParsingForTesting(bool);
+  static bool ForceSynchronousParsingForTesting();
 
   void IncrementNodeCount() { node_count_++; }
   void DecrementNodeCount() {
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.cc b/third_party/blink/renderer/core/dom/element_rare_data.cc
index 6940127..fc2b0039 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data.cc
+++ b/third_party/blink/renderer/core/dom/element_rare_data.cc
@@ -43,9 +43,8 @@
 namespace blink {
 
 struct SameSizeAsElementRareData : NodeRareData {
-  gfx::Vector2dF scroll_offset;
-  void* pointers_or_strings[4];
-  Member<void*> members[19];
+  Member<void*> members[10];
+  float scroll_offset[2];
   bool flags[1];
 };
 
@@ -56,7 +55,13 @@
       should_force_legacy_layout_for_child_(false),
       style_should_force_legacy_layout_(false),
       has_undo_stack_(false),
-      scrollbar_pseudo_element_styles_depend_on_font_metrics_(false) {}
+      scrollbar_pseudo_element_styles_depend_on_font_metrics_(false) {
+  // When The ElementSuperRareData flag is disabled, then always initialize
+  // ElementSuperRareData immediately in order to measure the memory usage
+  // improvements.
+  if (!RuntimeEnabledFeatures::ElementSuperRareDataEnabled())
+    super_rare_data_ = MakeGarbageCollected<ElementSuperRareData>();
+}
 
 ElementRareData::~ElementRareData() {
   DCHECK(!pseudo_element_data_);
@@ -71,7 +76,7 @@
   return *cssom_wrapper_;
 }
 
-InlineStylePropertyMap& ElementRareData::EnsureInlineStylePropertyMap(
+InlineStylePropertyMap& ElementSuperRareData::EnsureInlineStylePropertyMap(
     Element* owner_element) {
   if (!cssom_map_wrapper_) {
     cssom_map_wrapper_ =
@@ -79,6 +84,10 @@
   }
   return *cssom_map_wrapper_;
 }
+InlineStylePropertyMap& ElementRareData::EnsureInlineStylePropertyMap(
+    Element* owner_element) {
+  return EnsureSuperRareData().EnsureInlineStylePropertyMap(owner_element);
+}
 
 AttrNodeList& ElementRareData::EnsureAttrNodeList() {
   if (!attr_node_list_)
@@ -86,8 +95,8 @@
   return *attr_node_list_;
 }
 
-ElementRareData::ResizeObserverDataMap&
-ElementRareData::EnsureResizeObserverData() {
+ElementSuperRareData::ResizeObserverDataMap&
+ElementSuperRareData::EnsureResizeObserverData() {
   if (!resize_observer_data_) {
     resize_observer_data_ = MakeGarbageCollected<
         HeapHashMap<Member<ResizeObserver>, Member<ResizeObservation>>>();
@@ -95,7 +104,13 @@
   return *resize_observer_data_;
 }
 
-ElementInternals& ElementRareData::EnsureElementInternals(HTMLElement& target) {
+ElementRareData::ResizeObserverDataMap&
+ElementRareData::EnsureResizeObserverData() {
+  return EnsureSuperRareData().EnsureResizeObserverData();
+}
+
+ElementInternals& ElementSuperRareData::EnsureElementInternals(
+    HTMLElement& target) {
   if (element_internals_)
     return *element_internals_;
   element_internals_ = MakeGarbageCollected<ElementInternals>(target);
@@ -103,26 +118,30 @@
 }
 
 void ElementRareData::TraceAfterDispatch(blink::Visitor* visitor) const {
+  visitor->Trace(super_rare_data_);
   visitor->Trace(dataset_);
-  visitor->Trace(class_list_);
-  visitor->Trace(part_);
   visitor->Trace(shadow_root_);
-  visitor->Trace(edit_context_);
+  visitor->Trace(class_list_);
   visitor->Trace(attribute_map_);
   visitor->Trace(attr_node_list_);
-  visitor->Trace(element_animations_);
-  visitor->Trace(last_intrinsic_size_);
   visitor->Trace(cssom_wrapper_);
-  visitor->Trace(cssom_map_wrapper_);
+  visitor->Trace(element_animations_);
+  visitor->Trace(intersection_observer_data_);
   visitor->Trace(pseudo_element_data_);
+  NodeRareData::TraceAfterDispatch(visitor);
+}
+
+void ElementSuperRareData::Trace(blink::Visitor* visitor) const {
+  visitor->Trace(edit_context_);
+  visitor->Trace(part_);
+  visitor->Trace(cssom_map_wrapper_);
+  visitor->Trace(element_internals_);
   visitor->Trace(accessible_node_);
   visitor->Trace(display_lock_context_);
-  visitor->Trace(custom_element_definition_);
-  visitor->Trace(element_internals_);
-  visitor->Trace(intersection_observer_data_);
-  visitor->Trace(resize_observer_data_);
   visitor->Trace(container_query_data_);
-  NodeRareData::TraceAfterDispatch(visitor);
+  visitor->Trace(resize_observer_data_);
+  visitor->Trace(custom_element_definition_);
+  visitor->Trace(last_intrinsic_size_);
 }
 
 ASSERT_SIZE(ElementRareData, SameSizeAsElementRareData);
diff --git a/third_party/blink/renderer/core/dom/element_rare_data.h b/third_party/blink/renderer/core/dom/element_rare_data.h
index b2aa73f..aa9ef90 100644
--- a/third_party/blink/renderer/core/dom/element_rare_data.h
+++ b/third_party/blink/renderer/core/dom/element_rare_data.h
@@ -54,6 +54,125 @@
 class ResizeObservation;
 class ResizeObserver;
 
+// This class contains rare data which is significantly more rare than the data
+// in ElementRareData. They are split up to improve memory usage.
+class ElementSuperRareData : public GarbageCollected<ElementSuperRareData> {
+ public:
+  const AtomicString& GetNonce() const { return nonce_; }
+  void SetNonce(const AtomicString& nonce) { nonce_ = nonce; }
+
+  EditContext* GetEditContext() const { return edit_context_.Get(); }
+  void SetEditContext(EditContext* edit_context) {
+    edit_context_ = edit_context;
+  }
+
+  void SetPart(DOMTokenList* part) { part_ = part; }
+  DOMTokenList* GetPart() const { return part_.Get(); }
+
+  void SetPartNamesMap(const AtomicString part_names) {
+    if (!part_names_map_) {
+      part_names_map_ = std::make_unique<NamesMap>();
+    }
+    part_names_map_->Set(part_names);
+  }
+  const NamesMap* PartNamesMap() const { return part_names_map_.get(); }
+
+  InlineStylePropertyMap& EnsureInlineStylePropertyMap(Element* owner_element);
+  InlineStylePropertyMap* GetInlineStylePropertyMap() {
+    return cssom_map_wrapper_.Get();
+  }
+
+  ElementInternals& EnsureElementInternals(HTMLElement& target);
+  const ElementInternals* GetElementInternals() const {
+    return element_internals_;
+  }
+
+  AccessibleNode* GetAccessibleNode() const { return accessible_node_.Get(); }
+  AccessibleNode* EnsureAccessibleNode(Element* owner_element) {
+    if (!accessible_node_) {
+      accessible_node_ = MakeGarbageCollected<AccessibleNode>(owner_element);
+    }
+    return accessible_node_;
+  }
+
+  DisplayLockContext* EnsureDisplayLockContext(Element* element) {
+    if (!display_lock_context_) {
+      display_lock_context_ = MakeGarbageCollected<DisplayLockContext>(element);
+    }
+    return display_lock_context_.Get();
+  }
+  DisplayLockContext* GetDisplayLockContext() const {
+    return display_lock_context_;
+  }
+
+  ContainerQueryData& EnsureContainerQueryData() {
+    DCHECK(RuntimeEnabledFeatures::CSSContainerQueriesEnabled());
+    if (!container_query_data_)
+      container_query_data_ = MakeGarbageCollected<ContainerQueryData>();
+    return *container_query_data_;
+  }
+  ContainerQueryData* GetContainerQueryData() const {
+    return container_query_data_;
+  }
+
+  // Returns the crop-ID if one was set, or nullptr otherwise.
+  const RegionCaptureCropId* GetRegionCaptureCropId() const {
+    return region_capture_crop_id_.get();
+  }
+
+  // Sets a crop-ID on the item. Must be called at most once. Cannot be used
+  // to unset a previously set crop-ID.
+  void SetRegionCaptureCropId(std::unique_ptr<RegionCaptureCropId> crop_id) {
+    DCHECK(!GetRegionCaptureCropId());
+    DCHECK(crop_id);
+    DCHECK(!crop_id->value().is_zero());
+    region_capture_crop_id_ = std::move(crop_id);
+  }
+
+  using ResizeObserverDataMap =
+      HeapHashMap<Member<ResizeObserver>, Member<ResizeObservation>>;
+
+  ResizeObserverDataMap* ResizeObserverData() const {
+    return resize_observer_data_;
+  }
+  ResizeObserverDataMap& EnsureResizeObserverData();
+
+  void SetCustomElementDefinition(CustomElementDefinition* definition) {
+    custom_element_definition_ = definition;
+  }
+  CustomElementDefinition* GetCustomElementDefinition() const {
+    return custom_element_definition_.Get();
+  }
+
+  void SetIsValue(const AtomicString& is_value) { is_value_ = is_value; }
+  const AtomicString& IsValue() const { return is_value_; }
+
+  void SaveLastIntrinsicSize(ResizeObserverSize* size) {
+    last_intrinsic_size_ = size;
+  }
+  const ResizeObserverSize* LastIntrinsicSize() const {
+    return last_intrinsic_size_;
+  }
+
+  void Trace(blink::Visitor*) const;
+
+ private:
+  AtomicString nonce_;
+  Member<EditContext> edit_context_;
+  Member<DOMTokenList> part_;
+  std::unique_ptr<NamesMap> part_names_map_;
+  Member<InlineStylePropertyMap> cssom_map_wrapper_;
+  Member<ElementInternals> element_internals_;
+  Member<AccessibleNode> accessible_node_;
+  Member<DisplayLockContext> display_lock_context_;
+  Member<ContainerQueryData> container_query_data_;
+  std::unique_ptr<RegionCaptureCropId> region_capture_crop_id_;
+  Member<ResizeObserverDataMap> resize_observer_data_;
+  Member<CustomElementDefinition> custom_element_definition_;
+  AtomicString is_value_;
+  Member<ResizeObserverSize> last_intrinsic_size_;
+};
+
 class ElementRareData final : public NodeRareData {
  public:
   explicit ElementRareData(NodeRenderingData*);
@@ -80,7 +199,9 @@
   InlineStylePropertyMap& EnsureInlineStylePropertyMap(Element* owner_element);
 
   InlineStylePropertyMap* GetInlineStylePropertyMap() {
-    return cssom_map_wrapper_.Get();
+    if (super_rare_data_)
+      return super_rare_data_->GetInlineStylePropertyMap();
+    return nullptr;
   }
 
   ShadowRoot* GetShadowRoot() const { return shadow_root_.Get(); }
@@ -89,9 +210,13 @@
     shadow_root_ = &shadow_root;
   }
 
-  EditContext* GetEditContext() const { return edit_context_.Get(); }
+  EditContext* GetEditContext() const {
+    if (super_rare_data_)
+      return super_rare_data_->GetEditContext();
+    return nullptr;
+  }
   void SetEditContext(EditContext* edit_context) {
-    edit_context_ = edit_context;
+    EnsureSuperRareData().SetEditContext(edit_context);
   }
 
   NamedNodeMap* AttributeMap() const { return attribute_map_.Get(); }
@@ -104,18 +229,21 @@
     class_list_ = class_list;
   }
 
-  void SetPart(DOMTokenList* part) {
-    part_ = part;
+  void SetPart(DOMTokenList* part) { EnsureSuperRareData().SetPart(part); }
+  DOMTokenList* GetPart() const {
+    if (super_rare_data_)
+      return super_rare_data_->GetPart();
+    return nullptr;
   }
-  DOMTokenList* GetPart() const { return part_.Get(); }
 
-  void SetPartNamesMap(const AtomicString part_names) {
-    if (!part_names_map_) {
-      part_names_map_.reset(new NamesMap());
-    }
-    part_names_map_->Set(part_names);
+  const NamesMap* PartNamesMap() const {
+    if (super_rare_data_)
+      return super_rare_data_->PartNamesMap();
+    return nullptr;
   }
-  const NamesMap* PartNamesMap() const { return part_names_map_.get(); }
+  void SetPartNamesMap(const AtomicString part_names) {
+    EnsureSuperRareData().SetPartNamesMap(part_names);
+  }
 
   DatasetDOMStringMap* Dataset() const { return dataset_.Get(); }
   void SetDataset(DatasetDOMStringMap* dataset) {
@@ -140,32 +268,39 @@
   void ClearPseudoElements();
 
   void SetCustomElementDefinition(CustomElementDefinition* definition) {
-    custom_element_definition_ = definition;
+    EnsureSuperRareData().SetCustomElementDefinition(definition);
   }
   CustomElementDefinition* GetCustomElementDefinition() const {
-    return custom_element_definition_.Get();
+    if (super_rare_data_)
+      return super_rare_data_->GetCustomElementDefinition();
+    return nullptr;
   }
-  void SetIsValue(const AtomicString& is_value) { is_value_ = is_value; }
-  const AtomicString& IsValue() const { return is_value_; }
+  void SetIsValue(const AtomicString& is_value) {
+    EnsureSuperRareData().SetIsValue(is_value);
+  }
+  const AtomicString& IsValue() const {
+    if (super_rare_data_)
+      return super_rare_data_->IsValue();
+    return g_null_atom;
+  }
   void SetDidAttachInternals() { did_attach_internals_ = true; }
   bool DidAttachInternals() const { return did_attach_internals_; }
-  ElementInternals& EnsureElementInternals(HTMLElement& target);
+  ElementInternals& EnsureElementInternals(HTMLElement& target) {
+    return EnsureSuperRareData().EnsureElementInternals(target);
+  }
   const ElementInternals* GetElementInternals() const {
-    return element_internals_;
+    if (super_rare_data_)
+      return super_rare_data_->GetElementInternals();
+    return nullptr;
   }
 
-  // Returns the crop-ID if one was set, or nullptr otherwise.
   const RegionCaptureCropId* GetRegionCaptureCropId() const {
-    return region_capture_crop_id_.get();
+    if (super_rare_data_)
+      return super_rare_data_->GetRegionCaptureCropId();
+    return nullptr;
   }
-
-  // Sets a crop-ID on the item. Must be called at most once. Cannot be used
-  // to unset a previously set crop-ID.
-  void SetRegionCaptureCropId(std::unique_ptr<RegionCaptureCropId> crop_id) {
-    DCHECK(!GetRegionCaptureCropId());
-    DCHECK(crop_id);
-    DCHECK(!crop_id->value().is_zero());
-    region_capture_crop_id_ = std::move(crop_id);
+  void SetRegionCaptureCropId(std::unique_ptr<RegionCaptureCropId> value) {
+    EnsureSuperRareData().SetRegionCaptureCropId(std::move(value));
   }
 
   void SetStyleShouldForceLegacyLayout(bool force) {
@@ -189,12 +324,13 @@
     scrollbar_pseudo_element_styles_depend_on_font_metrics_ = value;
   }
 
-  AccessibleNode* GetAccessibleNode() const { return accessible_node_.Get(); }
+  AccessibleNode* GetAccessibleNode() const {
+    if (super_rare_data_)
+      return super_rare_data_->GetAccessibleNode();
+    return nullptr;
+  }
   AccessibleNode* EnsureAccessibleNode(Element* owner_element) {
-    if (!accessible_node_) {
-      accessible_node_ = MakeGarbageCollected<AccessibleNode>(owner_element);
-    }
-    return accessible_node_;
+    return EnsureSuperRareData().EnsureAccessibleNode(owner_element);
   }
 
   AttrNodeList& EnsureAttrNodeList();
@@ -219,86 +355,86 @@
       HeapHashMap<Member<ResizeObserver>, Member<ResizeObservation>>;
 
   ResizeObserverDataMap* ResizeObserverData() const {
-    return resize_observer_data_;
+    if (super_rare_data_)
+      return super_rare_data_->ResizeObserverData();
+    return nullptr;
   }
   ResizeObserverDataMap& EnsureResizeObserverData();
 
   DisplayLockContext* EnsureDisplayLockContext(Element* element) {
-    if (!display_lock_context_) {
-      display_lock_context_ = MakeGarbageCollected<DisplayLockContext>(element);
-    }
-    return display_lock_context_.Get();
+    return EnsureSuperRareData().EnsureDisplayLockContext(element);
   }
   DisplayLockContext* GetDisplayLockContext() const {
-    return display_lock_context_;
+    if (super_rare_data_)
+      return super_rare_data_->GetDisplayLockContext();
+    return nullptr;
   }
 
   ContainerQueryData& EnsureContainerQueryData() {
-    DCHECK(RuntimeEnabledFeatures::CSSContainerQueriesEnabled());
-    if (!container_query_data_)
-      container_query_data_ = MakeGarbageCollected<ContainerQueryData>();
-    return *container_query_data_;
+    return EnsureSuperRareData().EnsureContainerQueryData();
   }
   ContainerQueryData* GetContainerQueryData() const {
-    return container_query_data_;
+    if (super_rare_data_)
+      return super_rare_data_->GetContainerQueryData();
+    return nullptr;
   }
 
   ContainerQueryEvaluator* GetContainerQueryEvaluator() const {
-    if (!container_query_data_)
+    ContainerQueryData* container_query_data = GetContainerQueryData();
+    if (!container_query_data)
       return nullptr;
-    return container_query_data_->GetContainerQueryEvaluator();
+    return container_query_data->GetContainerQueryEvaluator();
   }
   void SetContainerQueryEvaluator(ContainerQueryEvaluator* evaluator) {
-    if (container_query_data_)
-      container_query_data_->SetContainerQueryEvaluator(evaluator);
+    ContainerQueryData* container_query_data = GetContainerQueryData();
+    if (container_query_data)
+      container_query_data->SetContainerQueryEvaluator(evaluator);
     else if (evaluator)
       EnsureContainerQueryData().SetContainerQueryEvaluator(evaluator);
   }
 
-  const AtomicString& GetNonce() const { return nonce_; }
-  void SetNonce(const AtomicString& nonce) { nonce_ = nonce; }
-
-  void SaveLastIntrinsicSize(ResizeObserverSize* size) {
-    last_intrinsic_size_ = size;
+  const AtomicString& GetNonce() const {
+    if (super_rare_data_)
+      return super_rare_data_->GetNonce();
+    return g_null_atom;
+  }
+  void SetNonce(const AtomicString& nonce) {
+    EnsureSuperRareData().SetNonce(nonce);
   }
 
+  void SaveLastIntrinsicSize(ResizeObserverSize* size) {
+    EnsureSuperRareData().SaveLastIntrinsicSize(size);
+  }
   const ResizeObserverSize* LastIntrinsicSize() const {
-    return last_intrinsic_size_;
+    if (super_rare_data_)
+      return super_rare_data_->LastIntrinsicSize();
+    return nullptr;
   }
 
   void TraceAfterDispatch(blink::Visitor*) const;
 
  private:
+  ElementSuperRareData& EnsureSuperRareData() {
+    if (!super_rare_data_)
+      super_rare_data_ = MakeGarbageCollected<ElementSuperRareData>();
+    return *super_rare_data_;
+  }
+
+  Member<ElementSuperRareData> super_rare_data_;
+
   ScrollOffset saved_layer_scroll_offset_;
-  AtomicString nonce_;
 
   Member<DatasetDOMStringMap> dataset_;
   Member<ShadowRoot> shadow_root_;
-  Member<EditContext> edit_context_;
   Member<DOMTokenList> class_list_;
-  Member<DOMTokenList> part_;
-  std::unique_ptr<NamesMap> part_names_map_;
   Member<NamedNodeMap> attribute_map_;
   Member<AttrNodeList> attr_node_list_;
   Member<InlineCSSStyleDeclaration> cssom_wrapper_;
-  Member<InlineStylePropertyMap> cssom_map_wrapper_;
 
   Member<ElementAnimations> element_animations_;
   Member<ElementIntersectionObserverData> intersection_observer_data_;
-  Member<ResizeObserverDataMap> resize_observer_data_;
-
-  Member<CustomElementDefinition> custom_element_definition_;
-  AtomicString is_value_;
-  Member<ElementInternals> element_internals_;
 
   Member<PseudoElementData> pseudo_element_data_;
-  Member<ResizeObserverSize> last_intrinsic_size_;
-
-  Member<AccessibleNode> accessible_node_;
-
-  Member<DisplayLockContext> display_lock_context_;
-  Member<ContainerQueryData> container_query_data_;
-  std::unique_ptr<RegionCaptureCropId> region_capture_crop_id_;
 
   unsigned did_attach_internals_ : 1;
   unsigned should_force_legacy_layout_for_child_ : 1;
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni
index 68fd207f..b174047d 100644
--- a/third_party/blink/renderer/core/html/build.gni
+++ b/third_party/blink/renderer/core/html/build.gni
@@ -569,12 +569,6 @@
 blink_core_hot_sources_html = [
   "parser/atomic_html_token.cc",
   "parser/atomic_html_token.h",
-  "parser/background_html_input_stream.cc",
-  "parser/background_html_input_stream.h",
-  "parser/background_html_parser.cc",
-  "parser/background_html_parser.h",
-  "parser/compact_html_token.cc",
-  "parser/compact_html_token.h",
   "parser/css_preload_scanner.cc",
   "parser/css_preload_scanner.h",
   "parser/html_construction_site.cc",
@@ -601,8 +595,6 @@
   "parser/html_parser_options.h",
   "parser/html_parser_reentry_permit.cc",
   "parser/html_parser_reentry_permit.h",
-  "parser/html_parser_scheduler.cc",
-  "parser/html_parser_scheduler.h",
   "parser/html_preload_scanner.cc",
   "parser/html_preload_scanner.h",
   "parser/html_resource_preloader.cc",
@@ -615,8 +607,6 @@
   "parser/html_tokenizer.h",
   "parser/html_tree_builder.cc",
   "parser/html_tree_builder.h",
-  "parser/html_tree_builder_simulator.cc",
-  "parser/html_tree_builder_simulator.h",
   "parser/html_view_source_parser.cc",
   "parser/html_view_source_parser.h",
   "parser/input_stream_preprocessor.h",
@@ -627,8 +617,6 @@
   "parser/parser_synchronization_policy.h",
   "parser/preload_request.cc",
   "parser/preload_request.h",
-  "parser/pump_session.cc",
-  "parser/pump_session.h",
   "parser/resource_preloader.cc",
   "parser/resource_preloader.h",
   "parser/text_document_parser.cc",
@@ -710,7 +698,6 @@
   "media/video_filling_viewport_test.cc",
   "media/video_wake_lock_test.cc",
   "parser/atomic_html_token_test.cc",
-  "parser/compact_html_token_test.cc",
   "parser/literal_buffer_test.cc",
   "parser/html_document_parser_loading_test.cc",
   "parser/html_document_parser_test.cc",
@@ -722,7 +709,6 @@
   "parser/html_resource_preloader_test.cc",
   "parser/html_srcset_parser_test.cc",
   "parser/html_tokenizer_test.cc",
-  "parser/html_tree_builder_simulator_test.cc",
   "parser/html_view_source_parser_test.cc",
   "parser/text_resource_decoder_builder_test.cc",
   "parser/text_resource_decoder_test.cc",
diff --git a/third_party/blink/renderer/core/html/parser/atomic_html_token.h b/third_party/blink/renderer/core/html/parser/atomic_html_token.h
index 938bc2b..3f7773f 100644
--- a/third_party/blink/renderer/core/html/parser/atomic_html_token.h
+++ b/third_party/blink/renderer/core/html/parser/atomic_html_token.h
@@ -30,7 +30,6 @@
 
 #include "base/notreached.h"
 #include "third_party/blink/renderer/core/dom/attribute.h"
-#include "third_party/blink/renderer/core/html/parser/compact_html_token.h"
 #include "third_party/blink/renderer/core/html/parser/html_token.h"
 #include "third_party/blink/renderer/core/html_element_lookup_trie.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
@@ -134,49 +133,6 @@
     }
   }
 
-  explicit AtomicHTMLToken(const CompactHTMLToken& token)
-      : type_(token.GetType()) {
-    switch (type_) {
-      case HTMLToken::kUninitialized:
-        NOTREACHED();
-        break;
-      case HTMLToken::DOCTYPE:
-        name_ = AtomicString(token.Data());
-        doctype_data_ = std::make_unique<DoctypeData>();
-        doctype_data_->has_public_identifier_ = true;
-        token.PublicIdentifier().AppendTo(doctype_data_->public_identifier_);
-        doctype_data_->has_system_identifier_ = true;
-        token.SystemIdentifier().AppendTo(doctype_data_->system_identifier_);
-        doctype_data_->force_quirks_ = token.DoctypeForcesQuirks();
-        break;
-      case HTMLToken::kEndOfFile:
-        break;
-      case HTMLToken::kStartTag:
-        attributes_.ReserveInitialCapacity(token.Attributes().size());
-        for (const CompactHTMLToken::Attribute& attribute :
-             token.Attributes()) {
-          QualifiedName name(g_null_atom, AtomicString(attribute.GetName()),
-                             g_null_atom);
-          // FIXME: This is N^2 for the number of attributes.
-          if (!FindAttributeInVector(attributes_, name)) {
-            attributes_.push_back(
-                Attribute(name, AtomicString(attribute.Value())));
-          } else {
-            duplicate_attribute_ = true;
-          }
-        }
-        [[fallthrough]];
-      case HTMLToken::kEndTag:
-        self_closing_ = token.SelfClosing();
-        name_ = AtomicString(token.Data());
-        break;
-      case HTMLToken::kCharacter:
-      case HTMLToken::kComment:
-        data_ = token.Data();
-        break;
-    }
-  }
-
   explicit AtomicHTMLToken(HTMLToken::TokenType type) : type_(type) {}
 
   AtomicHTMLToken(HTMLToken::TokenType type,
diff --git a/third_party/blink/renderer/core/html/parser/atomic_html_token_test.cc b/third_party/blink/renderer/core/html/parser/atomic_html_token_test.cc
index 7a1dae6e..618241b 100644
--- a/third_party/blink/renderer/core/html/parser/atomic_html_token_test.cc
+++ b/third_party/blink/renderer/core/html/parser/atomic_html_token_test.cc
@@ -41,38 +41,4 @@
   EXPECT_FALSE(attribute_d);
 }
 
-TEST(AtomicHTMLTokenTest, EmptyAttributeValueFromCompactHTMLToken) {
-  HTMLToken token;
-  token.BeginStartTag('a');
-  token.AddNewAttribute();
-  token.BeginAttributeName(3);
-  token.AppendToAttributeName('b');
-  token.EndAttributeName(4);
-  token.AddNewAttribute();
-  token.BeginAttributeName(5);
-  token.AppendToAttributeName('c');
-  token.EndAttributeName(6);
-  token.BeginAttributeValue(8);
-  token.EndAttributeValue(8);
-
-  AtomicHTMLToken atoken(
-      CompactHTMLToken(&token, TextPosition::MinimumPosition()));
-
-  const blink::Attribute* attribute_b = atoken.GetAttributeItem(
-      QualifiedName(AtomicString(), "b", AtomicString()));
-  ASSERT_TRUE(attribute_b);
-  EXPECT_FALSE(attribute_b->Value().IsNull());
-  EXPECT_TRUE(attribute_b->Value().IsEmpty());
-
-  const blink::Attribute* attribute_c = atoken.GetAttributeItem(
-      QualifiedName(AtomicString(), "c", AtomicString()));
-  ASSERT_TRUE(attribute_c);
-  EXPECT_FALSE(attribute_c->Value().IsNull());
-  EXPECT_TRUE(attribute_c->Value().IsEmpty());
-
-  const blink::Attribute* attribute_d = atoken.GetAttributeItem(
-      QualifiedName(AtomicString(), "d", AtomicString()));
-  EXPECT_FALSE(attribute_d);
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/background_html_input_stream.cc b/third_party/blink/renderer/core/html/parser/background_html_input_stream.cc
deleted file mode 100644
index 4585de5..0000000
--- a/third_party/blink/renderer/core/html/parser/background_html_input_stream.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/core/html/parser/background_html_input_stream.h"
-
-namespace blink {
-
-BackgroundHTMLInputStream::BackgroundHTMLInputStream()
-    : first_valid_checkpoint_index_(0),
-      first_valid_segment_index_(0),
-      total_checkpoint_token_count_(0) {}
-
-void BackgroundHTMLInputStream::Append(const String& input) {
-  current_.Append(SegmentedString(input));
-  segments_.push_back(input);
-}
-
-void BackgroundHTMLInputStream::Close() {
-  current_.Close();
-}
-
-HTMLInputCheckpoint BackgroundHTMLInputStream::CreateCheckpoint(
-    wtf_size_t tokens_extracted_since_previous_checkpoint) {
-  HTMLInputCheckpoint checkpoint = checkpoints_.size();
-  checkpoints_.push_back(Checkpoint(
-      current_, segments_.size(), tokens_extracted_since_previous_checkpoint));
-  total_checkpoint_token_count_ += tokens_extracted_since_previous_checkpoint;
-  return checkpoint;
-}
-
-void BackgroundHTMLInputStream::InvalidateCheckpointsBefore(
-    HTMLInputCheckpoint new_first_valid_checkpoint_index) {
-  DCHECK_LT(new_first_valid_checkpoint_index, checkpoints_.size());
-  // There is nothing to do for the first valid checkpoint.
-  if (first_valid_checkpoint_index_ == new_first_valid_checkpoint_index)
-    return;
-
-  DCHECK_GT(new_first_valid_checkpoint_index, first_valid_checkpoint_index_);
-  const Checkpoint& last_invalid_checkpoint =
-      checkpoints_[new_first_valid_checkpoint_index - 1];
-
-  DCHECK_LE(first_valid_segment_index_,
-            last_invalid_checkpoint.number_of_segments_already_appended);
-  for (wtf_size_t i = first_valid_segment_index_;
-       i < last_invalid_checkpoint.number_of_segments_already_appended; ++i)
-    segments_[i] = String();
-  first_valid_segment_index_ =
-      last_invalid_checkpoint.number_of_segments_already_appended;
-
-  for (wtf_size_t i = first_valid_checkpoint_index_;
-       i < new_first_valid_checkpoint_index; ++i) {
-    total_checkpoint_token_count_ -=
-        checkpoints_[i].tokens_extracted_since_previous_checkpoint;
-    checkpoints_[i].Clear();
-  }
-  first_valid_checkpoint_index_ = new_first_valid_checkpoint_index;
-}
-
-void BackgroundHTMLInputStream::RewindTo(HTMLInputCheckpoint checkpoint_index,
-                                         const String& unparsed_input) {
-  DCHECK_LT(checkpoint_index,
-            checkpoints_
-                .size());  // If this DCHECK fires, checkpointIndex is invalid.
-  const Checkpoint& checkpoint = checkpoints_[checkpoint_index];
-
-#if DCHECK_IS_ON()
-  DCHECK(!checkpoint.IsNull());
-#endif
-
-  bool is_closed = current_.IsClosed();
-
-  current_ = checkpoint.input;
-
-  for (wtf_size_t i = checkpoint.number_of_segments_already_appended;
-       i < segments_.size(); ++i) {
-    DCHECK(!segments_[i].IsNull());
-    current_.Append(SegmentedString(segments_[i]));
-  }
-
-  if (!unparsed_input.IsEmpty()) {
-    current_.Prepend(SegmentedString(unparsed_input),
-                     SegmentedString::PrependType::kNewInput);
-  }
-
-  if (is_closed && !current_.IsClosed())
-    current_.Close();
-
-  DCHECK_EQ(current_.IsClosed(), is_closed);
-
-  segments_.clear();
-  checkpoints_.clear();
-  first_valid_checkpoint_index_ = 0;
-  first_valid_segment_index_ = 0;
-
-  UpdateTotalCheckpointTokenCount();
-}
-
-void BackgroundHTMLInputStream::UpdateTotalCheckpointTokenCount() {
-  total_checkpoint_token_count_ = 0;
-  for (const auto& checkpoint : checkpoints_) {
-    total_checkpoint_token_count_ +=
-        checkpoint.tokens_extracted_since_previous_checkpoint;
-  }
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/background_html_input_stream.h b/third_party/blink/renderer/core/html/parser/background_html_input_stream.h
deleted file mode 100644
index f11a4c0..0000000
--- a/third_party/blink/renderer/core/html/parser/background_html_input_stream.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_BACKGROUND_HTML_INPUT_STREAM_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_BACKGROUND_HTML_INPUT_STREAM_H_
-
-#include "base/dcheck_is_on.h"
-#include "third_party/blink/renderer/platform/text/segmented_string.h"
-#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-
-namespace blink {
-
-typedef wtf_size_t HTMLInputCheckpoint;
-
-class BackgroundHTMLInputStream {
-  DISALLOW_NEW();
-
- public:
-  BackgroundHTMLInputStream();
-  BackgroundHTMLInputStream(const BackgroundHTMLInputStream&) = delete;
-  BackgroundHTMLInputStream& operator=(const BackgroundHTMLInputStream&) =
-      delete;
-
-  void Append(const String&);
-  void Close();
-
-  SegmentedString& Current() { return current_; }
-
-  // An HTMLInputCheckpoint is valid until the next call to rewindTo, at which
-  // point all outstanding checkpoints are invalidated.
-  HTMLInputCheckpoint CreateCheckpoint(
-      wtf_size_t tokens_extracted_since_previous_checkpoint);
-  void RewindTo(HTMLInputCheckpoint, const String& unparsed_input);
-  void InvalidateCheckpointsBefore(HTMLInputCheckpoint);
-
-  wtf_size_t TotalCheckpointTokenCount() const {
-    return total_checkpoint_token_count_;
-  }
-
- private:
-  struct Checkpoint {
-    Checkpoint(const SegmentedString& i, wtf_size_t n, wtf_size_t t)
-        : input(i),
-          number_of_segments_already_appended(n),
-          tokens_extracted_since_previous_checkpoint(t) {}
-
-    SegmentedString input;
-    wtf_size_t number_of_segments_already_appended;
-    wtf_size_t tokens_extracted_since_previous_checkpoint;
-
-#if DCHECK_IS_ON()
-    bool IsNull() const {
-      return input.IsEmpty() && !number_of_segments_already_appended;
-    }
-#endif
-    void Clear() {
-      input.Clear();
-      number_of_segments_already_appended = 0;
-      tokens_extracted_since_previous_checkpoint = 0;
-    }
-  };
-
-  SegmentedString current_;
-  Vector<String> segments_;
-  Vector<Checkpoint> checkpoints_;
-
-  // Note: These indicies may === vector.size(), in which case there are no
-  // valid checkpoints/segments at this time.
-  wtf_size_t first_valid_checkpoint_index_;
-  wtf_size_t first_valid_segment_index_;
-  wtf_size_t total_checkpoint_token_count_;
-
-  void UpdateTotalCheckpointTokenCount();
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_BACKGROUND_HTML_INPUT_STREAM_H_
diff --git a/third_party/blink/renderer/core/html/parser/background_html_parser.cc b/third_party/blink/renderer/core/html/parser/background_html_parser.cc
deleted file mode 100644
index 4a9331b..0000000
--- a/third_party/blink/renderer/core/html/parser/background_html_parser.cc
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/core/html/parser/background_html_parser.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/task/single_thread_task_runner.h"
-#include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/core/html/parser/html_document_parser.h"
-#include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h"
-#include "third_party/blink/renderer/core/html_names.h"
-#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
-#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
-#include "third_party/blink/renderer/platform/wtf/functional.h"
-#include "third_party/blink/renderer/platform/wtf/text/text_position.h"
-
-namespace blink {
-
-// On a network with high latency and high bandwidth, using a device with a fast
-// CPU, we could end up speculatively tokenizing the whole document, well ahead
-// of when the main-thread actually needs it. This is a waste of memory (and
-// potentially time if the speculation fails). So we limit our outstanding
-// tokens arbitrarily to 10,000. Our maximal memory spent speculating will be
-// approximately:
-// (kOutstandingTokenLimit + kPendingTokenLimit) * sizeof(CompactToken)
-//
-// We use a separate low and high water mark to avoid
-// constantly topping off the main thread's token buffer. At time of writing,
-// this is (10000 + 1000) * 28 bytes = ~308kb of memory. These numbers have not
-// been tuned.
-static const size_t kOutstandingTokenLimit = 10000;
-
-// We limit our chucks to 1000 tokens, to make sure the main thread is never
-// waiting on the parser thread for tokens. This was tuned in
-// https://bugs.webkit.org/show_bug.cgi?id=110408.
-static const size_t kPendingTokenLimit = 1000;
-
-static_assert(kOutstandingTokenLimit > kPendingTokenLimit,
-              "Outstanding token limit is applied after pending token limit.");
-
-base::WeakPtr<BackgroundHTMLParser> BackgroundHTMLParser::Create(
-    std::unique_ptr<Configuration> config,
-    scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner) {
-  auto* background_parser = new BackgroundHTMLParser(
-      std::move(config), std::move(loading_task_runner));
-  return background_parser->weak_factory_.GetWeakPtr();
-}
-
-void BackgroundHTMLParser::Init(
-    const KURL& document_url,
-    std::unique_ptr<CachedDocumentParameters> cached_document_parameters,
-    const MediaValuesCached::MediaValuesCachedData& media_values_cached_data,
-    bool priority_hints_origin_trial_enabled) {
-  TRACE_EVENT1("loading", "BackgroundHTMLParser::Init", "url",
-               document_url.GetString().Utf8());
-  preload_scanner_ = std::make_unique<TokenPreloadScanner>(
-      document_url, std::move(cached_document_parameters),
-      media_values_cached_data, TokenPreloadScanner::ScannerType::kMainDocument,
-      priority_hints_origin_trial_enabled);
-}
-
-BackgroundHTMLParser::Configuration::Configuration() {}
-
-BackgroundHTMLParser::BackgroundHTMLParser(
-    std::unique_ptr<Configuration> config,
-    scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner)
-    : token_(std::make_unique<HTMLToken>()),
-      tokenizer_(std::make_unique<HTMLTokenizer>(config->options)),
-      tree_builder_simulator_(config->options),
-      options_(config->options),
-      parser_(config->parser),
-      decoder_(std::move(config->decoder)),
-      loading_task_runner_(std::move(loading_task_runner)),
-      pending_csp_meta_token_index_(
-          HTMLDocumentParser::TokenizedChunk::kNoPendingToken),
-      starting_script_(false) {}
-
-BackgroundHTMLParser::~BackgroundHTMLParser() = default;
-
-void BackgroundHTMLParser::AppendRawBytesFromMainThread(
-    std::unique_ptr<Vector<char>> buffer) {
-  TRACE_EVENT0("loading", "BackgroundHTMLParser::AppendRawBytesFromMainThread");
-  DCHECK(decoder_);
-  UpdateDocument(decoder_->Decode(buffer->data(), buffer->size()));
-}
-
-void BackgroundHTMLParser::AppendDecodedBytes(const String& input) {
-  DCHECK(!input_.Current().IsClosed());
-  input_.Append(input);
-  PumpTokenizer();
-}
-
-void BackgroundHTMLParser::SetDecoder(
-    std::unique_ptr<TextResourceDecoder> decoder) {
-  DCHECK(decoder);
-  decoder_ = std::move(decoder);
-}
-
-void BackgroundHTMLParser::Flush() {
-  DCHECK(decoder_);
-  UpdateDocument(decoder_->Flush());
-}
-
-void BackgroundHTMLParser::UpdateDocument(const String& decoded_data) {
-  DocumentEncodingData encoding_data(*decoder_.get());
-  if (encoding_data != last_seen_encoding_data_) {
-    last_seen_encoding_data_ = encoding_data;
-    if (parser_)
-      parser_->DidReceiveEncodingDataFromBackgroundParser(encoding_data);
-  }
-  if (decoded_data.IsEmpty())
-    return;
-
-  AppendDecodedBytes(decoded_data);
-}
-
-void BackgroundHTMLParser::ResumeFrom(std::unique_ptr<Checkpoint> checkpoint) {
-  parser_ = checkpoint->parser;
-  token_ = std::move(checkpoint->token);
-  tokenizer_ = std::move(checkpoint->tokenizer);
-  tree_builder_simulator_.SetState(checkpoint->tree_builder_state);
-  input_.RewindTo(checkpoint->input_checkpoint, checkpoint->unparsed_input);
-  preload_scanner_->RewindTo(checkpoint->preload_scanner_checkpoint);
-  starting_script_ = false;
-  PumpTokenizer();
-}
-
-void BackgroundHTMLParser::StartedChunkWithCheckpoint(
-    HTMLInputCheckpoint input_checkpoint) {
-  // Note, we should not have to worry about the index being invalid as messages
-  // from the main thread will be processed in FIFO order.
-  input_.InvalidateCheckpointsBefore(input_checkpoint);
-  PumpTokenizer();
-}
-
-void BackgroundHTMLParser::Finish() {
-  MarkEndOfFile();
-  PumpTokenizer();
-}
-
-void BackgroundHTMLParser::Stop() {
-  ClearParser();
-  delete this;
-}
-
-void BackgroundHTMLParser::ForcePlaintextForTextDocument() {
-  // This is only used by the TextDocumentParser (a subclass of
-  // HTMLDocumentParser) to force us into the PLAINTEXT state w/o using a
-  // <plaintext> tag. The TextDocumentParser uses a <pre> tag for historical /
-  // compatibility reasons.
-  tokenizer_->SetState(HTMLTokenizer::kPLAINTEXTState);
-}
-
-void BackgroundHTMLParser::ClearParser() {
-  parser_.Clear();
-}
-
-void BackgroundHTMLParser::MarkEndOfFile() {
-  DCHECK(!input_.Current().IsClosed());
-  input_.Append(String(&kEndOfFileMarker, 1));
-  input_.Close();
-}
-
-void BackgroundHTMLParser::PumpTokenizer() {
-  TRACE_EVENT0("loading", "BackgroundHTMLParser::PumpTokenizer");
-  HTMLTreeBuilderSimulator::SimulatedToken simulated_token =
-      HTMLTreeBuilderSimulator::kOtherToken;
-
-  // No need to start speculating until the main thread has almost caught up.
-  if (input_.TotalCheckpointTokenCount() > kOutstandingTokenLimit)
-    return;
-
-  while (tokenizer_->NextToken(input_.Current(), *token_)) {
-    {
-      TextPosition position = TextPosition(input_.Current().CurrentLine(),
-                                           input_.Current().CurrentColumn());
-
-      CompactHTMLToken token(token_.get(), position);
-      bool is_csp_meta_tag = false;
-      preload_scanner_->Scan(token, input_.Current(), pending_preloads_,
-                             &viewport_description_, &is_csp_meta_tag);
-
-      simulated_token =
-          tree_builder_simulator_.Simulate(token, tokenizer_.get());
-
-      // Break chunks before a script tag is inserted and flag the chunk as
-      // starting a script so the main parser can decide if it should yield
-      // before processing the chunk.
-      if (simulated_token == HTMLTreeBuilderSimulator::kValidScriptStart) {
-        EnqueueTokenizedChunk();
-        starting_script_ = true;
-      }
-
-      pending_tokens_.push_back(token);
-      if (is_csp_meta_tag) {
-        pending_csp_meta_token_index_ = pending_tokens_.size() - 1;
-      }
-    }
-
-    token_->Clear();
-
-    if (simulated_token == HTMLTreeBuilderSimulator::kScriptEnd ||
-        simulated_token == HTMLTreeBuilderSimulator::kStyleEnd ||
-        simulated_token == HTMLTreeBuilderSimulator::kLink ||
-        simulated_token == HTMLTreeBuilderSimulator::kCustomElementBegin ||
-        simulated_token == HTMLTreeBuilderSimulator::kDeclarativeShadowDOMEnd ||
-        pending_tokens_.size() >= kPendingTokenLimit) {
-      EnqueueTokenizedChunk();
-
-      // If we're far ahead of the main thread, yield for a bit to avoid
-      // consuming too much memory.
-      if (input_.TotalCheckpointTokenCount() > kOutstandingTokenLimit)
-        break;
-    }
-  }
-
-  EnqueueTokenizedChunk();
-}
-
-void BackgroundHTMLParser::EnqueueTokenizedChunk() {
-  if (pending_tokens_.IsEmpty())
-    return;
-
-  auto chunk = std::make_unique<HTMLDocumentParser::TokenizedChunk>();
-
-  chunk->preloads.swap(pending_preloads_);
-  if (viewport_description_.has_value())
-    chunk->viewport = viewport_description_;
-  chunk->tokenizer_state = tokenizer_->GetState();
-  chunk->tree_builder_state = tree_builder_simulator_.GetState();
-  chunk->input_checkpoint = input_.CreateCheckpoint(pending_tokens_.size());
-  chunk->preload_scanner_checkpoint = preload_scanner_->CreateCheckpoint();
-  chunk->tokens.swap(pending_tokens_);
-  chunk->starting_script = starting_script_;
-  chunk->pending_csp_meta_token_index = pending_csp_meta_token_index_;
-  starting_script_ = false;
-  pending_csp_meta_token_index_ =
-      HTMLDocumentParser::TokenizedChunk::kNoPendingToken;
-
-  if (parser_)
-    parser_->EnqueueTokenizedChunk(std::move(chunk));
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/background_html_parser.h b/third_party/blink/renderer/core/html/parser/background_html_parser.h
deleted file mode 100644
index 74695be..0000000
--- a/third_party/blink/renderer/core/html/parser/background_html_parser.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_BACKGROUND_HTML_PARSER_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_BACKGROUND_HTML_PARSER_H_
-
-#include <memory>
-
-#include "base/memory/weak_ptr.h"
-#include "base/task/single_thread_task_runner.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "third_party/blink/renderer/core/dom/document_encoding_data.h"
-#include "third_party/blink/renderer/core/html/parser/background_html_input_stream.h"
-#include "third_party/blink/renderer/core/html/parser/compact_html_token.h"
-#include "third_party/blink/renderer/core/html/parser/html_parser_options.h"
-#include "third_party/blink/renderer/core/html/parser/html_preload_scanner.h"
-#include "third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h"
-#include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h"
-#include "third_party/blink/renderer/core/page/viewport_description.h"
-
-namespace blink {
-
-class HTMLDocumentParser;
-
-class BackgroundHTMLParser {
-  USING_FAST_MALLOC(BackgroundHTMLParser);
-
- public:
-  struct Configuration {
-    USING_FAST_MALLOC(Configuration);
-
-   public:
-    Configuration();
-    HTMLParserOptions options;
-    WeakPersistent<HTMLDocumentParser> parser;
-    std::unique_ptr<TextResourceDecoder> decoder;
-  };
-
-  // The returned BackgroundHTMLParser must first be initialized by calling
-  // init(), and free by calling stop().
-  static base::WeakPtr<BackgroundHTMLParser> Create(
-      std::unique_ptr<Configuration>,
-      scoped_refptr<base::SingleThreadTaskRunner>);
-  void Init(const KURL& document_url,
-            std::unique_ptr<CachedDocumentParameters>,
-            const MediaValuesCached::MediaValuesCachedData&,
-            bool priority_hints_origin_trial_enabled);
-
-  BackgroundHTMLParser(const BackgroundHTMLParser&) = delete;
-  BackgroundHTMLParser& operator=(const BackgroundHTMLParser&) = delete;
-
-  struct Checkpoint {
-    USING_FAST_MALLOC(Checkpoint);
-
-   public:
-    WeakPersistent<HTMLDocumentParser> parser;
-    std::unique_ptr<HTMLToken> token;
-    std::unique_ptr<HTMLTokenizer> tokenizer;
-    HTMLTreeBuilderSimulator::State tree_builder_state;
-    HTMLInputCheckpoint input_checkpoint;
-    TokenPreloadScannerCheckpoint preload_scanner_checkpoint;
-    String unparsed_input;
-  };
-
-  void AppendRawBytesFromMainThread(std::unique_ptr<Vector<char>>);
-  void SetDecoder(std::unique_ptr<TextResourceDecoder>);
-  void Flush();
-  void ResumeFrom(std::unique_ptr<Checkpoint>);
-  void StartedChunkWithCheckpoint(HTMLInputCheckpoint);
-  void Finish();
-  void Stop();
-
-  void ForcePlaintextForTextDocument();
-
-  void ClearParser();
-
- private:
-  BackgroundHTMLParser(std::unique_ptr<Configuration>,
-                       scoped_refptr<base::SingleThreadTaskRunner>);
-  ~BackgroundHTMLParser();
-
-  void AppendDecodedBytes(const String&);
-  void MarkEndOfFile();
-  void PumpTokenizer();
-
-  void EnqueueTokenizedChunk();
-  void UpdateDocument(const String& decoded_data);
-
-  BackgroundHTMLInputStream input_;
-  std::unique_ptr<HTMLToken> token_;
-  std::unique_ptr<HTMLTokenizer> tokenizer_;
-  HTMLTreeBuilderSimulator tree_builder_simulator_;
-  HTMLParserOptions options_;
-  WeakPersistent<HTMLDocumentParser> parser_;
-
-  CompactHTMLTokenStream pending_tokens_;
-  PreloadRequestStream pending_preloads_;
-  absl::optional<ViewportDescription> viewport_description_;
-  std::unique_ptr<TokenPreloadScanner> preload_scanner_;
-  std::unique_ptr<TextResourceDecoder> decoder_;
-  DocumentEncodingData last_seen_encoding_data_;
-  scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_;
-
-  // Index into |pending_tokens_| of the last <meta> csp token found. Will be
-  // |TokenizedChunk::kNoPendingToken| if none have been found.
-  int pending_csp_meta_token_index_;
-
-  bool starting_script_;
-
-  base::WeakPtrFactory<BackgroundHTMLParser> weak_factory_{this};
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_BACKGROUND_HTML_PARSER_H_
diff --git a/third_party/blink/renderer/core/html/parser/compact_html_token.cc b/third_party/blink/renderer/core/html/parser/compact_html_token.cc
deleted file mode 100644
index 4446d6d5..0000000
--- a/third_party/blink/renderer/core/html/parser/compact_html_token.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/core/html/parser/compact_html_token.h"
-
-#include "base/notreached.h"
-#include "third_party/blink/renderer/core/dom/qualified_name.h"
-#include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h"
-#include "third_party/blink/renderer/platform/wtf/size_assertions.h"
-
-namespace blink {
-
-struct SameSizeAsCompactHTMLToken {
-  unsigned bitfields;
-  String data;
-  Vector<Attribute> vector;
-  TextPosition text_position;
-};
-
-ASSERT_SIZE(CompactHTMLToken, SameSizeAsCompactHTMLToken);
-
-CompactHTMLToken::CompactHTMLToken(const HTMLToken* token,
-                                   const TextPosition& text_position)
-    : type_(token->GetType()),
-      is_all8_bit_data_(false),
-      doctype_forces_quirks_(false),
-      text_position_(text_position) {
-  switch (type_) {
-    case HTMLToken::kUninitialized:
-      NOTREACHED();
-      break;
-    case HTMLToken::DOCTYPE: {
-      data_ = AttemptStaticStringCreation(token->GetName(), kLikely8Bit);
-
-      // There is only 1 DOCTYPE token per document, so to avoid increasing the
-      // size of CompactHTMLToken, we just use the attributes_ vector.
-      attributes_.push_back(Attribute(
-          AttemptStaticStringCreation(token->PublicIdentifier(), kLikely8Bit),
-          String(token->SystemIdentifier())));
-      doctype_forces_quirks_ = token->ForceQuirks();
-      break;
-    }
-    case HTMLToken::kEndOfFile:
-      break;
-    case HTMLToken::kStartTag:
-      attributes_.ReserveInitialCapacity(token->Attributes().size());
-      for (const HTMLToken::Attribute& attribute : token->Attributes())
-        attributes_.push_back(
-            Attribute(attribute.NameAttemptStaticStringCreation(),
-                      attribute.Value8BitIfNecessary()));
-      [[fallthrough]];
-    case HTMLToken::kEndTag:
-      self_closing_ = token->SelfClosing();
-      [[fallthrough]];
-    case HTMLToken::kComment:
-    case HTMLToken::kCharacter: {
-      is_all8_bit_data_ = token->IsAll8BitData();
-      data_ = AttemptStaticStringCreation(
-          token->Data(), token->IsAll8BitData() ? kForce8Bit : kForce16Bit);
-      break;
-    }
-    default:
-      NOTREACHED();
-      break;
-  }
-}
-
-const CompactHTMLToken::Attribute* CompactHTMLToken::GetAttributeItem(
-    const QualifiedName& name) const {
-  for (unsigned i = 0; i < attributes_.size(); ++i) {
-    if (ThreadSafeMatch(attributes_.at(i).GetName(), name))
-      return &attributes_.at(i);
-  }
-  return nullptr;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/compact_html_token.h b/third_party/blink/renderer/core/html/parser/compact_html_token.h
deleted file mode 100644
index 9842b4ab..0000000
--- a/third_party/blink/renderer/core/html/parser/compact_html_token.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_COMPACT_HTML_TOKEN_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_COMPACT_HTML_TOKEN_H_
-
-#include "third_party/blink/renderer/core/html/parser/html_token.h"
-#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
-#include "third_party/blink/renderer/platform/wtf/text/text_position.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-
-namespace blink {
-
-class QualifiedName;
-
-class CORE_EXPORT CompactHTMLToken {
-  DISALLOW_NEW();
-
- public:
-  struct Attribute {
-    DISALLOW_NEW();
-
-   public:
-    Attribute(const String& name, const String& value)
-        : name_(name), value_(value) {}
-
-    const String& GetName() const { return name_; }
-    const String& Value() const { return value_; }
-
-    // We don't create a new 8-bit String because it doesn't save memory.
-    const String& Value8BitIfNecessary() const { return value_; }
-
-   private:
-    String name_;
-    String value_;
-  };
-
-  CompactHTMLToken(const HTMLToken*, const TextPosition&);
-
-  HTMLToken::TokenType GetType() const {
-    return static_cast<HTMLToken::TokenType>(type_);
-  }
-  const String& Data() const { return data_; }
-  bool SelfClosing() const { return self_closing_; }
-  bool IsAll8BitData() const { return is_all8_bit_data_; }
-  const Vector<Attribute>& Attributes() const { return attributes_; }
-  const Attribute* GetAttributeItem(const QualifiedName&) const;
-  const TextPosition& GetTextPosition() const { return text_position_; }
-
-  // There is only 1 DOCTYPE token per document, so to avoid increasing the
-  // size of CompactHTMLToken, we just use the attributes_ vector.
-  const String& PublicIdentifier() const { return attributes_[0].GetName(); }
-  const String& SystemIdentifier() const { return attributes_[0].Value(); }
-  bool DoctypeForcesQuirks() const { return doctype_forces_quirks_; }
-
- private:
-  unsigned type_ : 4;
-  unsigned self_closing_ : 1;
-  unsigned is_all8_bit_data_ : 1;
-  unsigned doctype_forces_quirks_ : 1;
-
-  String data_;  // "name", "characters", or "data" depending on type_
-  Vector<Attribute> attributes_;
-  TextPosition text_position_;
-};
-
-typedef Vector<CompactHTMLToken> CompactHTMLTokenStream;
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_COMPACT_HTML_TOKEN_H_
diff --git a/third_party/blink/renderer/core/html/parser/compact_html_token_test.cc b/third_party/blink/renderer/core/html/parser/compact_html_token_test.cc
deleted file mode 100644
index 4b49831..0000000
--- a/third_party/blink/renderer/core/html/parser/compact_html_token_test.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/html/parser/compact_html_token.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace blink {
-
-TEST(CompactHTMLTokenTest, EmptyAttributeValueFromHTMLToken) {
-  HTMLToken token;
-  token.BeginStartTag('a');
-  token.AddNewAttribute();
-  token.BeginAttributeName(3);
-  token.AppendToAttributeName('b');
-  token.EndAttributeName(4);
-  token.AddNewAttribute();
-  token.BeginAttributeName(5);
-  token.AppendToAttributeName('c');
-  token.EndAttributeName(6);
-  token.BeginAttributeValue(8);
-  token.EndAttributeValue(8);
-
-  CompactHTMLToken ctoken(&token, TextPosition::MinimumPosition());
-
-  const CompactHTMLToken::Attribute* attribute_b = ctoken.GetAttributeItem(
-      QualifiedName(AtomicString(), "b", AtomicString()));
-  ASSERT_TRUE(attribute_b);
-  EXPECT_FALSE(attribute_b->Value().IsNull());
-  EXPECT_TRUE(attribute_b->Value().IsEmpty());
-
-  const CompactHTMLToken::Attribute* attribute_c = ctoken.GetAttributeItem(
-      QualifiedName(AtomicString(), "c", AtomicString()));
-  ASSERT_TRUE(attribute_c);
-  EXPECT_FALSE(attribute_c->Value().IsNull());
-  EXPECT_TRUE(attribute_c->Value().IsEmpty());
-
-  const CompactHTMLToken::Attribute* attribute_d = ctoken.GetAttributeItem(
-      QualifiedName(AtomicString(), "d", AtomicString()));
-  EXPECT_FALSE(attribute_d);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
index 6f00aadf..dc2ad03 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -44,12 +44,10 @@
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/html/html_document.h"
 #include "third_party/blink/renderer/core/html/parser/atomic_html_token.h"
-#include "third_party/blink/renderer/core/html/parser/background_html_parser.h"
 #include "third_party/blink/renderer/core/html/parser/html_parser_metrics.h"
-#include "third_party/blink/renderer/core/html/parser/html_parser_scheduler.h"
 #include "third_party/blink/renderer/core/html/parser/html_resource_preloader.h"
 #include "third_party/blink/renderer/core/html/parser/html_tree_builder.h"
-#include "third_party/blink/renderer/core/html/parser/pump_session.h"
+#include "third_party/blink/renderer/core/html/parser/nesting_level_incrementer.h"
 #include "third_party/blink/renderer/core/html_names.h"
 #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
 #include "third_party/blink/renderer/core/loader/document_loader.h"
@@ -71,16 +69,6 @@
 
 namespace blink {
 
-static size_t g_discarded_token_count_for_testing = 0;
-
-void ResetDiscardedTokenCountForTesting() {
-  g_discarded_token_count_for_testing = 0;
-}
-
-size_t GetDiscardedTokenCountForTesting() {
-  return g_discarded_token_count_for_testing;
-}
-
 // This sets the (default) maximum number of tokens which the foreground HTML
 // parser should try to process in one go. Lower values generally mean faster
 // first paints, larger values delay first paint, but make sure it's closer to
@@ -168,9 +156,9 @@
   bool HaveSeenFirstByte() const { return have_seen_first_byte_; }
   void SetHaveSeenFirstByte() { have_seen_first_byte_ = true; }
 
-  // Keeps track of whether Document::Finish has been called whilst parsing
-  // asynchronously. ShouldAttemptToEndOnEOF() means that the parser should
-  // close when there's no more input.
+  // Keeps track of whether Document::Finish has been called whilst parsing.
+  // ShouldAttemptToEndOnEOF() means that the parser should close when there's
+  // no more input.
   bool ShouldAttemptToEndOnEOF() const {
     return should_attempt_to_end_on_eof_ > 0;
   }
@@ -387,52 +375,25 @@
                                        ParserPrefetchPolicy prefetch_policy)
     : ScriptableDocumentParser(document, content_policy),
       options_(&document),
-      token_(sync_policy != kAllowAsynchronousParsing
-                 ? std::make_unique<HTMLToken>()
-                 : nullptr),
-      tokenizer_(sync_policy != kAllowAsynchronousParsing
-                     ? std::make_unique<HTMLTokenizer>(options_)
-                     : nullptr),
+      token_(std::make_unique<HTMLToken>()),
+      tokenizer_(std::make_unique<HTMLTokenizer>(options_)),
       loading_task_runner_(sync_policy == kForceSynchronousParsing
                                ? nullptr
                                : document.GetTaskRunner(TaskType::kNetworking)),
-      parser_scheduler_(sync_policy == kAllowAsynchronousParsing
-                            ? MakeGarbageCollected<HTMLParserScheduler>(
-                                  this,
-                                  loading_task_runner_.get())
-                            : nullptr),
-      text_position_(TextPosition::MinimumPosition()),
       task_runner_state_(
           MakeGarbageCollected<HTMLDocumentParserState>(sync_policy)),
-      pending_csp_meta_token_(nullptr),
-      can_parse_asynchronously_(sync_policy == kAllowAsynchronousParsing),
-      end_was_delayed_(false),
-      have_background_parser_(false),
-      pump_session_nesting_level_(0),
-      pump_speculations_session_nesting_level_(0),
-      is_parsing_at_line_number_(false),
-      tried_loading_link_headers_(false),
-      added_pending_parser_blocking_stylesheet_(false),
-      is_waiting_for_stylesheets_(false),
       scheduler_(sync_policy == kAllowDeferredParsing
                      ? Thread::Current()->Scheduler()
-                     : nullptr) {
-  DCHECK(CanParseAsynchronously() || (token_ && tokenizer_));
-  // Asynchronous parsing is not allowed in prefetch mode.
-  DCHECK(!document.IsPrefetchOnly() || !CanParseAsynchronously());
-
-  // It is permissible to request the background HTML parser whilst also using
-  // --enable-blink-features=ForceSynchronousHTMLParsing, but it's usually
-  // unintentional. To help flush out these cases, trigger a DCHECK.
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled() ||
-         !CanParseAsynchronously());
-
+                     : nullptr),
+      pump_session_nesting_level_(0),
+      end_was_delayed_(false),
+      added_pending_parser_blocking_stylesheet_(false),
+      is_waiting_for_stylesheets_(false) {
   // Report metrics for async document parsing or forced synchronous parsing.
   // The document must be main frame to meet UKM requirements, and must have a
   // high resolution clock for high quality data.
-  if ((sync_policy == kAllowAsynchronousParsing ||
-       sync_policy == kAllowDeferredParsing) &&
-      document.GetFrame() && document.GetFrame()->IsMainFrame() &&
+  if (sync_policy == kAllowDeferredParsing && document.GetFrame() &&
+      document.GetFrame()->IsMainFrame() &&
       base::TimeTicks::IsHighResolution()) {
     metrics_reporter_ = std::make_unique<HTMLParserMetrics>(
         document.UkmSourceID(), document.UkmRecorder());
@@ -455,17 +416,9 @@
 
 HTMLDocumentParser::~HTMLDocumentParser() = default;
 
-void HTMLDocumentParser::Dispose() {
-  // In Oilpan, HTMLDocumentParser can die together with Document, and detach()
-  // is not called in this case.
-  if (have_background_parser_)
-    StopBackgroundParser();
-}
-
 void HTMLDocumentParser::Trace(Visitor* visitor) const {
   visitor->Trace(reentry_permit_);
   visitor->Trace(tree_builder_);
-  visitor->Trace(parser_scheduler_);
   visitor->Trace(script_runner_);
   visitor->Trace(preloader_);
   visitor->Trace(task_runner_state_);
@@ -478,8 +431,6 @@
 }
 
 void HTMLDocumentParser::Detach() {
-  if (have_background_parser_)
-    StopBackgroundParser();
   // Deschedule any pending tokenizer pumps.
   task_runner_state_->SetState(
       HTMLDocumentParserState::DeferredParserState::kNotScheduled);
@@ -492,28 +443,20 @@
   // fast/dom/HTMLScriptElement/script-load-events.html we do.
   preload_scanner_.reset();
   insertion_preload_scanner_.reset();
-  if (parser_scheduler_) {
-    parser_scheduler_->Detach();
-    parser_scheduler_.Clear();
-  }
   // Oilpan: It is important to clear token_ to deallocate backing memory of
   // HTMLToken::data_ and let the allocator reuse the memory for
   // HTMLToken::data_ of a next HTMLDocumentParser. We need to clear
   // tokenizer_ first because tokenizer_ has a raw pointer to token_.
+  // TODO(masonf): We can probably move tokenizer_ and token_ into the
+  // HTMLDocumentParser itself, instead of having them as Members.
   tokenizer_.reset();
   token_.reset();
 }
 
 void HTMLDocumentParser::StopParsing() {
   DocumentParser::StopParsing();
-  if (parser_scheduler_) {
-    parser_scheduler_->Detach();
-    parser_scheduler_.Clear();
-  }
   task_runner_state_->SetState(
       HTMLDocumentParserState::DeferredParserState::kNotScheduled);
-  if (have_background_parser_)
-    StopBackgroundParser();
 }
 
 // This kicks off "Once the user agent stops parsing" as described by:
@@ -521,13 +464,17 @@
 void HTMLDocumentParser::PrepareToStopParsing() {
   TRACE_EVENT1("blink", "HTMLDocumentParser::PrepareToStopParsing", "parser",
                (void*)this);
-  // FIXME: It may not be correct to disable this for the background parser.
-  // That means hasInsertionPoint() may not be correct in some cases.
-  DCHECK(!HasInsertionPoint() || have_background_parser_);
+  DCHECK(!HasInsertionPoint());
+
+  // If we've already been detached, e.g. in
+  // WebFrameTest.SwapMainFrameWhileLoading, bail out.
+  if (IsDetached())
+    return;
+
+  DCHECK(tokenizer_);
 
   // NOTE: This pump should only ever emit buffered character tokens.
-  if (tokenizer_ && !GetDocument()->IsPrefetchOnly()) {
-    DCHECK(!have_background_parser_);
+  if (!GetDocument()->IsPrefetchOnly()) {
     ShouldCompleteScope should_complete(task_runner_state_);
     EndIfDelayedForbiddenScope should_not_end_if_delayed(task_runner_state_);
     PumpTokenizerIfPossible();
@@ -556,9 +503,7 @@
 
 void HTMLDocumentParser::DeferredPumpTokenizerIfPossible() {
   // This method is called asynchronously, continues building the HTML document.
-  // This function should only be called when
-  // --enable-blink-features=ForceSynchronousHTMLParsing is available.
-  DCHECK(RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
+
   // If we're scheduled for a tokenizer pump, then document should be attached
   // and the parser should not be stopped, but sometimes a script completes
   // loading (so we schedule a pump) but the Document is stopped in the meantime
@@ -614,14 +559,14 @@
     // Fall into this branch if ::Finish has been previously called and we've
     // just finished asynchronously parsing everything.
     if (metrics_reporter_)
-      metrics_reporter_->ReportMetricsAtParseEnd(false);
+      metrics_reporter_->ReportMetricsAtParseEnd();
     AttemptToEnd();
   } else if (task_runner_state_->ShouldEndIfDelayed()) {
     // If we did not exceed the budget or parsed everything there was to
     // parse, check if we should complete the document.
     if (task_runner_state_->ShouldComplete() || IsStopped() || IsStopping()) {
       if (metrics_reporter_)
-        metrics_reporter_->ReportMetricsAtParseEnd(false);
+        metrics_reporter_->ReportMetricsAtParseEnd();
       EndIfDelayed();
     } else {
       ScheduleEndIfDelayed();
@@ -629,25 +574,6 @@
   }
 }
 
-bool HTMLDocumentParser::IsScheduledForUnpause() const {
-  return parser_scheduler_ && parser_scheduler_->IsScheduledForUnpause();
-}
-
-// Used by HTMLParserScheduler
-void HTMLDocumentParser::ResumeParsingAfterYield() {
-  DCHECK(CanParseAsynchronously());
-  DCHECK(have_background_parser_);
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-
-  ScopedYieldTimer timer(&yield_timer_, metrics_reporter_.get());
-
-  CheckIfBlockingStylesheetAdded();
-  if (IsStopped() || IsPaused())
-    return;
-
-  PumpPendingSpeculations();
-}
-
 void HTMLDocumentParser::RunScriptsForPausedTreeBuilder() {
   TRACE_EVENT1("blink", "HTMLDocumentParser::RunScriptsForPausedTreeBuilder",
                "parser", (void*)this);
@@ -678,310 +604,8 @@
   return ret;
 }
 
-void HTMLDocumentParser::EnqueueTokenizedChunk(
-    std::unique_ptr<TokenizedChunk> chunk) {
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-  TRACE_EVENT0("blink", "HTMLDocumentParser::EnqueueTokenizedChunk");
-
-  DCHECK(chunk);
-  DCHECK(GetDocument());
-
-  if (!IsParsing())
-    return;
-
-  // ApplicationCache needs to be initialized before issuing preloads. We
-  // suspend preload until HTMLHTMLElement is inserted and ApplicationCache is
-  // initialized. Note: link rel preloads don't follow this policy per the spec.
-  // These directives should initiate a fetch as fast as possible.
-  if (!tried_loading_link_headers_ && GetDocument()->Loader()) {
-    // Note that on commit, the loader dispatched preloads for all the non-media
-    // links.
-    GetDocument()->Loader()->DispatchLinkHeaderPreloads(
-        base::OptionalOrNullptr(chunk->viewport),
-        PreloadHelper::kOnlyLoadMedia);
-    tried_loading_link_headers_ = true;
-    if (GetDocument()->Loader()->GetPrefetchedSignedExchangeManager()) {
-      // Link header preloads for prefetched signed exchanges won't be started
-      // until StartPrefetchedLinkHeaderPreloads() is called. See the header
-      // comment of PrefetchedSignedExchangeManager.
-      GetDocument()
-          ->Loader()
-          ->GetPrefetchedSignedExchangeManager()
-          ->StartPrefetchedLinkHeaderPreloads();
-    }
-  }
-
-  // Defer preloads if any of the chunks contains a <meta> csp tag.
-  if (chunk->pending_csp_meta_token_index != TokenizedChunk::kNoPendingToken) {
-    pending_csp_meta_token_ =
-        &chunk->tokens.at(chunk->pending_csp_meta_token_index);
-  }
-
-  if (preloader_) {
-    // Delay sending some requests if meta tag based CSP is present.
-    if (pending_csp_meta_token_) {
-      for (auto& request : chunk->preloads) {
-        queued_preloads_.push_back(std::move(request));
-      }
-    } else {
-      // We can safely assume that there are no queued preloads request after
-      // the document element is available and if there is no pending csp token
-      // in the speculation buffer, as we empty the queue immediately
-      // after the document element is created in DocumentElementAvailable()
-      // or when the csp token has been parsed.
-      DCHECK(queued_preloads_.IsEmpty());
-      preloader_->TakeAndPreload(chunk->preloads);
-    }
-  }
-
-  speculations_.push_back(std::move(chunk));
-
-  if (!IsPaused() && !IsScheduledForUnpause())
-    parser_scheduler_->ScheduleForUnpause();
-}
-
-void HTMLDocumentParser::DidReceiveEncodingDataFromBackgroundParser(
-    const DocumentEncodingData& data) {
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-  GetDocument()->SetEncodingData(data);
-}
-
-void HTMLDocumentParser::ValidateSpeculations(
-    std::unique_ptr<TokenizedChunk> chunk) {
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-  DCHECK(chunk);
-  // TODO(kouhei): We should simplify codepath here by disallowing
-  // ValidateSpeculations
-  // while IsPaused, and last_chunk_before_pause_ can simply be
-  // pushed to speculations_.
-  if (IsPaused()) {
-    // We're waiting on a network script or stylesheet, just save the chunk,
-    // we'll get a second ValidateSpeculations call after the script or
-    // stylesheet completes. This call should have been made immediately after
-    // RunScriptsForPausedTreeBuilder in the script case which may have started
-    // a network load and left us waiting.
-    DCHECK(!last_chunk_before_pause_);
-    last_chunk_before_pause_ = std::move(chunk);
-    return;
-  }
-
-  DCHECK(!last_chunk_before_pause_);
-  std::unique_ptr<HTMLTokenizer> tokenizer = std::move(tokenizer_);
-  std::unique_ptr<HTMLToken> token = std::move(token_);
-
-  if (!tokenizer) {
-    // There must not have been any changes to the HTMLTokenizer state on the
-    // main thread, which means the speculation buffer is correct.
-    return;
-  }
-
-  // Currently we're only smart enough to reuse the speculation buffer if the
-  // tokenizer both starts and ends in the DataState. That state is simplest
-  // because the HTMLToken is always in the Uninitialized state. We should
-  // consider whether we can reuse the speculation buffer in other states, but
-  // we'd likely need to do something more sophisticated with the HTMLToken.
-  if (chunk->tokenizer_state == HTMLTokenizer::kDataState &&
-      tokenizer->GetState() == HTMLTokenizer::kDataState &&
-      input_.Current().IsEmpty() &&
-      chunk->tree_builder_state ==
-          HTMLTreeBuilderSimulator::StateFor(tree_builder_.Get())) {
-    DCHECK(token->IsUninitialized());
-    return;
-  }
-
-  DiscardSpeculationsAndResumeFrom(std::move(chunk), std::move(token),
-                                   std::move(tokenizer));
-}
-
-void HTMLDocumentParser::DiscardSpeculationsAndResumeFrom(
-    std::unique_ptr<TokenizedChunk> last_chunk_before_script,
-    std::unique_ptr<HTMLToken> token,
-    std::unique_ptr<HTMLTokenizer> tokenizer) {
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-  // Clear back ref.
-  background_parser_->ClearParser();
-
-  size_t discarded_token_count = 0;
-  for (const auto& speculation : speculations_) {
-    discarded_token_count += speculation->tokens.size();
-  }
-  g_discarded_token_count_for_testing += discarded_token_count;
-
-  speculations_.clear();
-  pending_csp_meta_token_ = nullptr;
-  queued_preloads_.clear();
-
-  std::unique_ptr<BackgroundHTMLParser::Checkpoint> checkpoint =
-      std::make_unique<BackgroundHTMLParser::Checkpoint>();
-  checkpoint->parser = this;
-  checkpoint->token = std::move(token);
-  checkpoint->tokenizer = std::move(tokenizer);
-  checkpoint->tree_builder_state =
-      HTMLTreeBuilderSimulator::StateFor(tree_builder_.Get());
-  checkpoint->input_checkpoint = last_chunk_before_script->input_checkpoint;
-  checkpoint->preload_scanner_checkpoint =
-      last_chunk_before_script->preload_scanner_checkpoint;
-  checkpoint->unparsed_input = input_.Current().ToString().IsolatedCopy();
-  // FIXME: This should be passed in instead of cleared.
-  input_.Current().Clear();
-
-  DCHECK(checkpoint->unparsed_input.IsSafeToSendToAnotherThread());
-  loading_task_runner_->PostTask(
-      FROM_HERE, WTF::Bind(&BackgroundHTMLParser::ResumeFrom,
-                           background_parser_, std::move(checkpoint)));
-}
-
-wtf_size_t HTMLDocumentParser::ProcessTokenizedChunkFromBackgroundParser(
-    std::unique_ptr<TokenizedChunk> pop_chunk,
-    bool* reached_end_of_file) {
-  TRACE_EVENT_WITH_FLOW0(
-      "blink,loading",
-      "HTMLDocumentParser::processTokenizedChunkFromBackgroundParser",
-      pop_chunk.get(), TRACE_EVENT_FLAG_FLOW_IN);
-  base::AutoReset<bool> has_line_number(&is_parsing_at_line_number_, true);
-
-  SECURITY_DCHECK(pump_speculations_session_nesting_level_ == 1);
-  SECURITY_DCHECK(!InPumpSession());
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-  DCHECK(!IsParsingFragment());
-  DCHECK(!IsPaused());
-  DCHECK(!IsStopped());
-  DCHECK(CanParseAsynchronously());
-  DCHECK(!tokenizer_);
-  DCHECK(!token_);
-  DCHECK(!last_chunk_before_pause_);
-
-  std::unique_ptr<TokenizedChunk> chunk(std::move(pop_chunk));
-  const CompactHTMLTokenStream& tokens = chunk->tokens;
-  wtf_size_t element_token_count = 0;
-
-  loading_task_runner_->PostTask(
-      FROM_HERE, WTF::Bind(&BackgroundHTMLParser::StartedChunkWithCheckpoint,
-                           background_parser_, chunk->input_checkpoint));
-
-  for (const auto& token : tokens) {
-    DCHECK(!IsWaitingForScripts());
-
-    if (!chunk->starting_script && (token.GetType() == HTMLToken::kStartTag ||
-                                    token.GetType() == HTMLToken::kEndTag))
-      element_token_count++;
-
-    text_position_ = token.GetTextPosition();
-
-    ConstructTreeFromCompactHTMLToken(token);
-
-    if (IsStopped())
-      break;
-
-    // Preloads were queued if there was a <meta> csp token in a tokenized
-    // chunk.
-    if (pending_csp_meta_token_ && &token == pending_csp_meta_token_) {
-      pending_csp_meta_token_ = nullptr;
-      FetchQueuedPreloads();
-    }
-
-    if (IsPaused()) {
-      // The script or stylesheet should be the last token of this bunch.
-      DCHECK_EQ(&token, &tokens.back());
-      if (IsWaitingForScripts())
-        RunScriptsForPausedTreeBuilder();
-      ValidateSpeculations(std::move(chunk));
-      break;
-    }
-
-    if (token.GetType() == HTMLToken::kEndOfFile) {
-      // The EOF is assumed to be the last token of this bunch.
-      DCHECK_EQ(&token, &tokens.back());
-      // There should never be any chunks after the EOF.
-      DCHECK(speculations_.IsEmpty());
-      PrepareToStopParsing();
-      *reached_end_of_file = true;
-      break;
-    }
-
-    DCHECK(!tokenizer_);
-    DCHECK(!token_);
-  }
-
-  // Make sure all required pending text nodes are emitted before returning.
-  // This leaves "script", "style" and "svg" nodes text nodes intact.
-  if (!IsStopped())
-    tree_builder_->Flush(kFlushIfAtTextLimit);
-
-  is_parsing_at_line_number_ = false;
-
-  return element_token_count;
-}
-
-void HTMLDocumentParser::PumpPendingSpeculations() {
-  // If this assert fails, you need to call ValidateSpeculations to make sure
-  // tokenizer_ and token_ don't have state that invalidates speculations_.
-  DCHECK(!tokenizer_);
-  DCHECK(!token_);
-  DCHECK(!last_chunk_before_pause_);
-  DCHECK(!IsPaused());
-  DCHECK(!IsStopped());
-  DCHECK(!IsScheduledForUnpause());
-  DCHECK(!InPumpSession());
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-
-  // FIXME: Here should never be reached when there is a blocking script,
-  // but it happens in unknown scenarios. See https://crbug.com/440901
-  if (IsWaitingForScripts()) {
-    parser_scheduler_->ScheduleForUnpause();
-    return;
-  }
-
-  // Do not allow pumping speculations in nested event loops.
-  if (pump_speculations_session_nesting_level_) {
-    parser_scheduler_->ScheduleForUnpause();
-    return;
-  }
-
-  probe::ParseHTML probe(GetDocument(), this);
-
-  SpeculationsPumpSession session(pump_speculations_session_nesting_level_);
-  bool reached_end_of_file = false;
-  while (!speculations_.IsEmpty()) {
-    DCHECK(!IsScheduledForUnpause());
-    wtf_size_t element_token_count = ProcessTokenizedChunkFromBackgroundParser(
-        speculations_.TakeFirst(), &reached_end_of_file);
-    session.AddedElementTokens(element_token_count);
-
-    // Always check IsParsing first as document_ may be null. Surprisingly,
-    // IsScheduledForUnpause() may be set here as a result of
-    // ProcessTokenizedChunkFromBackgroundParser running arbitrary javascript
-    // which invokes nested event loops. (e.g. inspector breakpoints)
-    CheckIfBlockingStylesheetAdded();
-    if (!IsParsing() || IsPaused() || IsScheduledForUnpause())
-      break;
-
-    if (speculations_.IsEmpty() ||
-        parser_scheduler_->YieldIfNeeded(
-            session, speculations_.front()->starting_script))
-      break;
-  }
-
-  if (metrics_reporter_) {
-    metrics_reporter_->AddChunk(session.ElapsedTime(),
-                                session.ProcessedElementTokens());
-    if (reached_end_of_file)
-      metrics_reporter_->ReportMetricsAtParseEnd(true);
-  }
-}
-
 void HTMLDocumentParser::ForcePlaintextForTextDocument() {
-  if (CanParseAsynchronously()) {
-    // This method is called before any data is appended, so we have to start
-    // the background parser ourselves.
-    if (!have_background_parser_)
-      StartBackgroundParser();
-
-    // This task should be synchronous, because otherwise synchronous
-    // tokenizing can happen before plaintext is forced.
-    background_parser_->ForcePlaintextForTextDocument();
-  } else
-    tokenizer_->SetState(HTMLTokenizer::kPLAINTEXTState);
+  tokenizer_->SetState(HTMLTokenizer::kPLAINTEXTState);
 }
 
 bool HTMLDocumentParser::PumpTokenizer() {
@@ -990,7 +614,7 @@
   DCHECK(tokenizer_);
   DCHECK(token_);
 
-  PumpSession session(pump_session_nesting_level_);
+  NestingLevelIncrementer session(pump_session_nesting_level_);
 
   // If we're in kForceSynchronousParsing, always run until all available input
   // is consumed.
@@ -1091,7 +715,6 @@
 
 void HTMLDocumentParser::SchedulePumpTokenizer() {
   TRACE_EVENT0("blink", "HTMLDocumentParser::SchedulePumpTokenizer");
-  DCHECK(RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
   DCHECK(!IsStopped());
   DCHECK(!InPumpSession());
   DCHECK(!task_runner_state_->ShouldComplete());
@@ -1110,7 +733,6 @@
 
 void HTMLDocumentParser::ScheduleEndIfDelayed() {
   TRACE_EVENT0("blink", "HTMLDocumentParser::ScheduleEndIfDelayed");
-  DCHECK(RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
   DCHECK(!IsStopped());
   DCHECK(!InPumpSession());
   DCHECK(!task_runner_state_->ShouldComplete());
@@ -1141,16 +763,11 @@
     }
   }
 
-  // We clear the token_ in case ConstructTreeFromAtomicToken
-  // synchronously re-enters the parser. We don't clear the token immediately
-  // for kCharacter tokens because the AtomicHTMLToken avoids copying the
-  // characters by keeping a pointer to the underlying buffer in the
-  // HTMLToken. Fortunately, kCharacter tokens can't cause us to re-enter
-  // the parser.
-  //
-  // FIXME: Stop clearing the token_ once we start running the parser off
-  // the main thread or once we stop allowing synchronous JavaScript
-  // execution from ParseAttribute.
+  // We clear the token_ in case ConstructTree() synchronously re-enters the
+  // parser. We don't clear the token immediately for kCharacter tokens because
+  // the AtomicHTMLToken avoids copying the characters by keeping a pointer to
+  // the underlying buffer in the HTMLToken. Fortunately, kCharacter tokens
+  // can't cause us to re-enter the parser.
   if (Token().GetType() != HTMLToken::kCharacter)
     Token().Clear();
 
@@ -1167,15 +784,6 @@
   }
 }
 
-void HTMLDocumentParser::ConstructTreeFromCompactHTMLToken(
-    const CompactHTMLToken& compact_token) {
-  DCHECK(!GetDocument()->IsPrefetchOnly());
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-  AtomicHTMLToken token(compact_token);
-  tree_builder_->ConstructTree(&token);
-  CheckIfBlockingStylesheetAdded();
-}
-
 bool HTMLDocumentParser::HasInsertionPoint() {
   // FIXME: The wasCreatedByScript() branch here might not be fully correct. Our
   // model of the EOF character differs slightly from the one in the spec
@@ -1192,13 +800,6 @@
   TRACE_EVENT2("blink", "HTMLDocumentParser::insert", "source_length",
                source.length(), "parser", (void*)this);
 
-  if (!tokenizer_) {
-    DCHECK(!InPumpSession());
-    DCHECK(have_background_parser_ || WasCreatedByScript());
-    token_ = std::make_unique<HTMLToken>();
-    tokenizer_ = std::make_unique<HTMLTokenizer>(options_);
-  }
-
   SegmentedString excluded_line_number_source(source);
   excluded_line_number_source.SetExcludeLineNumbers();
   input_.InsertAtCurrentInsertionPoint(excluded_line_number_source);
@@ -1225,60 +826,6 @@
   EndIfDelayed();
 }
 
-void HTMLDocumentParser::StartBackgroundParser() {
-  TRACE_EVENT0("blink,loading", "HTMLDocumentParser::StartBackgroundParser");
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-  DCHECK(!IsStopped());
-  DCHECK(CanParseAsynchronously());
-  DCHECK(!have_background_parser_);
-  DCHECK(GetDocument());
-  have_background_parser_ = true;
-
-  // Make sure that the viewport is up-to-date, so that the correct viewport
-  // dimensions will be fed to the background parser and preload scanner.
-  if (GetDocument()->Loader())
-    GetDocument()->GetStyleEngine().UpdateViewport();
-
-  std::unique_ptr<BackgroundHTMLParser::Configuration> config =
-      std::make_unique<BackgroundHTMLParser::Configuration>();
-  config->options = options_;
-  config->parser = this;
-  config->decoder = TakeDecoder();
-
-  // The background parser is created on the main thread, but may otherwise
-  // only be used from the parser thread.
-  background_parser_ =
-      BackgroundHTMLParser::Create(std::move(config), loading_task_runner_);
-  // TODO(csharrison): This is a hack to initialize MediaValuesCached on the
-  // correct thread. We should get rid of it.
-
-  // TODO(domfarolino): Remove this once Priority Hints is no longer in Origin
-  // Trial. This currently exists because the TokenPreloadScanner needs to know
-  // the status of the Priority Hints Origin Trial, and has no way of figuring
-  // this out on its own. See https://crbug.com/821464.
-  bool priority_hints_origin_trial_enabled =
-      RuntimeEnabledFeatures::PriorityHintsEnabled(
-          GetDocument()->GetExecutionContext());
-
-  background_parser_->Init(
-      GetDocument()->Url(),
-      std::make_unique<CachedDocumentParameters>(GetDocument()),
-      MediaValuesCached::MediaValuesCachedData(*GetDocument()),
-      priority_hints_origin_trial_enabled);
-}
-
-void HTMLDocumentParser::StopBackgroundParser() {
-  DCHECK(CanParseAsynchronously());
-  DCHECK(have_background_parser_);
-  DCHECK(!RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled());
-
-  have_background_parser_ = false;
-
-  // Make this sync, as lsan triggers on some unittests if the task runner is
-  // used.
-  background_parser_->Stop();
-}
-
 void HTMLDocumentParser::Append(const String& input_source) {
   TRACE_EVENT2("blink", "HTMLDocumentParser::append", "size",
                input_source.length(), "parser", (void*)this);
@@ -1286,17 +833,12 @@
   if (IsStopped())
     return;
 
-  // We should never reach this point if we're using a parser thread, as
-  // appendBytes() will directly ship the data to the thread.
-  DCHECK(!CanParseAsynchronously());
-
   const SegmentedString source(input_source);
 
   if (!preload_scanner_ && GetDocument()->Url().IsValid() &&
       (!task_runner_state_->IsSynchronous() ||
        GetDocument()->IsPrefetchOnly() || IsPaused())) {
-    // If we're operating with synchronous, budgeted foreground HTML parsing
-    // or using the background parser, need to create a preload scanner to
+    // If we're operating with a budget, we need to create a preload scanner to
     // make sure that parser-blocking Javascript requests are dispatched in
     // plenty of time, which prevents unnecessary delays.
     // When parsing without a budget (e.g. for HTML fragment parsing), it's
@@ -1375,10 +917,6 @@
 
 void HTMLDocumentParser::end() {
   DCHECK(!IsDetached());
-  DCHECK(!IsScheduledForUnpause());
-
-  if (have_background_parser_)
-    StopBackgroundParser();
 
   // Informs the the rest of WebCore that parsing is really finished (and
   // deletes this).
@@ -1392,9 +930,7 @@
 
 void HTMLDocumentParser::AttemptToRunDeferredScriptsAndEnd() {
   DCHECK(IsStopping());
-  // FIXME: It may not be correct to disable this for the background parser.
-  // That means hasInsertionPoint() may not be correct in some cases.
-  DCHECK(!HasInsertionPoint() || have_background_parser_);
+  DCHECK(!HasInsertionPoint());
   if (script_runner_ && !script_runner_->ExecuteScriptsWaitingForParsing())
     return;
   end();
@@ -1439,36 +975,12 @@
 }
 
 void HTMLDocumentParser::Finish() {
-  // FIXME: We should DCHECK(!parser_stopped_) here, since it does not makes
-  // sense to call any methods on DocumentParser once it's been stopped.
-  // However, FrameLoader::Stop calls DocumentParser::Finish unconditionally.
-
   ShouldCompleteScope should_complete(task_runner_state_);
   EndIfDelayedForbiddenScope should_not_end_if_delayed(task_runner_state_);
   Flush();
   if (IsDetached())
     return;
 
-  // Empty documents never got an append() call, and thus have never started a
-  // background parser. In those cases, we ignore CanParseAsynchronously() and
-  // fall through to the synchronous case.
-  if (have_background_parser_) {
-    if (!input_.HaveSeenEndOfFile())
-      input_.CloseWithoutMarkingEndOfFile();
-    loading_task_runner_->PostTask(
-        FROM_HERE,
-        WTF::Bind(&BackgroundHTMLParser::Finish, background_parser_));
-    return;
-  }
-
-  if (!tokenizer_) {
-    DCHECK(!token_);
-    // We're finishing before receiving any data. Rather than booting up the
-    // background parser just to spin it down, we finish parsing synchronously.
-    token_ = std::make_unique<HTMLToken>();
-    tokenizer_ = std::make_unique<HTMLTokenizer>(options_);
-  }
-
   // We're not going to get any more data off the network, so we tell the input
   // stream we've reached the end of file. finish() can be called more than
   // once, if the first time does not call end().
@@ -1491,25 +1003,11 @@
   return script_runner_->IsExecutingScript();
 }
 
-bool HTMLDocumentParser::IsParsingAtLineNumber() const {
-  if (CanParseAsynchronously()) {
-    return is_parsing_at_line_number_ &&
-           ScriptableDocumentParser::IsParsingAtLineNumber();
-  }
-  return ScriptableDocumentParser::IsParsingAtLineNumber();
-}
-
 OrdinalNumber HTMLDocumentParser::LineNumber() const {
-  if (have_background_parser_)
-    return text_position_.line_;
-
   return input_.Current().CurrentLine();
 }
 
 TextPosition HTMLDocumentParser::GetTextPosition() const {
-  if (have_background_parser_)
-    return text_position_;
-
   const SegmentedString& current_string = input_.Current();
   OrdinalNumber line = current_string.CurrentLine();
   OrdinalNumber column = current_string.CurrentColumn();
@@ -1548,56 +1046,24 @@
 }
 
 void HTMLDocumentParser::ResumeParsingAfterPause() {
-  // This function runs after a parser-blocking script has completed. There are
-  // four possible cases:
-  // 1) Parsing with kForceSynchronousParsing, where there is no background
-  //    parser and a tokenizer_'s defined.
-  // 2) Parsing with kAllowAsynchronousParsing, without a background parser. In
-  //    this case, the document is usually being completed or parsing has
-  //    otherwise stopped.
-  // 3) Parsing with kAllowAsynchronousParsing with a background parser. In this
-  //    case, need to add any pending speculations to the document.
-  // 4) Parsing with kAllowDeferredParsing, with a tokenizer_.
+  // This function runs after a parser-blocking script has completed.
   TRACE_EVENT1("blink", "HTMLDocumentParser::ResumeParsingAfterPause", "parser",
                (void*)this);
   DCHECK(!IsExecutingScript());
   DCHECK(!IsPaused());
 
   CheckIfBlockingStylesheetAdded();
-  if (IsStopped() || IsPaused())
+  if (IsStopped() || IsPaused() || IsDetached())
     return;
-
-  if (have_background_parser_) {  // Case 3)
-    // If we paused in the middle of processing a token chunk,
-    // deal with that before starting to pump.
-    if (last_chunk_before_pause_) {
-      ValidateSpeculations(std::move(last_chunk_before_pause_));
-      DCHECK(!last_chunk_before_pause_);
-      PumpPendingSpeculations();
-    } else if (!IsScheduledForUnpause()) {
-      // Otherwise, start pumping if we're not already scheduled to unpause
-      // already.
-      PumpPendingSpeculations();
-    }
-    return;
-  }
+  DCHECK(tokenizer_);
 
   insertion_preload_scanner_.reset();
-  if (tokenizer_) {
-    // Case 1) or 4): kForceSynchronousParsing, kAllowDeferredParsing.
-    // kForceSynchronousParsing must pump the tokenizer synchronously,
-    // otherwise it can be deferred.
-    if (task_runner_state_->GetMode() == kAllowDeferredParsing &&
-        !task_runner_state_->ShouldComplete() && !InPumpSession()) {
-      SchedulePumpTokenizer();
-    } else {
-      ShouldCompleteScope should_complete(task_runner_state_);
-      PumpTokenizerIfPossible();
-    }
+  if (task_runner_state_->GetMode() == kAllowDeferredParsing &&
+      !task_runner_state_->ShouldComplete() && !InPumpSession()) {
+    SchedulePumpTokenizer();
   } else {
-    // Case 2): kAllowAsynchronousParsing, no background parser available
-    // (indicating possible Document shutdown).
-    EndIfDelayed();
+    ShouldCompleteScope should_complete(task_runner_state_);
+    PumpTokenizerIfPossible();
   }
 }
 
@@ -1701,21 +1167,6 @@
   if (!length || IsStopped())
     return;
 
-  if (CanParseAsynchronously()) {
-    if (!have_background_parser_)
-      StartBackgroundParser();
-
-    std::unique_ptr<Vector<char>> buffer =
-        std::make_unique<Vector<char>>(length);
-    memcpy(buffer->data(), data, length);
-
-    loading_task_runner_->PostTask(
-        FROM_HERE,
-        WTF::Bind(&BackgroundHTMLParser::AppendRawBytesFromMainThread,
-                  background_parser_, std::move(buffer)));
-    return;
-  }
-
   DecodedDataDocumentParser::AppendBytes(data, length);
 }
 
@@ -1724,35 +1175,13 @@
   // If we've got no decoder, we never received any data.
   if (IsDetached() || NeedsDecoder())
     return;
-
-  if (CanParseAsynchronously()) {
-    // In some cases, flush() is called without any invocation of appendBytes.
-    // Fallback to synchronous parsing in that case.
-    if (!have_background_parser_) {
-      can_parse_asynchronously_ = false;
-      token_ = std::make_unique<HTMLToken>();
-      tokenizer_ = std::make_unique<HTMLTokenizer>(options_);
-      DecodedDataDocumentParser::Flush();
-      return;
-    }
-
-    loading_task_runner_->PostTask(
-        FROM_HERE, WTF::Bind(&BackgroundHTMLParser::Flush, background_parser_));
-  } else {
-    DecodedDataDocumentParser::Flush();
-  }
+  DecodedDataDocumentParser::Flush();
 }
 
 void HTMLDocumentParser::SetDecoder(
     std::unique_ptr<TextResourceDecoder> decoder) {
   DCHECK(decoder);
   DecodedDataDocumentParser::SetDecoder(std::move(decoder));
-
-  if (have_background_parser_) {
-    loading_task_runner_->PostTask(
-        FROM_HERE, WTF::Bind(&BackgroundHTMLParser::SetDecoder,
-                             background_parser_, TakeDecoder()));
-  }
 }
 
 void HTMLDocumentParser::DocumentElementAvailable() {
@@ -1795,7 +1224,7 @@
       scanner->Scan(GetDocument()->ValidBaseElementURL(), &viewport_description,
                     seen_csp_meta_tag);
   // Make sure that the viewport is up-to-date, so that the correct viewport
-  // dimensions will be fed to the background parser and preload scanner.
+  // dimensions will be fed to the preload scanner.
   if (GetDocument()->Loader() &&
       task_runner_state_->GetMode() == kAllowDeferredParsing) {
     if (viewport_description.has_value()) {
@@ -1836,11 +1265,6 @@
   DCHECK(preloader_);
   TRACE_EVENT0("blink", "HTMLDocumentParser::FetchQueuedPreloads");
 
-  if (CanParseAsynchronously()) {
-    if (pending_csp_meta_token_ || !GetDocument()->documentElement())
-      return;
-  }
-
   if (!queued_preloads_.IsEmpty()) {
     base::ElapsedTimer timer;
     preloader_->TakeAndPreload(queued_preloads_);
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.h b/third_party/blink/renderer/core/html/parser/html_document_parser.h
index 30da9905..9b4a25a4 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser.h
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser.h
@@ -33,14 +33,12 @@
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/parser_content_policy.h"
 #include "third_party/blink/renderer/core/dom/scriptable_document_parser.h"
-#include "third_party/blink/renderer/core/html/parser/background_html_input_stream.h"
 #include "third_party/blink/renderer/core/html/parser/html_input_stream.h"
 #include "third_party/blink/renderer/core/html/parser/html_parser_options.h"
 #include "third_party/blink/renderer/core/html/parser/html_parser_reentry_permit.h"
 #include "third_party/blink/renderer/core/html/parser/html_preload_scanner.h"
 #include "third_party/blink/renderer/core/html/parser/html_token.h"
 #include "third_party/blink/renderer/core/html/parser/html_tokenizer.h"
-#include "third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h"
 #include "third_party/blink/renderer/core/html/parser/parser_synchronization_policy.h"
 #include "third_party/blink/renderer/core/html/parser/preload_request.h"
 #include "third_party/blink/renderer/core/html/parser/text_resource_decoder.h"
@@ -53,15 +51,11 @@
 
 namespace blink {
 
-class BackgroundHTMLParser;
-class CompactHTMLToken;
 class Document;
-class DocumentEncodingData;
 class DocumentFragment;
 class Element;
 class HTMLDocument;
 class HTMLParserMetrics;
-class HTMLParserScheduler;
 class HTMLParserScriptRunner;
 class HTMLPreloadScanner;
 class HTMLResourcePreloader;
@@ -83,8 +77,6 @@
 
 class CORE_EXPORT HTMLDocumentParser : public ScriptableDocumentParser,
                                        private HTMLParserScriptRunnerHost {
-  USING_PRE_FINALIZER(HTMLDocumentParser, Dispose);
-
  public:
   HTMLDocumentParser(HTMLDocument&,
                      ParserSynchronizationPolicy,
@@ -96,12 +88,6 @@
   ~HTMLDocumentParser() override;
   void Trace(Visitor*) const override;
 
-  // TODO(alexclarke): Remove when background parser goes away.
-  void Dispose();
-
-  // Exposed for HTMLParserScheduler
-  void ResumeParsingAfterYield();
-
   static void ParseDocumentFragment(
       const String&,
       DocumentFragment*,
@@ -112,41 +98,17 @@
   HTMLParserScriptRunnerHost* AsHTMLParserScriptRunnerHostForTesting() {
     return this;
   }
-  // Returns true if any tokenizer pumps / end if delayed / asynchronous work is
-  // scheduled. Exposed so that tests can check that the parser's exited in a
-  // good state.
+  // Returns true if any tokenizer pumps / end if delayed work is scheduled.
+  // Exposed so that tests can check that the parser's exited in a good state.
   bool HasPendingWorkScheduledForTesting() const;
 
   HTMLTokenizer* Tokenizer() const { return tokenizer_.get(); }
 
   TextPosition GetTextPosition() const final;
-  bool IsParsingAtLineNumber() const final;
   OrdinalNumber LineNumber() const final;
 
   HTMLParserReentryPermit* ReentryPermit() { return reentry_permit_.Get(); }
 
-  struct TokenizedChunk {
-    USING_FAST_MALLOC(TokenizedChunk);
-
-   public:
-    CompactHTMLTokenStream tokens;
-    PreloadRequestStream preloads;
-    absl::optional<ViewportDescription> viewport;
-    HTMLTokenizer::State tokenizer_state;
-    HTMLTreeBuilderSimulator::State tree_builder_state;
-    HTMLInputCheckpoint input_checkpoint;
-    TokenPreloadScannerCheckpoint preload_scanner_checkpoint;
-    bool starting_script;
-    // Index into |tokens| of the last <meta> csp tag in |tokens|. Preloads will
-    // be deferred until this token is parsed. Will be noPendingToken if there
-    // are no csp tokens.
-    int pending_csp_meta_token_index;
-
-    static constexpr int kNoPendingToken = -1;
-  };
-  void EnqueueTokenizedChunk(std::unique_ptr<TokenizedChunk>);
-  void DidReceiveEncodingDataFromBackgroundParser(const DocumentEncodingData&);
-
   void AppendBytes(const char* bytes, size_t length) override;
   void Flush() final;
   void SetDecoder(std::unique_ptr<TextResourceDecoder>) final;
@@ -188,23 +150,9 @@
   // HTMLParserScriptRunnerHost
   void NotifyScriptLoaded() final;
   HTMLInputStream& InputStream() final { return input_; }
-  bool HasPreloadScanner() const final {
-    return preload_scanner_.get() && !CanParseAsynchronously();
-  }
+  bool HasPreloadScanner() const final { return preload_scanner_.get(); }
   void AppendCurrentInputStreamToPreloadScannerAndScan() final;
 
-  void StartBackgroundParser();
-  void StopBackgroundParser();
-  void ValidateSpeculations(std::unique_ptr<TokenizedChunk> last_chunk);
-  void DiscardSpeculationsAndResumeFrom(
-      std::unique_ptr<TokenizedChunk> last_chunk,
-      std::unique_ptr<HTMLToken>,
-      std::unique_ptr<HTMLTokenizer>);
-  wtf_size_t ProcessTokenizedChunkFromBackgroundParser(
-      std::unique_ptr<TokenizedChunk>,
-      bool*);
-  void PumpPendingSpeculations();
-
   NextTokenStatus CanTakeNextToken();
   bool PumpTokenizer();
   void PumpTokenizerIfPossible();
@@ -212,7 +160,6 @@
   void SchedulePumpTokenizer();
   void ScheduleEndIfDelayed();
   void ConstructTreeFromHTMLToken();
-  void ConstructTreeFromCompactHTMLToken(const CompactHTMLToken&);
 
   void RunScriptsForPausedTreeBuilder();
   void ResumeParsingAfterPause();
@@ -227,10 +174,7 @@
   void AttemptToRunDeferredScriptsAndEnd();
   void end();
 
-  bool CanParseAsynchronously() const { return can_parse_asynchronously_; }
-
   bool IsParsingFragment() const;
-  bool IsScheduledForUnpause() const;
   bool InPumpSession() const { return pump_session_nesting_level_ > 0; }
   // ShouldDelayEnd assesses whether any resources, scripts or nested pumps are
   // delaying the end of parsing.
@@ -263,18 +207,7 @@
   std::unique_ptr<HTMLPreloadScanner> insertion_preload_scanner_;
 
   scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_;
-  Member<HTMLParserScheduler> parser_scheduler_;
-  TextPosition text_position_;
 
-  // FIXME: last_chunk_before_pause_, tokenizer_, token_, and input_ should be
-  // combined into a single state object so they can be set and cleared together
-  // and passed between threads together.
-  std::unique_ptr<TokenizedChunk> last_chunk_before_pause_;
-  Deque<std::unique_ptr<TokenizedChunk>> speculations_;
-  // Using WeakPtr for GarbageCollected is discouraged. But in this case this is
-  // ok because HTMLDocumentParser guarantees to revoke all WeakPtrs in the pre
-  // finalizer.
-  base::WeakPtr<BackgroundHTMLParser> background_parser_;
   Member<HTMLResourcePreloader> preloader_;
   Member<HTMLDocumentParserState> task_runner_state_;
   PreloadRequestStream queued_preloads_;
@@ -284,24 +217,11 @@
   // A timer for how long we are inactive after yielding
   std::unique_ptr<base::ElapsedTimer> yield_timer_;
 
-  // If this is non-null, then there is a meta CSP token somewhere in the
-  // speculation buffer. Preloads will be deferred until a token matching this
-  // pointer is parsed and the CSP policy is applied. Note that this pointer
-  // tracks the *last* meta token in the speculation buffer, so it overestimates
-  // how long to defer preloads. This is for simplicity, as the alternative
-  // would require keeping track of token positions of preload requests.
-  CompactHTMLToken* pending_csp_meta_token_;
-
-  bool can_parse_asynchronously_;
-  bool end_was_delayed_;
-  bool have_background_parser_;
+  ThreadScheduler* scheduler_;
   unsigned pump_session_nesting_level_;
-  unsigned pump_speculations_session_nesting_level_;
-  bool is_parsing_at_line_number_;
-  bool tried_loading_link_headers_;
+  bool end_was_delayed_;
   bool added_pending_parser_blocking_stylesheet_;
   bool is_waiting_for_stylesheets_;
-  ThreadScheduler* scheduler_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser_loading_test.cc b/third_party/blink/renderer/core/html/parser/html_document_parser_loading_test.cc
index abbfadc..0520e006 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser_loading_test.cc
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser_loading_test.cc
@@ -14,32 +14,13 @@
 
 namespace blink {
 
-class HTMLDocumentParserSimTest : public SimTest {
- protected:
-  HTMLDocumentParserSimTest()
-      : original_threaded_parsing_(
-            Document::ThreadedParsingEnabledForTesting()) {
-    ResetDiscardedTokenCountForTesting();
-    Document::SetThreadedParsingEnabledForTesting(true);
-  }
-  ~HTMLDocumentParserSimTest() override {
-    Document::SetThreadedParsingEnabledForTesting(original_threaded_parsing_);
-  }
-
- private:
-  bool original_threaded_parsing_;
-};
-
 class HTMLDocumentParserLoadingTest
-    : public HTMLDocumentParserSimTest,
-      public testing::WithParamInterface<ParserSynchronizationPolicy>,
-      private ScopedForceSynchronousHTMLParsingForTest {
+    : public SimTest,
+      public testing::WithParamInterface<ParserSynchronizationPolicy> {
  protected:
-  HTMLDocumentParserLoadingTest()
-      : ScopedForceSynchronousHTMLParsingForTest(GetParam() !=
-                                                 kAllowAsynchronousParsing) {
-    Document::SetThreadedParsingEnabledForTesting(GetParam() !=
-                                                  kForceSynchronousParsing);
+  HTMLDocumentParserLoadingTest() {
+    Document::SetForceSynchronousParsingForTesting(GetParam() ==
+                                                   kForceSynchronousParsing);
     platform_->SetAutoAdvanceNowToPendingTasks(false);
   }
   ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
@@ -49,7 +30,6 @@
 INSTANTIATE_TEST_SUITE_P(HTMLDocumentParserLoadingTest,
                          HTMLDocumentParserLoadingTest,
                          testing::Values(kAllowDeferredParsing,
-                                         kAllowAsynchronousParsing,
                                          kForceSynchronousParsing));
 
 TEST_P(HTMLDocumentParserLoadingTest,
@@ -431,97 +411,4 @@
   platform_->RunUntilIdle();
 }
 
-TEST_F(HTMLDocumentParserSimTest, NoRewindNoDocWrite) {
-  SimRequest main_resource("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-
-  main_resource.Complete(R"HTML(
-    <!DOCTYPE html>
-    <html><body>no doc write
-    </body></html>
-  )HTML");
-
-  test::RunPendingTasks();
-  EXPECT_EQ(0U, GetDiscardedTokenCountForTesting());
-}
-
-TEST_F(HTMLDocumentParserSimTest, RewindBrokenToken) {
-  SimRequest main_resource("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-
-  main_resource.Complete(R"HTML(
-    <!DOCTYPE html>
-    <script>
-    document.write('<a');
-    </script>
-  )HTML");
-
-  test::RunPendingTasks();
-  EXPECT_EQ(2U, GetDiscardedTokenCountForTesting());
-}
-
-TEST_F(HTMLDocumentParserSimTest, RewindDifferentNamespace) {
-  SimRequest main_resource("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-
-  main_resource.Complete(R"HTML(
-    <!DOCTYPE html>
-    <script>
-    document.write('<svg>');
-    </script>
-  )HTML");
-
-  test::RunPendingTasks();
-  EXPECT_EQ(2U, GetDiscardedTokenCountForTesting());
-}
-
-TEST_F(HTMLDocumentParserSimTest, NoRewindSaneDocWrite1) {
-  SimRequest main_resource("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-
-  main_resource.Complete(
-      "<!DOCTYPE html>"
-      "<script>"
-      "document.write('<script>console.log(\'hello world\');<\\/script>');"
-      "</script>");
-
-  test::RunPendingTasks();
-  EXPECT_EQ(0U, GetDiscardedTokenCountForTesting());
-}
-
-TEST_F(HTMLDocumentParserSimTest, NoRewindSaneDocWrite2) {
-  SimRequest main_resource("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-
-  main_resource.Complete(R"HTML(
-    <!DOCTYPE html>
-    <script>
-    document.write('<p>hello world<\\/p><a>yo');
-    </script>
-  )HTML");
-
-  test::RunPendingTasks();
-  EXPECT_EQ(0U, GetDiscardedTokenCountForTesting());
-}
-
-TEST_F(HTMLDocumentParserSimTest, NoRewindSaneDocWriteWithTitle) {
-  SimRequest main_resource("https://example.com/test.html", "text/html");
-  LoadURL("https://example.com/test.html");
-
-  main_resource.Complete(R"HTML(
-    <!DOCTYPE html>
-    <html>
-    <head>
-    <title></title>
-    <script>document.write('<p>testing');</script>
-    </head>
-    <body>
-    </body>
-    </html>
-  )HTML");
-
-  test::RunPendingTasks();
-  EXPECT_EQ(0U, GetDiscardedTokenCountForTesting());
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc b/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc
index 553238a2..f5392e8 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser_test.cc
@@ -34,22 +34,20 @@
 
 class HTMLDocumentParserTest
     : public PageTestBase,
-      public testing::WithParamInterface<ParserSynchronizationPolicy>,
-      private ScopedForceSynchronousHTMLParsingForTest {
+      public testing::WithParamInterface<ParserSynchronizationPolicy> {
  protected:
   HTMLDocumentParserTest()
-      : ScopedForceSynchronousHTMLParsingForTest(Policy() !=
-                                                 kAllowAsynchronousParsing),
-        original_threaded_parsing_(
-            Document::ThreadedParsingEnabledForTesting()) {
-    Document::SetThreadedParsingEnabledForTesting(Policy() !=
-                                                  kForceSynchronousParsing);
+      : original_force_synchronous_parsing_for_testing_(
+            Document::ForceSynchronousParsingForTesting()) {
+    Document::SetForceSynchronousParsingForTesting(Policy() ==
+                                                   kForceSynchronousParsing);
   }
   ~HTMLDocumentParserTest() override {
     // Finish the pending tasks which may require the runtime enabled flags,
     // before restoring the flags.
     base::RunLoop().RunUntilIdle();
-    Document::SetThreadedParsingEnabledForTesting(original_threaded_parsing_);
+    Document::SetForceSynchronousParsingForTesting(
+        original_force_synchronous_parsing_for_testing_);
   }
 
   void SetUp() override {
@@ -69,7 +67,7 @@
  private:
   ParserSynchronizationPolicy Policy() const { return GetParam(); }
 
-  bool original_threaded_parsing_;
+  bool original_force_synchronous_parsing_for_testing_;
 };
 
 }  // namespace
diff --git a/third_party/blink/renderer/core/html/parser/html_parser_metrics.cc b/third_party/blink/renderer/core/html/parser/html_parser_metrics.cc
index a8101e0..d98b3b6 100644
--- a/third_party/blink/renderer/core/html/parser/html_parser_metrics.cc
+++ b/third_party/blink/renderer/core/html/parser/html_parser_metrics.cc
@@ -48,42 +48,7 @@
   input_character_count += length;
 }
 
-void HTMLParserMetrics::ReportBackgroundParsingUMA() {
-  UMA_HISTOGRAM_COUNTS_1000("Blink.HTMLParsing.ChunkCount", chunk_count_);
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-      "Blink.HTMLParsing.ParsingTimeMax", max_parsing_time_,
-      base::Microseconds(1), base::Seconds(100), 1000);
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-      "Blink.HTMLParsing.ParsingTimeMin", min_parsing_time_,
-      base::Microseconds(1), base::Seconds(1), 100);
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-      "Blink.HTMLParsing.ParsingTimeTotal", accumulated_parsing_time_,
-      base::Microseconds(1), base::Seconds(100), 1000);
-  UMA_HISTOGRAM_COUNTS_1M("Blink.HTMLParsing.TokensParsedMax",
-                          max_tokens_parsed_);
-  UMA_HISTOGRAM_COUNTS_10000("Blink.HTMLParsing.TokensParsedMin",
-                             min_tokens_parsed_);
-  UMA_HISTOGRAM_COUNTS_1M("Blink.HTMLParsing.TokensParsedAverage",
-                          total_tokens_parsed_ / chunk_count_);
-  UMA_HISTOGRAM_COUNTS_10M("Blink.HTMLParsing.TokensParsedTotal",
-                           total_tokens_parsed_);
-
-  // Only report yield data if we actually yielded.
-  if (max_yield_interval_ != base::TimeDelta()) {
-    UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-        "Blink.HTMLParsing.YieldedTimeMax", max_yield_interval_,
-        base::Microseconds(1), base::Seconds(100), 1000);
-    UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-        "Blink.HTMLParsing.YieldedTimeMin", min_yield_interval_,
-        base::Microseconds(1), base::Seconds(10), 100);
-    UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
-        "Blink.HTMLParsing.YieldedTimeAverage",
-        accumulated_yield_intervals_ / yield_count_, base::Microseconds(1),
-        base::Seconds(10), 100);
-  }
-}
-
-void HTMLParserMetrics::ReportForcedSynchronousParsingUMA() {
+void HTMLParserMetrics::ReportUMAs() {
   UMA_HISTOGRAM_COUNTS_1000("Blink.HTMLParsing.ChunkCount2", chunk_count_);
   UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
       "Blink.HTMLParsing.ParsingTimeMax2", max_parsing_time_,
@@ -121,14 +86,11 @@
                            input_character_count);
 }
 
-void HTMLParserMetrics::ReportMetricsAtParseEnd(bool background_parsing) {
+void HTMLParserMetrics::ReportMetricsAtParseEnd() {
   if (!chunk_count_)
     return;
 
-  if (background_parsing)
-    ReportBackgroundParsingUMA();
-  else
-    ReportForcedSynchronousParsingUMA();
+  ReportUMAs();
 
   // Build and report UKM
   ukm::builders::Blink_HTMLParsing builder(source_id_);
diff --git a/third_party/blink/renderer/core/html/parser/html_parser_metrics.h b/third_party/blink/renderer/core/html/parser/html_parser_metrics.h
index 40db75a..a8297dc 100644
--- a/third_party/blink/renderer/core/html/parser/html_parser_metrics.h
+++ b/third_party/blink/renderer/core/html/parser/html_parser_metrics.h
@@ -29,11 +29,10 @@
 
   void AddInput(unsigned length);
 
-  void ReportMetricsAtParseEnd(bool background_parsing);
+  void ReportMetricsAtParseEnd();
 
  private:
-  void ReportBackgroundParsingUMA();
-  void ReportForcedSynchronousParsingUMA();
+  void ReportUMAs();
 
   // UKM System data.
   const int64_t source_id_;
diff --git a/third_party/blink/renderer/core/html/parser/html_parser_metrics_test.cc b/third_party/blink/renderer/core/html/parser/html_parser_metrics_test.cc
index cc0baf9..bbbf761 100644
--- a/third_party/blink/renderer/core/html/parser/html_parser_metrics_test.cc
+++ b/third_party/blink/renderer/core/html/parser/html_parser_metrics_test.cc
@@ -16,16 +16,11 @@
 
 namespace blink {
 
-class HTMLBackgroundParserMetricsTest
-    : public testing::Test,
-      private ScopedForceSynchronousHTMLParsingForTest {
+class HTMLMetricsTest : public testing::Test {
  public:
-  HTMLBackgroundParserMetricsTest()
-      : ScopedForceSynchronousHTMLParsingForTest(false) {
-    helper_.Initialize(nullptr, nullptr, nullptr);
-  }
+  HTMLMetricsTest() { helper_.Initialize(nullptr, nullptr, nullptr); }
 
-  ~HTMLBackgroundParserMetricsTest() override = default;
+  ~HTMLMetricsTest() override = default;
 
   void SetUp() override {}
 
@@ -41,185 +36,19 @@
   frame_test_helpers::WebViewHelper helper_;
 };
 
-class HTMLForceSynchronousParserMetricsTest
-    : public testing::Test,
-      private ScopedForceSynchronousHTMLParsingForTest {
- public:
-  HTMLForceSynchronousParserMetricsTest()
-      : ScopedForceSynchronousHTMLParsingForTest(true) {
-    helper_.Initialize(nullptr, nullptr, nullptr);
-  }
-
-  ~HTMLForceSynchronousParserMetricsTest() override = default;
-
-  void SetUp() override {}
-
-  void TearDown() override {}
-
-  void LoadHTML(const std::string& html) {
-    frame_test_helpers::LoadHTMLString(helper_.GetWebView()->MainFrameImpl(),
-                                       html,
-                                       url_test_helpers::ToKURL("about:blank"));
-  }
-
- protected:
-  frame_test_helpers::WebViewHelper helper_;
-};
-
-TEST_F(HTMLBackgroundParserMetricsTest, ReportSingleChunk) {
-  // Although the tests use a mock clock, the metrics recorder checks if the
-  // system has a high resolution clock before recording results. As a result,
-  // the tests will fail if the system does not have a high resolution clock.
-  if (!base::TimeTicks::IsHighResolution())
-    return;
-
-  base::HistogramTester histogram_tester;
-  LoadHTML(R"HTML(
-    <div></div>
-  )HTML");
-
-  // Should have one of each metric, except the yield times because with
-  // a single chunk they should not report.
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ChunkCount", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ParsingTimeMax", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ParsingTimeMin", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ParsingTimeTotal", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedMax", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedMin", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedAverage", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedTotal", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.YieldedTimeMax", 0);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.YieldedTimeMin", 0);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.YieldedTimeAverage", 0);
-
-  // Expect specific values for the chunks and tokens counts
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.ChunkCount", 1, 1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedMax", 2,
-                                      1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedMin", 2,
-                                      1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedAverage",
-                                      2, 1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedTotal", 2,
-                                      1);
-
-  // Expect that the times have moved from the default and the max and min
-  // and total are all the same (within the same bucket)
-  std::vector<base::Bucket> parsing_time_max_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.ParsingTimeMax");
-  std::vector<base::Bucket> parsing_time_min_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.ParsingTimeMin");
-  std::vector<base::Bucket> parsing_time_total_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.ParsingTimeTotal");
-  EXPECT_EQ(parsing_time_max_buckets.size(), 1u);
-  EXPECT_EQ(parsing_time_min_buckets.size(), 1u);
-  EXPECT_EQ(parsing_time_total_buckets.size(), 1u);
-  EXPECT_GT(parsing_time_max_buckets[0].min, 0);
-  EXPECT_GT(parsing_time_min_buckets[0].min, 0);
-  EXPECT_GT(parsing_time_total_buckets[0].min, 0);
-}
-
-#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
-// https://crbug.com/1222653
-#define MAYBE_HistogramReportsTwoChunks DISABLED_HistogramReportsTwoChunks
-#else
-#define MAYBE_HistogramReportsTwoChunks HistogramReportsTwoChunks
-#endif
-TEST_F(HTMLBackgroundParserMetricsTest, MAYBE_HistogramReportsTwoChunks) {
-  // Although the tests use a mock clock, the metrics recorder checks if the
-  // system has a high resolution clock before recording results. As a result,
-  // the tests will fail if the system does not have a high resolution clock.
-  if (!base::TimeTicks::IsHighResolution())
-    return;
-
-  base::HistogramTester histogram_tester;
-
-  // This content exceeds the number of tokens before a script tag used as
-  // the yield threshold. If the yield threshold changes, this test will fail
-  // and/or need changing. See the HTMLParserScheduler::ShouldYield method for
-  // the current value of the constant. The code below assumes 50 tokens.
-  LoadHTML(R"HTML(
-    <head></head>
-    <div></div><div></div><div></div><div></div><div></div><div></div>
-    <div></div><div></div><div></div><div></div><div></div><div></div>
-    <div></div><div></div><div></div><div></div><div></div><div></div>
-    <div></div><div></div><div></div><div></div><div></div><div></div>
-    <div></div><div></div><div></div><div></div><div></div><div></div> 63 tokens including this text token
-    <script>document.offsetTop</script>
-  )HTML");
-
-  // Comment this back in to see histogram values:
-  // LOG(ERROR) << histogram_tester.GetAllHistogramsRecorded();
-
-  // Should have one of each metric.
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ChunkCount", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ParsingTimeMax", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ParsingTimeMin", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.ParsingTimeTotal", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedMax", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedMin", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedAverage", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.TokensParsedTotal", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.YieldedTimeMax", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.YieldedTimeMin", 1);
-  histogram_tester.ExpectTotalCount("Blink.HTMLParsing.YieldedTimeAverage", 1);
-
-  // Expect specific values for the chunks and tokens counts
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.ChunkCount", 2, 1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedMax", 49,
-                                      1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedMin", 0,
-                                      1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedAverage",
-                                      28, 1);
-  histogram_tester.ExpectUniqueSample("Blink.HTMLParsing.TokensParsedTotal", 55,
-                                      1);
-
-  // For parse times, expect that the times have moved from the default.
-  std::vector<base::Bucket> parsing_time_max_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.ParsingTimeMax");
-  std::vector<base::Bucket> parsing_time_min_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.ParsingTimeMin");
-  std::vector<base::Bucket> parsing_time_total_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.ParsingTimeTotal");
-  EXPECT_EQ(parsing_time_max_buckets.size(), 1u);
-  EXPECT_EQ(parsing_time_min_buckets.size(), 1u);
-  EXPECT_EQ(parsing_time_total_buckets.size(), 1u);
-  EXPECT_GT(parsing_time_max_buckets[0].min, 0);
-  EXPECT_GT(parsing_time_min_buckets[0].min, 0);
-  EXPECT_GT(parsing_time_total_buckets[0].min, 0);
-
-  // For yields, the values should be the same because there was only one yield,
-  // but due to different histogram sizes we can't directly compare them.
-  std::vector<base::Bucket> yield_time_max_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.YieldedTimeMax");
-  std::vector<base::Bucket> yield_time_min_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.YieldedTimeMin");
-  std::vector<base::Bucket> yield_time_average_buckets =
-      histogram_tester.GetAllSamples("Blink.HTMLParsing.YieldedTimeAverage");
-  EXPECT_EQ(yield_time_max_buckets.size(), 1u);
-  EXPECT_EQ(yield_time_min_buckets.size(), 1u);
-  EXPECT_EQ(yield_time_average_buckets.size(), 1u);
-  EXPECT_GT(yield_time_max_buckets[0].min, 0);
-  EXPECT_GT(yield_time_min_buckets[0].min, 0);
-  EXPECT_GT(yield_time_average_buckets[0].min, 0);
-}
-
 #if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
 // https://crbug.com/1222653
 #define MAYBE_ReportSingleChunk DISABLED_ReportSingleChunk
 #else
 #define MAYBE_ReportSingleChunk ReportSingleChunk
 #endif
-TEST_F(HTMLForceSynchronousParserMetricsTest, MAYBE_ReportSingleChunk) {
+TEST_F(HTMLMetricsTest, MAYBE_ReportSingleChunk) {
   // Although the tests use a mock clock, the metrics recorder checks if the
   // system has a high resolution clock before recording results. As a result,
   // the tests will fail if the system does not have a high resolution clock.
   if (!base::TimeTicks::IsHighResolution())
     return;
 
-  ScopedForceSynchronousHTMLParsingForTest(true);
-
   base::HistogramTester histogram_tester;
   LoadHTML(R"HTML(
     <div></div>
@@ -270,15 +99,20 @@
                                       19, 1);
 }
 
-TEST_F(HTMLForceSynchronousParserMetricsTest, MAYBE_HistogramReportsTwoChunks) {
+#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64)
+// https://crbug.com/1222653
+#define MAYBE_HistogramReportsTwoChunks DISABLED_HistogramReportsTwoChunks
+#else
+#define MAYBE_HistogramReportsTwoChunks HistogramReportsTwoChunks
+#endif
+
+TEST_F(HTMLMetricsTest, MAYBE_HistogramReportsTwoChunks) {
   // Although the tests use a mock clock, the metrics recorder checks if the
   // system has a high resolution clock before recording results. As a result,
   // the tests will fail if the system does not have a high resolution clock.
   if (!base::TimeTicks::IsHighResolution())
     return;
 
-  ScopedForceSynchronousHTMLParsingForTest(true);
-
   base::HistogramTester histogram_tester;
 
   // This content processes many tokens before a script tag used as the yield
@@ -371,7 +205,7 @@
                                       1447, 1);
 }
 
-TEST_F(HTMLForceSynchronousParserMetricsTest, UkmStoresValuesCorrectly) {
+TEST_F(HTMLMetricsTest, UkmStoresValuesCorrectly) {
   // Although the tests use a mock clock, the metrics recorder checks if the
   // system has a high resolution clock before recording results. As a result,
   // the tests will fail if the system does not have a high resolution clock.
@@ -400,7 +234,7 @@
   reporter.AddChunk(second_parse_time, second_tokens_parsed);
   reporter.AddYieldInterval(second_yield_time);
   reporter.AddChunk(third_parse_time, third_tokens_parsed);
-  reporter.ReportMetricsAtParseEnd(false);
+  reporter.ReportMetricsAtParseEnd();
 
   // Check we have a single entry
   entries = recorder.GetEntriesByName("Blink.HTMLParsing");
diff --git a/third_party/blink/renderer/core/html/parser/html_parser_scheduler.cc b/third_party/blink/renderer/core/html/parser/html_parser_scheduler.cc
deleted file mode 100644
index 24c557d..0000000
--- a/third_party/blink/renderer/core/html/parser/html_parser_scheduler.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2010 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/core/html/parser/html_parser_scheduler.h"
-
-#include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/core/dom/document.h"
-#include "third_party/blink/renderer/core/frame/local_frame_view.h"
-#include "third_party/blink/renderer/core/html/parser/html_document_parser.h"
-#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
-#include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
-
-namespace blink {
-
-SpeculationsPumpSession::SpeculationsPumpSession(unsigned& nesting_level)
-    : NestingLevelIncrementer(nesting_level),
-      processed_element_tokens_(0) {}
-
-SpeculationsPumpSession::~SpeculationsPumpSession() = default;
-
-void SpeculationsPumpSession::AddedElementTokens(wtf_size_t count) {
-  processed_element_tokens_ += count;
-}
-
-HTMLParserScheduler::HTMLParserScheduler(
-    HTMLDocumentParser* parser,
-    scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner)
-    : parser_(parser), loading_task_runner_(std::move(loading_task_runner)) {}
-
-HTMLParserScheduler::~HTMLParserScheduler() = default;
-
-void HTMLParserScheduler::Trace(Visitor* visitor) const {
-  visitor->Trace(parser_);
-}
-
-bool HTMLParserScheduler::IsScheduledForUnpause() const {
-  return cancellable_continue_parse_task_handle_.IsActive();
-}
-
-void HTMLParserScheduler::ScheduleForUnpause() {
-  cancellable_continue_parse_task_handle_ =
-      PostCancellableTask(*loading_task_runner_, FROM_HERE,
-                          WTF::Bind(&HTMLParserScheduler::ContinueParsing,
-                                    WrapWeakPersistent(this)));
-}
-
-void HTMLParserScheduler::Detach() {
-  cancellable_continue_parse_task_handle_.Cancel();
-}
-
-inline bool HTMLParserScheduler::ShouldYield(
-    const SpeculationsPumpSession& session,
-    bool starting_script) const {
-  if (ThreadScheduler::Current()->ShouldYieldForHighPriorityWork())
-    return true;
-
-  const base::TimeDelta kParserTimeLimit = base::Milliseconds(500);
-  if (session.ElapsedTime() > kParserTimeLimit)
-    return true;
-
-  // Yield if a lot of DOM work has been done in this session and a script tag
-  // is about to be parsed. This significantly improves render performance for
-  // documents that place their scripts at the bottom of the page. Yielding too
-  // often significantly slows down the parsing so a balance needs to be struck
-  // to only yield when enough changes have happened to make it worthwhile.
-  // Emperical testing shows that anything > ~40 and < ~200 gives all of the
-  // benefit without impacting parser performance, only adding a few yields per
-  // page but at just the right times.
-  const size_t kSufficientWork = 50;
-  if (starting_script && session.ProcessedElementTokens() > kSufficientWork)
-    return true;
-
-  return false;
-}
-
-bool HTMLParserScheduler::YieldIfNeeded(const SpeculationsPumpSession& session,
-                                        bool starting_script) {
-  if (ShouldYield(session, starting_script)) {
-    ScheduleForUnpause();
-    return true;
-  }
-
-  return false;
-}
-
-void HTMLParserScheduler::ContinueParsing() {
-  parser_->ResumeParsingAfterYield();
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/html_parser_scheduler.h b/third_party/blink/renderer/core/html/parser/html_parser_scheduler.h
deleted file mode 100644
index 7244963..0000000
--- a/third_party/blink/renderer/core/html/parser/html_parser_scheduler.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2010 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_HTML_PARSER_SCHEDULER_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_HTML_PARSER_SCHEDULER_H_
-
-#include "base/memory/scoped_refptr.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/timer/elapsed_timer.h"
-#include "third_party/blink/renderer/core/html/parser/nesting_level_incrementer.h"
-#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
-#include "third_party/blink/renderer/platform/heap/member.h"
-#include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h"
-#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
-
-namespace blink {
-
-class HTMLDocumentParser;
-
-class SpeculationsPumpSession : public NestingLevelIncrementer {
-  STACK_ALLOCATED();
-
- public:
-  explicit SpeculationsPumpSession(unsigned& nesting_level);
-  ~SpeculationsPumpSession();
-
-  base::TimeDelta ElapsedTime() const { return start_time_.Elapsed(); }
-  void AddedElementTokens(wtf_size_t count);
-  wtf_size_t ProcessedElementTokens() const {
-    return processed_element_tokens_;
-  }
-
- private:
-  base::ElapsedTimer start_time_;
-  wtf_size_t processed_element_tokens_;
-};
-
-class HTMLParserScheduler final : public GarbageCollected<HTMLParserScheduler> {
- public:
-  HTMLParserScheduler(HTMLDocumentParser*,
-                      scoped_refptr<base::SingleThreadTaskRunner>);
-  HTMLParserScheduler(const HTMLParserScheduler&) = delete;
-  HTMLParserScheduler& operator=(const HTMLParserScheduler&) = delete;
-  ~HTMLParserScheduler();
-
-  bool IsScheduledForUnpause() const;
-  void ScheduleForUnpause();
-  bool YieldIfNeeded(const SpeculationsPumpSession&, bool starting_script);
-
-  void Detach();  // Clear active tasks if any.
-
-  void Trace(Visitor*) const;
-
- private:
-  bool ShouldYield(const SpeculationsPumpSession&, bool starting_script) const;
-  void ContinueParsing();
-
-  Member<HTMLDocumentParser> parser_;
-  scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_;
-
-  TaskHandle cancellable_continue_parse_task_handle_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_HTML_PARSER_SCHEDULER_H_
diff --git a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
index ed74a5a8..06421ea 100644
--- a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
+++ b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
@@ -83,10 +83,6 @@
   return q_name.LocalName() == name;
 }
 
-bool Match(const String& name, const QualifiedName& q_name) {
-  return ThreadSafeMatch(name, q_name);
-}
-
 const StringImpl* TagImplFor(const HTMLToken::DataVector& data) {
   AtomicString tag_name = data.AsAtomicString();
   const StringImpl* result = tag_name.Impl();
@@ -95,13 +91,6 @@
   return nullptr;
 }
 
-const StringImpl* TagImplFor(const String& tag_name) {
-  const StringImpl* result = tag_name.Impl();
-  if (result->IsStatic())
-    return result;
-  return nullptr;
-}
-
 String InitiatorFor(const StringImpl* tag_impl) {
   DCHECK(tag_impl);
   if (Match(tag_impl, html_names::kImgTag))
@@ -245,16 +234,6 @@
     PostProcessAfterAttributes();
   }
 
-  void ProcessAttributes(
-      const Vector<CompactHTMLToken::Attribute>& attributes) {
-    if (!tag_impl_)
-      return;
-    for (const CompactHTMLToken::Attribute& html_token_attribute : attributes)
-      ProcessAttribute(html_token_attribute.GetName(),
-                       html_token_attribute.Value());
-    PostProcessAfterAttributes();
-  }
-
   void PostProcessAfterAttributes() {
     if (Match(tag_impl_, html_names::kImgTag) ||
         (link_is_preload_ && as_attribute_value_ == "image"))
@@ -920,14 +899,6 @@
   ScanCommon(token, source, requests, viewport, is_csp_meta_tag);
 }
 
-void TokenPreloadScanner::Scan(const CompactHTMLToken& token,
-                               const SegmentedString& source,
-                               PreloadRequestStream& requests,
-                               absl::optional<ViewportDescription>* viewport,
-                               bool* is_csp_meta_tag) {
-  ScanCommon(token, source, requests, viewport, is_csp_meta_tag);
-}
-
 static void HandleMetaViewport(
     const String& attribute_value,
     const CachedDocumentParameters* document_parameters,
diff --git a/third_party/blink/renderer/core/html/parser/html_preload_scanner.h b/third_party/blink/renderer/core/html/parser/html_preload_scanner.h
index 32c94ef1..94753716 100644
--- a/third_party/blink/renderer/core/html/parser/html_preload_scanner.h
+++ b/third_party/blink/renderer/core/html/parser/html_preload_scanner.h
@@ -36,7 +36,6 @@
 #include "third_party/blink/renderer/core/css/media_values_cached.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
-#include "third_party/blink/renderer/core/html/parser/compact_html_token.h"
 #include "third_party/blink/renderer/core/html/parser/css_preload_scanner.h"
 #include "third_party/blink/renderer/core/html/parser/html_token.h"
 #include "third_party/blink/renderer/core/html/parser/preload_request.h"
@@ -96,11 +95,6 @@
             PreloadRequestStream& requests,
             absl::optional<ViewportDescription>*,
             bool* is_csp_meta_tag);
-  void Scan(const CompactHTMLToken&,
-            const SegmentedString&,
-            PreloadRequestStream& requests,
-            absl::optional<ViewportDescription>*,
-            bool* is_csp_meta_tag);
 
   void SetPredictedBaseElementURL(const KURL& url) {
     predicted_base_element_url_ = url;
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder.cc b/third_party/blink/renderer/core/html/parser/html_tree_builder.cc
index fe9cc65d..6763177 100644
--- a/third_party/blink/renderer/core/html/parser/html_tree_builder.cc
+++ b/third_party/blink/renderer/core/html/parser/html_tree_builder.cc
@@ -328,22 +328,22 @@
   else
     ProcessToken(token);
 
-  if (parser_->Tokenizer()) {
-    bool in_foreign_content = false;
-    if (!tree_.IsEmpty()) {
-      HTMLStackItem* adjusted_current_node = AdjustedCurrentStackItem();
-      in_foreign_content =
-          !adjusted_current_node->IsInHTMLNamespace() &&
-          !HTMLElementStack::IsHTMLIntegrationPoint(adjusted_current_node) &&
-          !HTMLElementStack::IsMathMLTextIntegrationPoint(
-              adjusted_current_node);
-    }
+  if (parser_->IsDetached())
+    return;
 
-    parser_->Tokenizer()->SetForceNullCharacterReplacement(
-        insertion_mode_ == kTextMode || in_foreign_content);
-    parser_->Tokenizer()->SetShouldAllowCDATA(in_foreign_content);
+  bool in_foreign_content = false;
+  if (!tree_.IsEmpty()) {
+    HTMLStackItem* adjusted_current_node = AdjustedCurrentStackItem();
+    in_foreign_content =
+        !adjusted_current_node->IsInHTMLNamespace() &&
+        !HTMLElementStack::IsHTMLIntegrationPoint(adjusted_current_node) &&
+        !HTMLElementStack::IsMathMLTextIntegrationPoint(adjusted_current_node);
   }
 
+  parser_->Tokenizer()->SetForceNullCharacterReplacement(
+      insertion_mode_ == kTextMode || in_foreign_content);
+  parser_->Tokenizer()->SetShouldAllowCDATA(in_foreign_content);
+
   tree_.ExecuteQueuedTasks();
   // We might be detached now.
 }
@@ -688,8 +688,7 @@
   if (token->GetName() == html_names::kPlaintextTag) {
     ProcessFakePEndTagIfPInButtonScope();
     tree_.InsertHTMLElement(token);
-    if (parser_->Tokenizer())
-      parser_->Tokenizer()->SetState(HTMLTokenizer::kPLAINTEXTState);
+    parser_->Tokenizer()->SetState(HTMLTokenizer::kPLAINTEXTState);
     return;
   }
   if (token->GetName() == html_names::kButtonTag) {
@@ -806,8 +805,7 @@
   if (token->GetName() == html_names::kTextareaTag) {
     tree_.InsertHTMLElement(token);
     should_skip_leading_newline_ = true;
-    if (parser_->Tokenizer())
-      parser_->Tokenizer()->SetState(HTMLTokenizer::kRCDATAState);
+    parser_->Tokenizer()->SetState(HTMLTokenizer::kRCDATAState);
     original_insertion_mode_ = insertion_mode_;
     frameset_ok_ = false;
     SetInsertionMode(kTextMode);
@@ -2230,11 +2228,9 @@
         tree_.OpenElements()->Pop();
         SetInsertionMode(original_insertion_mode_);
 
-        if (parser_->Tokenizer()) {
-          // We must set the tokenizer's state to DataState explicitly if the
-          // tokenizer didn't have a chance to.
-          parser_->Tokenizer()->SetState(HTMLTokenizer::kDataState);
-        }
+        // We must set the tokenizer's state to DataState explicitly if the
+        // tokenizer didn't have a chance to.
+        parser_->Tokenizer()->SetState(HTMLTokenizer::kDataState);
         return;
       }
       tree_.OpenElements()->Pop();
@@ -2767,8 +2763,7 @@
 void HTMLTreeBuilder::ProcessGenericRCDATAStartTag(AtomicHTMLToken* token) {
   DCHECK_EQ(token->GetType(), HTMLToken::kStartTag);
   tree_.InsertHTMLElement(token);
-  if (parser_->Tokenizer())
-    parser_->Tokenizer()->SetState(HTMLTokenizer::kRCDATAState);
+  parser_->Tokenizer()->SetState(HTMLTokenizer::kRCDATAState);
   original_insertion_mode_ = insertion_mode_;
   SetInsertionMode(kTextMode);
 }
@@ -2776,8 +2771,7 @@
 void HTMLTreeBuilder::ProcessGenericRawTextStartTag(AtomicHTMLToken* token) {
   DCHECK_EQ(token->GetType(), HTMLToken::kStartTag);
   tree_.InsertHTMLElement(token);
-  if (parser_->Tokenizer())
-    parser_->Tokenizer()->SetState(HTMLTokenizer::kRAWTEXTState);
+  parser_->Tokenizer()->SetState(HTMLTokenizer::kRAWTEXTState);
   original_insertion_mode_ = insertion_mode_;
   SetInsertionMode(kTextMode);
 }
@@ -2785,8 +2779,7 @@
 void HTMLTreeBuilder::ProcessScriptStartTag(AtomicHTMLToken* token) {
   DCHECK_EQ(token->GetType(), HTMLToken::kStartTag);
   tree_.InsertScriptElement(token);
-  if (parser_->Tokenizer())
-    parser_->Tokenizer()->SetState(HTMLTokenizer::kScriptDataState);
+  parser_->Tokenizer()->SetState(HTMLTokenizer::kScriptDataState);
   original_insertion_mode_ = insertion_mode_;
 
   TextPosition position = parser_->GetTextPosition();
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.cc b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.cc
deleted file mode 100644
index 54e29b4..0000000
--- a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.cc
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h"
-
-#include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
-#include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h"
-#include "third_party/blink/renderer/core/html/parser/html_tokenizer.h"
-#include "third_party/blink/renderer/core/html/parser/html_tree_builder.h"
-#include "third_party/blink/renderer/core/html_names.h"
-#include "third_party/blink/renderer/core/mathml_names.h"
-#include "third_party/blink/renderer/core/script/script_loader.h"
-#include "third_party/blink/renderer/core/svg_names.h"
-
-namespace blink {
-
-static bool TokenExitsForeignContent(const CompactHTMLToken& token) {
-  // FIXME: This is copied from HTMLTreeBuilder::processTokenInForeignContent
-  // and changed to use threadSafeHTMLNamesMatch.
-  const String& tag_name = token.Data();
-  return ThreadSafeMatch(tag_name, html_names::kBTag) ||
-         ThreadSafeMatch(tag_name, html_names::kBigTag) ||
-         ThreadSafeMatch(tag_name, html_names::kBlockquoteTag) ||
-         ThreadSafeMatch(tag_name, html_names::kBodyTag) ||
-         ThreadSafeMatch(tag_name, html_names::kBrTag) ||
-         ThreadSafeMatch(tag_name, html_names::kCenterTag) ||
-         ThreadSafeMatch(tag_name, html_names::kCodeTag) ||
-         ThreadSafeMatch(tag_name, html_names::kDdTag) ||
-         ThreadSafeMatch(tag_name, html_names::kDivTag) ||
-         ThreadSafeMatch(tag_name, html_names::kDlTag) ||
-         ThreadSafeMatch(tag_name, html_names::kDtTag) ||
-         ThreadSafeMatch(tag_name, html_names::kEmTag) ||
-         ThreadSafeMatch(tag_name, html_names::kEmbedTag) ||
-         ThreadSafeMatch(tag_name, html_names::kH1Tag) ||
-         ThreadSafeMatch(tag_name, html_names::kH2Tag) ||
-         ThreadSafeMatch(tag_name, html_names::kH3Tag) ||
-         ThreadSafeMatch(tag_name, html_names::kH4Tag) ||
-         ThreadSafeMatch(tag_name, html_names::kH5Tag) ||
-         ThreadSafeMatch(tag_name, html_names::kH6Tag) ||
-         ThreadSafeMatch(tag_name, html_names::kHeadTag) ||
-         ThreadSafeMatch(tag_name, html_names::kHrTag) ||
-         ThreadSafeMatch(tag_name, html_names::kITag) ||
-         ThreadSafeMatch(tag_name, html_names::kImgTag) ||
-         ThreadSafeMatch(tag_name, html_names::kLiTag) ||
-         ThreadSafeMatch(tag_name, html_names::kListingTag) ||
-         ThreadSafeMatch(tag_name, html_names::kMenuTag) ||
-         ThreadSafeMatch(tag_name, html_names::kMetaTag) ||
-         ThreadSafeMatch(tag_name, html_names::kNobrTag) ||
-         ThreadSafeMatch(tag_name, html_names::kOlTag) ||
-         ThreadSafeMatch(tag_name, html_names::kPTag) ||
-         ThreadSafeMatch(tag_name, html_names::kPreTag) ||
-         ThreadSafeMatch(tag_name, html_names::kRubyTag) ||
-         ThreadSafeMatch(tag_name, html_names::kSTag) ||
-         ThreadSafeMatch(tag_name, html_names::kSmallTag) ||
-         ThreadSafeMatch(tag_name, html_names::kSpanTag) ||
-         ThreadSafeMatch(tag_name, html_names::kStrongTag) ||
-         ThreadSafeMatch(tag_name, html_names::kStrikeTag) ||
-         ThreadSafeMatch(tag_name, html_names::kSubTag) ||
-         ThreadSafeMatch(tag_name, html_names::kSupTag) ||
-         ThreadSafeMatch(tag_name, html_names::kTableTag) ||
-         ThreadSafeMatch(tag_name, html_names::kTtTag) ||
-         ThreadSafeMatch(tag_name, html_names::kUTag) ||
-         ThreadSafeMatch(tag_name, html_names::kUlTag) ||
-         ThreadSafeMatch(tag_name, html_names::kVarTag) ||
-         (ThreadSafeMatch(tag_name, html_names::kFontTag) &&
-          (token.GetAttributeItem(html_names::kColorAttr) ||
-           token.GetAttributeItem(html_names::kFaceAttr) ||
-           token.GetAttributeItem(html_names::kSizeAttr)));
-}
-
-static bool TokenExitsMath(const CompactHTMLToken& token) {
-  // FIXME: This is copied from HTMLElementStack::isMathMLTextIntegrationPoint
-  // and changed to use threadSafeMatch.
-  const String& tag_name = token.Data();
-  return ThreadSafeMatch(tag_name, mathml_names::kMiTag) ||
-         ThreadSafeMatch(tag_name, mathml_names::kMoTag) ||
-         ThreadSafeMatch(tag_name, mathml_names::kMnTag) ||
-         ThreadSafeMatch(tag_name, mathml_names::kMsTag) ||
-         ThreadSafeMatch(tag_name, mathml_names::kMtextTag);
-}
-
-static bool TokenExitsInSelect(const CompactHTMLToken& token) {
-  // https://html.spec.whatwg.org/C/#parsing-main-inselect
-  const String& tag_name = token.Data();
-  return ThreadSafeMatch(tag_name, html_names::kInputTag) ||
-         ThreadSafeMatch(tag_name, html_names::kKeygenTag) ||
-         ThreadSafeMatch(tag_name, html_names::kTextareaTag);
-}
-
-HTMLTreeBuilderSimulator::HTMLTreeBuilderSimulator(
-    const HTMLParserOptions& options)
-    : options_(options), in_select_insertion_mode_(false) {
-  namespace_stack_.push_back(kHtml);
-}
-
-HTMLTreeBuilderSimulator::State HTMLTreeBuilderSimulator::StateFor(
-    HTMLTreeBuilder* tree_builder) {
-  DCHECK(IsMainThread());
-  State namespace_stack;
-  for (HTMLElementStack::ElementRecord* record =
-           tree_builder->OpenElements()->TopRecord();
-       record; record = record->Next()) {
-    Namespace current_namespace = kHtml;
-    if (record->NamespaceURI() == svg_names::kNamespaceURI)
-      current_namespace = kSvg;
-    else if (record->NamespaceURI() == mathml_names::kNamespaceURI)
-      current_namespace = kMathML;
-
-    if (namespace_stack.IsEmpty() ||
-        namespace_stack.back() != current_namespace)
-      namespace_stack.push_back(current_namespace);
-  }
-  namespace_stack.Reverse();
-  return namespace_stack;
-}
-
-HTMLTreeBuilderSimulator::SimulatedToken HTMLTreeBuilderSimulator::Simulate(
-    const CompactHTMLToken& token,
-    HTMLTokenizer* tokenizer) {
-  SimulatedToken simulated_token = kOtherToken;
-
-  if (token.GetType() == HTMLToken::kStartTag) {
-    const String& tag_name = token.Data();
-    if (ThreadSafeMatch(tag_name, svg_names::kSVGTag))
-      namespace_stack_.push_back(kSvg);
-    if (ThreadSafeMatch(tag_name, mathml_names::kMathTag))
-      namespace_stack_.push_back(kMathML);
-    if (InForeignContent() && TokenExitsForeignContent(token))
-      namespace_stack_.pop_back();
-    if (IsHTMLIntegrationPointForStartTag(token) ||
-        (namespace_stack_.back() == kMathML && TokenExitsMath(token))) {
-      namespace_stack_.push_back(kHtml);
-    } else if (!InForeignContent()) {
-      // FIXME: This is just a copy of Tokenizer::updateStateFor which uses
-      // threadSafeMatches.
-      if (ThreadSafeMatch(tag_name, html_names::kTextareaTag) ||
-          ThreadSafeMatch(tag_name, html_names::kTitleTag)) {
-        tokenizer->SetState(HTMLTokenizer::kRCDATAState);
-      } else if (ThreadSafeMatch(tag_name, html_names::kScriptTag)) {
-        tokenizer->SetState(HTMLTokenizer::kScriptDataState);
-
-        String type_attribute_value;
-        if (auto* item = token.GetAttributeItem(html_names::kTypeAttr)) {
-          type_attribute_value = item->Value();
-        }
-
-        String language_attribute_value;
-        if (auto* item = token.GetAttributeItem(html_names::kLanguageAttr)) {
-          language_attribute_value = item->Value();
-        }
-
-        if (ScriptLoader::GetScriptTypeAtPrepare(
-                type_attribute_value, language_attribute_value,
-                ScriptLoader::kAllowLegacyTypeInTypeAttribute) !=
-            ScriptLoader::ScriptTypeAtPrepare::kInvalid) {
-          simulated_token = kValidScriptStart;
-        }
-      } else if (ThreadSafeMatch(tag_name, html_names::kLinkTag)) {
-        simulated_token = kLink;
-
-      } else if (ThreadSafeMatch(tag_name, html_names::kTemplateTag)) {
-        TemplateType template_type = TemplateType::kRegular;
-        if (auto* item = token.GetAttributeItem(html_names::kShadowrootAttr)) {
-          String shadow_mode = item->Value();
-          if (EqualIgnoringASCIICase(shadow_mode, "open") ||
-              EqualIgnoringASCIICase(shadow_mode, "closed")) {
-            template_type = TemplateType::kShadow;
-          }
-        }
-        template_stack_.push_back(template_type);
-      } else if (!in_select_insertion_mode_) {
-        // If we're in the "in select" insertion mode, all of these tags are
-        // ignored, so we shouldn't change the tokenizer state:
-        // https://html.spec.whatwg.org/C/#parsing-main-inselect
-        if (ThreadSafeMatch(tag_name, html_names::kPlaintextTag) &&
-            !in_select_insertion_mode_) {
-          tokenizer->SetState(HTMLTokenizer::kPLAINTEXTState);
-        } else if (ThreadSafeMatch(tag_name, html_names::kStyleTag) ||
-                   ThreadSafeMatch(tag_name, html_names::kIFrameTag) ||
-                   ThreadSafeMatch(tag_name, html_names::kXmpTag) ||
-                   ThreadSafeMatch(tag_name, html_names::kNoembedTag) ||
-                   ThreadSafeMatch(tag_name, html_names::kNoframesTag) ||
-                   (ThreadSafeMatch(tag_name, html_names::kNoscriptTag) &&
-                    options_.scripting_flag)) {
-          tokenizer->SetState(HTMLTokenizer::kRAWTEXTState);
-        }
-      }
-
-      // We need to track whether we're in the "in select" insertion mode
-      // in order to determine whether '<plaintext>' will put the tokenizer
-      // into PLAINTEXTState, and whether '<xmp>' and others will consume
-      // textual content.
-      //
-      // https://html.spec.whatwg.org/C/#parsing-main-inselect
-      if (ThreadSafeMatch(tag_name, html_names::kSelectTag)) {
-        in_select_insertion_mode_ = true;
-      } else if (in_select_insertion_mode_ && TokenExitsInSelect(token)) {
-        in_select_insertion_mode_ = false;
-      }
-    }
-  }
-  if (token.GetType() == HTMLToken::kEndTag && InForeignContent()) {
-    const String& tag_name = token.Data();
-    if (ThreadSafeMatch(tag_name, html_names::kPTag) ||
-        ThreadSafeMatch(tag_name, html_names::kBrTag)) {
-      namespace_stack_.pop_back();
-    }
-  }
-  if (token.GetType() == HTMLToken::kEndTag ||
-      (token.GetType() == HTMLToken::kStartTag && token.SelfClosing() &&
-       InForeignContent())) {
-    const String& tag_name = token.Data();
-    if ((namespace_stack_.back() == kSvg &&
-         ThreadSafeMatch(tag_name, svg_names::kSVGTag)) ||
-        (namespace_stack_.back() == kMathML &&
-         ThreadSafeMatch(tag_name, mathml_names::kMathTag)) ||
-        IsHTMLIntegrationPointForEndTag(token) ||
-        (namespace_stack_.Contains(kMathML) &&
-         namespace_stack_.back() == kHtml && TokenExitsMath(token))) {
-      namespace_stack_.pop_back();
-    }
-    if (ThreadSafeMatch(tag_name, html_names::kScriptTag)) {
-      if (!InForeignContent())
-        tokenizer->SetState(HTMLTokenizer::kDataState);
-      return kScriptEnd;
-    }
-    if (ThreadSafeMatch(tag_name, html_names::kSelectTag))
-      in_select_insertion_mode_ = false;
-    if (ThreadSafeMatch(tag_name, html_names::kStyleTag))
-      simulated_token = kStyleEnd;
-
-    if (ThreadSafeMatch(tag_name, html_names::kTemplateTag)) {
-      if (!template_stack_.IsEmpty()) {
-        TemplateType type = std::move(template_stack_.back());
-        template_stack_.pop_back();
-        if (type == TemplateType::kShadow)
-          simulated_token = kDeclarativeShadowDOMEnd;
-      }
-    }
-  }
-  if (token.GetType() == HTMLToken::kStartTag &&
-      simulated_token == kOtherToken) {
-    const String& tag_name = token.Data();
-    // Use the presence of a dash in the tag name as a proxy for
-    // "is a custom element".
-    if (tag_name.find('-') != kNotFound)
-      simulated_token = kCustomElementBegin;
-  }
-
-  // FIXME: Also setForceNullCharacterReplacement when in text mode.
-  tokenizer->SetForceNullCharacterReplacement(InForeignContent());
-  tokenizer->SetShouldAllowCDATA(InForeignContent());
-  return simulated_token;
-}
-
-// https://html.spec.whatwg.org/C/#html-integration-point
-bool HTMLTreeBuilderSimulator::IsHTMLIntegrationPointForStartTag(
-    const CompactHTMLToken& token) const {
-  DCHECK(token.GetType() == HTMLToken::kStartTag) << token.GetType();
-
-  Namespace tokens_ns = namespace_stack_.back();
-  const String& tag_name = token.Data();
-  if (tokens_ns == kMathML) {
-    if (!ThreadSafeMatch(tag_name, mathml_names::kAnnotationXmlTag))
-      return false;
-    if (auto* encoding = token.GetAttributeItem(mathml_names::kEncodingAttr)) {
-      return EqualIgnoringASCIICase(encoding->Value(), "text/html") ||
-             EqualIgnoringASCIICase(encoding->Value(), "application/xhtml+xml");
-    }
-  } else if (tokens_ns == kSvg) {
-    // FIXME: It's very fragile that we special case foreignObject here to be
-    // ASCII case-insensitive.
-    if (EqualIgnoringASCIICase(tag_name,
-                               svg_names::kForeignObjectTag.LocalName()))
-      return true;
-    return ThreadSafeMatch(tag_name, svg_names::kDescTag) ||
-           ThreadSafeMatch(tag_name, svg_names::kTitleTag);
-  }
-  return false;
-}
-
-// https://html.spec.whatwg.org/C/#html-integration-point
-bool HTMLTreeBuilderSimulator::IsHTMLIntegrationPointForEndTag(
-    const CompactHTMLToken& token) const {
-  if (token.GetType() != HTMLToken::kEndTag)
-    return false;
-
-  // If it's inside an HTML integration point, the top namespace is
-  // HTML, and its next namespace is not HTML.
-  if (namespace_stack_.back() != kHtml)
-    return false;
-  if (namespace_stack_.size() < 2)
-    return false;
-  Namespace tokens_ns = namespace_stack_[namespace_stack_.size() - 2];
-
-  const String& tag_name = token.Data();
-  if (tokens_ns == kMathML)
-    return ThreadSafeMatch(tag_name, mathml_names::kAnnotationXmlTag);
-  if (tokens_ns == kSvg) {
-    // FIXME: It's very fragile that we special case foreignObject here to be
-    // ASCII case-insensitive.
-    if (EqualIgnoringASCIICase(tag_name,
-                               svg_names::kForeignObjectTag.LocalName()))
-      return true;
-    return ThreadSafeMatch(tag_name, svg_names::kDescTag) ||
-           ThreadSafeMatch(tag_name, svg_names::kTitleTag);
-  }
-  return false;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h
deleted file mode 100644
index ec0565d..0000000
--- a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2013 Google, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GOOGLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_HTML_TREE_BUILDER_SIMULATOR_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_HTML_TREE_BUILDER_SIMULATOR_H_
-
-#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/html/parser/html_parser_options.h"
-#include "third_party/blink/renderer/platform/wtf/vector.h"
-
-namespace blink {
-
-class CompactHTMLToken;
-class HTMLTokenizer;
-class HTMLTreeBuilder;
-
-class CORE_EXPORT HTMLTreeBuilderSimulator {
-  USING_FAST_MALLOC(HTMLTreeBuilderSimulator);
-
- private:
-  enum Namespace { kHtml, kSvg, kMathML };
-
-  enum class TemplateType { kRegular, kShadow };
-
- public:
-  enum SimulatedToken {
-    kValidScriptStart,
-    kScriptEnd,
-    kLink,
-    kStyleEnd,
-    kCustomElementBegin,
-    kDeclarativeShadowDOMEnd,
-    kOtherToken
-  };
-
-  typedef Vector<Namespace, 1> State;
-
-  explicit HTMLTreeBuilderSimulator(const HTMLParserOptions&);
-
-  static State StateFor(HTMLTreeBuilder*);
-
-  const State& GetState() const { return namespace_stack_; }
-  void SetState(const State& state) { namespace_stack_ = state; }
-
-  SimulatedToken Simulate(const CompactHTMLToken&, HTMLTokenizer*);
-
- private:
-  bool InForeignContent() const { return namespace_stack_.back() != kHtml; }
-  bool IsHTMLIntegrationPointForStartTag(const CompactHTMLToken&) const;
-  bool IsHTMLIntegrationPointForEndTag(const CompactHTMLToken&) const;
-
-  HTMLParserOptions options_;
-  State namespace_stack_;
-  bool in_select_insertion_mode_;
-
-  // TODO(crbug.com/901056, masonfreed) Remove all of this template tracking
-  // code once the synchronous HTML parser lands.
-  Vector<TemplateType, 1> template_stack_;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_HTML_TREE_BUILDER_SIMULATOR_H_
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator_test.cc b/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator_test.cc
deleted file mode 100644
index e98c703..0000000
--- a/third_party/blink/renderer/core/html/parser/html_tree_builder_simulator_test.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/html/parser/html_tree_builder_simulator.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/renderer/core/html/parser/compact_html_token.h"
-#include "third_party/blink/renderer/core/html/parser/html_token.h"
-#include "third_party/blink/renderer/core/html/parser/html_tokenizer.h"
-
-namespace blink {
-
-TEST(HTMLTreeBuilderSimulatorTest, SelfClosingSVGFollowedByScript) {
-  HTMLParserOptions options;
-  HTMLTreeBuilderSimulator simulator(options);
-  std::unique_ptr<HTMLTokenizer> tokenizer =
-      std::make_unique<HTMLTokenizer>(options);
-  SegmentedString input("<svg/><script></script>");
-  HTMLToken token;
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_EQ(HTMLTreeBuilderSimulator::kOtherToken,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-
-  token.Clear();
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_EQ(HTMLTreeBuilderSimulator::kValidScriptStart,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-
-  EXPECT_EQ(HTMLTokenizer::kScriptDataState, tokenizer->GetState());
-
-  token.Clear();
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_EQ(HTMLTreeBuilderSimulator::kScriptEnd,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-}
-
-TEST(HTMLTreeBuilderSimulatorTest, SelfClosingMathFollowedByScript) {
-  HTMLParserOptions options;
-  HTMLTreeBuilderSimulator simulator(options);
-  std::unique_ptr<HTMLTokenizer> tokenizer =
-      std::make_unique<HTMLTokenizer>(options);
-  SegmentedString input("<math/><script></script>");
-  HTMLToken token;
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_EQ(HTMLTreeBuilderSimulator::kOtherToken,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-
-  token.Clear();
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_EQ(HTMLTreeBuilderSimulator::kValidScriptStart,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-
-  EXPECT_EQ(HTMLTokenizer::kScriptDataState, tokenizer->GetState());
-
-  token.Clear();
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_EQ(HTMLTreeBuilderSimulator::kScriptEnd,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-}
-
-TEST(HTMLTreeBuilderSimulatorTest, DetectInvalidScriptType) {
-  HTMLParserOptions options;
-  HTMLTreeBuilderSimulator simulator(options);
-  std::unique_ptr<HTMLTokenizer> tokenizer =
-      std::make_unique<HTMLTokenizer>(options);
-  SegmentedString input("<script type=\"text/html\"></script>");
-  HTMLToken token;
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_NE(HTMLTreeBuilderSimulator::kValidScriptStart,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-
-  token.Clear();
-  EXPECT_TRUE(tokenizer->NextToken(input, token));
-  EXPECT_EQ(HTMLTreeBuilderSimulator::kScriptEnd,
-            simulator.Simulate(
-                CompactHTMLToken(&token, TextPosition::MinimumPosition()),
-                tokenizer.get()));
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/parser_synchronization_policy.h b/third_party/blink/renderer/core/html/parser/parser_synchronization_policy.h
index 5283f13d..754016f 100644
--- a/third_party/blink/renderer/core/html/parser/parser_synchronization_policy.h
+++ b/third_party/blink/renderer/core/html/parser/parser_synchronization_policy.h
@@ -4,7 +4,6 @@
 namespace blink {
 
 enum ParserSynchronizationPolicy {
-  kAllowAsynchronousParsing,
   kAllowDeferredParsing,
   kForceSynchronousParsing,
 };
diff --git a/third_party/blink/renderer/core/html/parser/pump_session.cc b/third_party/blink/renderer/core/html/parser/pump_session.cc
deleted file mode 100644
index 39a80ae..0000000
--- a/third_party/blink/renderer/core/html/parser/pump_session.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/html/parser/pump_session.h"
-
-namespace blink {
-
-PumpSession::PumpSession(unsigned& nesting_level)
-    : NestingLevelIncrementer(nesting_level) {}
-
-PumpSession::~PumpSession() = default;
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/html/parser/pump_session.h b/third_party/blink/renderer/core/html/parser/pump_session.h
deleted file mode 100644
index 1c12ef9..0000000
--- a/third_party/blink/renderer/core/html/parser/pump_session.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_PUMP_SESSION_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_PUMP_SESSION_H_
-
-#include "third_party/blink/renderer/core/html/parser/nesting_level_incrementer.h"
-#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
-
-namespace blink {
-
-class PumpSession : public NestingLevelIncrementer {
-  STACK_ALLOCATED();
-
- public:
-  PumpSession(unsigned& nesting_level);
-  ~PumpSession();
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_PARSER_PUMP_SESSION_H_
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css
index 7dae30bf..35a7860 100644
--- a/third_party/blink/renderer/core/html/resources/html.css
+++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -1204,15 +1204,11 @@
   background-origin: content-box;
   background-repeat: no-repeat;
   background-size: contain;
-  height: 1.2em;
-  margin-inline-start: 24px;
+  height: 1.0em;
+  width: 1.0em;
   opacity: 1;
   outline: none;
-  padding-bottom: 2px;
-  padding-inline-start: 3px;
-  padding-inline-end: 3px;
-  padding-top: 2px;
-  width: 1.2em;
+  padding: 2px;
 }
 
 input[type="date" i]::-webkit-calendar-picker-indicator:focus-visible,
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc
index d3b0bbb..3029afd 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -3049,6 +3049,15 @@
     return;
   }
 
+  // All children are removed from the flow thread automatically eventually (via
+  // WillBeRemovedFromTree()), but that's a bit too late for us. The code
+  // section right below here might merge and remove anonymous blocks, and there
+  // may be column spanners inside an inline in these anonymous blocks. If these
+  // move around without telling the flow thread right away, it will get
+  // confused and crash.
+  if (UNLIKELY(old_child->IsInsideFlowThread()))
+    old_child->RemoveFromLayoutFlowThread();
+
   // If this child is a block, and if our previous and next siblings are both
   // anonymous blocks with inline content, then we can go ahead and fold the
   // inline content back together. If only one of the siblings is such an
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index 8cdabcfc..f8cb8572 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -457,7 +457,7 @@
       for (const NGPhysicalBoxFragment& fragment : box->PhysicalFragments()) {
         DCHECK_EQ(box, fragment.OwnerLayoutBox());
         fragment.AssertFragmentTreeChildren(
-            /* allow_destroyed */ display_locked);
+            /* allow_destroyed_or_moved */ display_locked);
       }
     }
     layout_object = layout_object->NextInPreOrder(this);
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 7b70775..a5965a3 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -1205,6 +1205,10 @@
     bitfields_.SetIsInsideFlowThread(inside_flow_thread);
   }
 
+  // Remove this object and all descendants from the containing
+  // LayoutFlowThread.
+  void RemoveFromLayoutFlowThread();
+
   // FIXME: Until all SVG layoutObjects can be subclasses of
   // LayoutSVGModelObject we have to add SVG layoutObject methods to
   // LayoutObject with an NOTREACHED() default implementation.
@@ -3656,10 +3660,6 @@
     bitfields_.SetEverHadLayout(true);
   }
 
-  // Remove this object and all descendants from the containing
-  // LayoutFlowThread.
-  void RemoveFromLayoutFlowThread();
-
   // See LocalVisualRect().
   virtual PhysicalRect LocalVisualRectIgnoringVisibility() const;
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
index b38d844..b3258b3 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragmentation_utils.cc
@@ -708,7 +708,9 @@
     // the way to the root of the fragmentation context without finding any such
     // container, we have no valid class A break point, and if a forced break
     // was requested, none will be inserted.
-    builder->SetInitialBreakBeforeIfNeeded(child.Style().BreakBefore());
+    EBreakBetween break_before = JoinFragmentainerBreakValues(
+        layout_result.InitialBreakBefore(), child.Style().BreakBefore());
+    builder->SetInitialBreakBeforeIfNeeded(break_before);
 
     // We also need to store the previous break-after value we've seen, since it
     // will serve as input to the next breakpoint (where we will combine the
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
index 4df668e..e73de04 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -1753,14 +1753,12 @@
 }
 
 void NGPhysicalBoxFragment::AssertFragmentTreeChildren(
-    bool allow_destroyed) const {
+    bool allow_destroyed_or_moved) const {
   if (const NGFragmentItems* items = Items()) {
     for (NGInlineCursor cursor(*this, *items); cursor; cursor.MoveToNext()) {
       const NGFragmentItem& item = *cursor.Current();
       if (item.IsLayoutObjectDestroyedOrMoved()) {
-        DCHECK(allow_destroyed);
-        DCHECK(!item.BoxFragment() ||
-               item.BoxFragment()->IsLayoutObjectDestroyedOrMoved());
+        DCHECK(allow_destroyed_or_moved);
         continue;
       }
       if (const auto* box = item.BoxFragment()) {
@@ -1773,7 +1771,7 @@
 
   for (const NGLink& child : Children()) {
     if (child->IsLayoutObjectDestroyedOrMoved()) {
-      DCHECK(allow_destroyed);
+      DCHECK(allow_destroyed_or_moved);
       continue;
     }
     if (const auto* box = DynamicTo<NGPhysicalBoxFragment>(child.fragment))
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
index 00a37a1..3ffbbb2 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h
@@ -400,7 +400,7 @@
 #if DCHECK_IS_ON()
   void InvalidateInkOverflow();
   void AssertFragmentTreeSelf() const;
-  void AssertFragmentTreeChildren(bool allow_destroyed = false) const;
+  void AssertFragmentTreeChildren(bool allow_destroyed_or_moved = false) const;
 #endif
 
  private:
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index e34edfb..f680ceb 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -292,6 +292,7 @@
   bool loading_main_document_from_mhtml_archive;
   bool loading_srcdoc;
   bool loading_url_as_empty_document;
+  bool is_static_data;
   CommitReason commit_reason;
   uint64_t main_resource_identifier;
   scoped_refptr<ResourceTimingInfo> navigation_timing_info;
@@ -316,6 +317,8 @@
   HashSet<KURL> early_hints_preloaded_resources;
   absl::optional<Vector<KURL>> ad_auction_components;
   bool anonymous;
+  bool waiting_for_document_loader;
+  bool waiting_for_code_cache;
 };
 
 // Asserts size of DocumentLoader, so that whenever a new attribute is added to
@@ -2510,12 +2513,9 @@
         window, &initiator_origin_trial_features_);
   }
 
-  ParserSynchronizationPolicy parsing_policy =
-      RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled()
-          ? kAllowDeferredParsing
-          : kAllowAsynchronousParsing;
+  ParserSynchronizationPolicy parsing_policy = kAllowDeferredParsing;
   if (IsJavaScriptURLOrXSLTCommit() ||
-      !Document::ThreadedParsingEnabledForTesting()) {
+      Document::ForceSynchronousParsingForTesting()) {
     parsing_policy = kForceSynchronousParsing;
   }
   const AtomicString& encoding = commit_reason_ == CommitReason::kXSLT
diff --git a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
index dd2675b9..e202b25 100644
--- a/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
+++ b/third_party/blink/renderer/core/mobile_metrics/mobile_friendliness_checker.cc
@@ -192,7 +192,7 @@
     if (!tap_targets->insert(object).is_new_entry)
       return false;
 
-    if (!rect.IsEmpty() && !tap_targets->insert(object).is_new_entry) {
+    if (!rect.IsEmpty()) {
       const int top = ClampTo<int>(rect.y() - finger_radius);
       const int bottom = ClampTo<int>(rect.bottom() + finger_radius);
       const int left = ClampTo<int>(rect.x() - finger_radius);
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc
index 7cc181d..7872c50 100644
--- a/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc
+++ b/third_party/blink/renderer/core/scheduler_integration_tests/throttling_test.cc
@@ -16,6 +16,7 @@
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
 #include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
+#include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
 
 using testing::AnyOf;
 using testing::ElementsAre;
@@ -241,6 +242,63 @@
   EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(5, console_message));
 }
 
+class AbortSignalTimeoutThrottlingTest : public BackgroundPageThrottlingTest {
+ public:
+  AbortSignalTimeoutThrottlingTest()
+      : console_message_(BuildTimerConsoleMessage()) {}
+
+  String GetTestSource(wtf_size_t iterations, wtf_size_t timeout) {
+    return String::Format(
+        "(<script>"
+        "  let count = 0;"
+        "  function scheduleTimeout() {"
+        "    const signal = AbortSignal.timeout('%d');"
+        "    signal.onabort = () => {"
+        "      console.log('%s');"
+        "      if (++count < '%d') {"
+        "        scheduleTimeout();"
+        "      }"
+        "    }"
+        "  }"
+        "  scheduleTimeout();"
+        "</script>)",
+        timeout, console_message_.Utf8().c_str(), iterations);
+  }
+
+  const String& console_message() { return console_message_; }
+
+ protected:
+  const String console_message_;
+};
+
+TEST_F(AbortSignalTimeoutThrottlingTest, TimeoutsThrottledInBackgroundPage) {
+  SimRequest main_resource("https://example.com/", "text/html");
+  LoadURL("https://example.com/");
+  main_resource.Complete(GetTestSource(/*iterations=*/20, /*timeout=*/10));
+
+  GetDocument().GetPage()->GetPageScheduler()->SetPageVisible(false);
+
+  // Make sure that we run no more than one task a second.
+  platform_->RunForPeriod(base::Seconds(3));
+  EXPECT_THAT(FilteredConsoleMessages(), Vector<String>(3, console_message()));
+}
+
+TEST_F(AbortSignalTimeoutThrottlingTest, ZeroMsTimersNotThrottled) {
+  SimRequest main_resource("https://example.com/", "text/html");
+  LoadURL("https://example.com/");
+
+  constexpr wtf_size_t kIterations = 20;
+  main_resource.Complete(GetTestSource(kIterations, /*timeout=*/0));
+
+  GetDocument().GetPage()->GetPageScheduler()->SetPageVisible(false);
+
+  // All tasks should run after 1 ms since time does not advance during the
+  // test, the timeout was 0 ms, and the timeouts are not throttled.
+  platform_->RunForPeriod(base::Milliseconds(1));
+  EXPECT_THAT(FilteredConsoleMessages(),
+              Vector<String>(kIterations, console_message()));
+}
+
 namespace {
 
 class IntensiveWakeUpThrottlingTest : public ThrottlingTestBase {
diff --git a/third_party/blink/renderer/core/testing/sim/sim_test.cc b/third_party/blink/renderer/core/testing/sim/sim_test.cc
index 91cc253..f4553ed 100644
--- a/third_party/blink/renderer/core/testing/sim/sim_test.cc
+++ b/third_party/blink/renderer/core/testing/sim/sim_test.cc
@@ -19,7 +19,7 @@
 namespace blink {
 
 SimTest::SimTest() {
-  Document::SetThreadedParsingEnabledForTesting(false);
+  Document::SetForceSynchronousParsingForTesting(true);
   // Threaded animations are usually enabled for blink. However these tests use
   // synchronous compositing, which can not run threaded animations.
   bool was_threaded_animation_enabled =
@@ -30,7 +30,7 @@
 }
 
 SimTest::~SimTest() {
-  Document::SetThreadedParsingEnabledForTesting(true);
+  Document::SetForceSynchronousParsingForTesting(false);
   content::TestBlinkWebUnitTestSupport::SetThreadedAnimationEnabled(true);
   WebCache::Clear();
 }
diff --git a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h
index 1741b16..b1dccd8 100644
--- a/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h
+++ b/third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h
@@ -14,7 +14,7 @@
 
 namespace blink {
 
-class CORE_EXPORT DOMArrayBuffer final : public DOMArrayBufferBase {
+class CORE_EXPORT DOMArrayBuffer : public DOMArrayBufferBase {
   DEFINE_WRAPPERTYPEINFO();
   static const WrapperTypeInfo wrapper_type_info_body_;
 
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
index e5188a0..ddabbf3 100644
--- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
+++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
@@ -1832,10 +1832,8 @@
     if (!response_document_)
       return;
 
-    response_document_parser_ = response_document_->ImplicitOpen(
-        RuntimeEnabledFeatures::ForceSynchronousHTMLParsingEnabled()
-            ? kAllowDeferredParsing
-            : kAllowAsynchronousParsing);
+    response_document_parser_ =
+        response_document_->ImplicitOpen(kAllowDeferredParsing);
     response_document_parser_->AddClient(this);
   }
   DCHECK(response_document_parser_);
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 4a1d342..e3a819dd 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -867,6 +867,10 @@
 
   DCHECK(GetLayoutObject());
 
+  if (DisplayLockUtilities::LockedAncestorPreventingPaint(*GetLayoutObject())) {
+    return nullptr;
+  }
+
   if (GetLayoutObject()->IsBoxListMarkerIncludingNG()) {
     // A list marker should be followed by a list item on the same line.
     // Note that pseudo content is always included in the tree, so
@@ -1019,6 +1023,10 @@
 
   DCHECK(GetLayoutObject());
 
+  if (DisplayLockUtilities::LockedAncestorPreventingPaint(*GetLayoutObject())) {
+    return nullptr;
+  }
+
   AXObject* previous_sibling = AccessibilityIsIncludedInTree()
                                    ? PreviousSiblingIncludingIgnored()
                                    : nullptr;
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
index 0adb75b..7a9c43f 100644
--- a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
+++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
@@ -13,4 +13,5 @@
   any auctionSignals;
   any sellerSignals;
   record<USVString, any> perBuyerSignals;
+  sequence<AuctionAdConfig> componentAuctions;
 };
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 7ed09b3..69f57d5 100644
--- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
+++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -628,6 +628,58 @@
   return true;
 }
 
+// Attempts to convert the AuctionAdConfig `config`, passed in via Javascript,
+// to a `mojom::blink::AuctionAdConfig`. Throws a Javascript exception and
+// return null on failure.
+mojom::blink::AuctionAdConfigPtr IdlAuctionConfigToMojo(
+    bool is_top_level,
+    ScriptState& script_state,
+    const ExecutionContext& context,
+    ExceptionState& exception_state,
+    const AuctionAdConfig& config) {
+  auto mojo_config = mojom::blink::AuctionAdConfig::New();
+  mojo_config->auction_ad_config_non_shared_params =
+      mojom::blink::AuctionAdConfigNonSharedParams::New();
+  if (!CopySellerFromIdlToMojo(exception_state, config, *mojo_config) ||
+      !CopyDecisionLogicUrlFromIdlToMojo(context, exception_state, config,
+                                         *mojo_config) ||
+      !CopyTrustedScoringSignalsFromIdlToMojo(context, exception_state, config,
+                                              *mojo_config) ||
+      !CopyInterestGroupBuyersFromIdlToMojo(exception_state, config,
+                                            *mojo_config) ||
+      !CopyAuctionSignalsFromIdlToMojo(script_state, exception_state, config,
+                                       *mojo_config) ||
+      !CopySellerSignalsFromIdlToMojo(script_state, exception_state, config,
+                                      *mojo_config) ||
+      !CopyPerBuyerSignalsFromIdlToMojo(script_state, exception_state, config,
+                                        *mojo_config)) {
+    return mojom::blink::AuctionAdConfigPtr();
+  }
+
+  // Recursively handle component auctions, if there are any.
+  if (config.hasComponentAuctions()) {
+    for (const auto& idl_component_auction : config.componentAuctions()) {
+      // Component auctions may not have their own nested component auctions.
+      if (!is_top_level) {
+        exception_state.ThrowTypeError(
+            "Auctions listed in componentAuctions may not have their own "
+            "nested componentAuctions.");
+        return mojom::blink::AuctionAdConfigPtr();
+      }
+
+      auto mojo_component_auction =
+          IdlAuctionConfigToMojo(/*is_top_level=*/false, script_state, context,
+                                 exception_state, *idl_component_auction);
+      if (!mojo_component_auction)
+        return mojom::blink::AuctionAdConfigPtr();
+      mojo_config->component_auctions.emplace_back(
+          std::move(mojo_component_auction));
+    }
+  }
+
+  return mojo_config;
+}
+
 // finalizeAd() validation methods
 bool ValidateAdsObject(ExceptionState& exception_state, const Ads* ads) {
   if (!ads || !ads->IsValid()) {
@@ -849,24 +901,10 @@
                                              const AuctionAdConfig* config,
                                              ExceptionState& exception_state) {
   const ExecutionContext* context = ExecutionContext::From(script_state);
-  auto mojo_config = mojom::blink::AuctionAdConfig::New();
-  mojo_config->auction_ad_config_non_shared_params =
-      mojom::blink::AuctionAdConfigNonSharedParams::New();
-  if (!CopySellerFromIdlToMojo(exception_state, *config, *mojo_config) ||
-      !CopyDecisionLogicUrlFromIdlToMojo(*context, exception_state, *config,
-                                         *mojo_config) ||
-      !CopyTrustedScoringSignalsFromIdlToMojo(*context, exception_state,
-                                              *config, *mojo_config) ||
-      !CopyInterestGroupBuyersFromIdlToMojo(exception_state, *config,
-                                            *mojo_config) ||
-      !CopyAuctionSignalsFromIdlToMojo(*script_state, exception_state, *config,
-                                       *mojo_config) ||
-      !CopySellerSignalsFromIdlToMojo(*script_state, exception_state, *config,
-                                      *mojo_config) ||
-      !CopyPerBuyerSignalsFromIdlToMojo(*script_state, exception_state, *config,
-                                        *mojo_config)) {
+  auto mojo_config = IdlAuctionConfigToMojo(
+      /*is_top_level=*/true, *script_state, *context, exception_state, *config);
+  if (!mojo_config)
     return ScriptPromise();
-  }
 
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = resolver->Promise();
diff --git a/third_party/blink/renderer/modules/credentialmanager/authentication_extensions_client_inputs.idl b/third_party/blink/renderer/modules/credentialmanager/authentication_extensions_client_inputs.idl
index 3149602..9ac3bc8f 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authentication_extensions_client_inputs.idl
+++ b/third_party/blink/renderer/modules/credentialmanager/authentication_extensions_client_inputs.idl
@@ -27,7 +27,7 @@
   boolean minPinLength;
 
   // https://w3c.github.io/webauthn/#sctn-authenticator-credential-properties-extension
-  [RuntimeEnabled=WebAuthenticationResidentKeyRequirement] boolean credProps = false;
+  boolean credProps = false;
 
   // https://w3c.github.io/webauthn/#sctn-large-blob-extension
   [RuntimeEnabled=WebAuthenticationLargeBlobExtension] AuthenticationExtensionsLargeBlobInputs largeBlob;
diff --git a/third_party/blink/renderer/modules/credentialmanager/authenticator_selection_criteria.idl b/third_party/blink/renderer/modules/credentialmanager/authenticator_selection_criteria.idl
index 0bf12ae..c51b73b0 100644
--- a/third_party/blink/renderer/modules/credentialmanager/authenticator_selection_criteria.idl
+++ b/third_party/blink/renderer/modules/credentialmanager/authenticator_selection_criteria.idl
@@ -20,6 +20,6 @@
   AuthenticatorAttachment authenticatorAttachment;
   boolean requireResidentKey = false;
   // A DOMString expressing a ResidentKeyRequirement.
-  [RuntimeEnabled=WebAuthenticationResidentKeyRequirement] DOMString residentKey;
+  DOMString residentKey;
   UserVerificationRequirement userVerification;
 };
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc
index cb3562d0..f9e37d3 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.cc
@@ -519,8 +519,6 @@
       mojo_options->enforce_protection_policy = true;
     }
     if (extensions->credProps()) {
-      DCHECK(blink::RuntimeEnabledFeatures::
-                 WebAuthenticationResidentKeyRequirementEnabled());
       mojo_options->cred_props = true;
     }
     if (extensions->hasLargeBlob()) {
diff --git a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
index edbfa05a..7408ee5c 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanager/credentials_container.cc
@@ -615,8 +615,6 @@
     extension_outputs->setHmacCreateSecret(credential->hmac_create_secret);
   }
   if (credential->echo_cred_props) {
-    DCHECK(RuntimeEnabledFeatures::
-               WebAuthenticationResidentKeyRequirementEnabled());
     CredentialPropertiesOutput* cred_props_output =
         CredentialPropertiesOutput::Create();
     if (credential->has_cred_props_rk) {
diff --git a/third_party/blink/renderer/modules/direct_sockets/socket_options.idl b/third_party/blink/renderer/modules/direct_sockets/socket_options.idl
index 30d0b2b..2acc6b1 100644
--- a/third_party/blink/renderer/modules/direct_sockets/socket_options.idl
+++ b/third_party/blink/renderer/modules/direct_sockets/socket_options.idl
@@ -18,7 +18,7 @@
 dictionary TCPSocketOptions : SocketOptions {
   boolean noDelay;
   boolean keepAlive;
-  [Clamp] unsigned long keepAliveDelay;
+  [EnforceRange] unsigned long keepAliveDelay;
 };
 
 dictionary UDPSocketOptions : SocketOptions {
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_message.idl b/third_party/blink/renderer/modules/direct_sockets/udp_message.idl
index d7eb081..d10307c 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_message.idl
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_message.idl
@@ -5,7 +5,7 @@
 // https://github.com/WICG/direct-sockets/blob/main/docs/explainer.md#udp
 
 dictionary UDPMessage {
-  ArrayBuffer    data;
+  BufferSource   data;
   DOMString      remoteAddress;
   unsigned short remotePort;
 };
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc
index 36e09cf0..a1d7895c 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.cc
@@ -8,6 +8,7 @@
 #include "base/notreached.h"
 #include "base/time/time.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_underlying_source.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_udp_message.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
 #include "third_party/blink/renderer/core/streams/readable_stream_default_controller_with_script_scope.h"
@@ -130,11 +131,12 @@
     base::span<const uint8_t> data,
     const net::IPEndPoint& src_addr) {
   // Copies |data|.
-  auto* buffer = DOMArrayBuffer::Create(data.data(), data.size_bytes());
+  auto* buffer = DOMUint8Array::Create(data.data(), data.size_bytes());
 
   auto* message = UDPMessage::Create();
 
-  message->setData(buffer);
+  message->setData(MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferView>(
+      NotShared<DOMUint8Array>(buffer)));
   message->setRemoteAddress(String{src_addr.ToStringWithoutPort()});
   message->setRemotePort(src_addr.port());
 
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc
index 4ee2551..eacdeac 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper_unittest.cc
@@ -14,8 +14,10 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_iterator_result_value.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_udp_message.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
+#include "third_party/blink/renderer/core/typed_arrays/dom_array_piece.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
 #include "third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -106,9 +108,9 @@
 }
 
 String UDPMessageDataToString(const UDPMessage* message) {
-  auto* buffer = message->data();
-  return String{static_cast<const uint8_t*>(buffer->Data()),
-                static_cast<wtf_size_t>(buffer->ByteLength())};
+  DOMArrayPiece array_piece{message->data()};
+  return String{static_cast<const uint8_t*>(array_piece.Bytes()),
+                static_cast<wtf_size_t>(array_piece.ByteLength())};
 }
 
 TEST(UDPReadableStreamWrapperTest, Create) {
@@ -208,7 +210,7 @@
   ASSERT_FALSE(done);
   ASSERT_TRUE(message->hasData());
 
-  ASSERT_EQ(message->data()->ByteLength(), 0U);
+  ASSERT_EQ(UDPMessageDataToString(message).length(), 0U);
 }
 
 TEST(UDPReadableStreamWrapperTest, CancelStreamFromReader) {
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper_unittest.cc b/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper_unittest.cc
index 02ed0d8..46772821 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper_unittest.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_writable_stream_wrapper_unittest.cc
@@ -15,6 +15,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_dom_exception.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_udp_message.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
@@ -100,7 +101,8 @@
 
   auto* chunk = DOMArrayBuffer::Create("A", 1);
   auto* message = UDPMessage::Create();
-  message->setData(chunk);
+  message->setData(
+      MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferView>(chunk));
 
   ScriptPromise result =
       writer->write(script_state, ScriptValue::From(script_state, message),
@@ -114,6 +116,37 @@
   EXPECT_THAT(fake_udp_socket.GetReceivedData(), ::testing::ElementsAre('A'));
 }
 
+TEST(UDPWritableStreamWrapperTest, WriteUdpMessageFromTypedArray) {
+  V8TestingScope scope;
+  FakeDirectUDPSocket fake_udp_socket;
+  StreamCreator stream_creator{scope, &fake_udp_socket};
+
+  auto* udp_writable_stream_wrapper = stream_creator.Create();
+  auto* script_state = scope.GetScriptState();
+
+  auto* writer = udp_writable_stream_wrapper->Writable()->getWriter(
+      script_state, ASSERT_NO_EXCEPTION);
+
+  auto* buffer = DOMArrayBuffer::Create("ABC", 3);
+  auto* chunk = DOMUint8Array::Create(buffer, 0, 3);
+
+  auto* message = UDPMessage::Create();
+  message->setData(MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferView>(
+      NotShared<DOMUint8Array>(chunk)));
+
+  ScriptPromise result =
+      writer->write(script_state, ScriptValue::From(script_state, message),
+                    ASSERT_NO_EXCEPTION);
+
+  ScriptPromiseTester tester(script_state, result);
+  tester.WaitUntilSettled();
+
+  ASSERT_TRUE(tester.IsFulfilled());
+
+  EXPECT_THAT(fake_udp_socket.GetReceivedData(),
+              ::testing::ElementsAre('A', 'B', 'C'));
+}
+
 TEST(UDPWritableStreamWrapperTest, WriteUdpMessageWithEmptyDataField) {
   V8TestingScope scope;
   FakeDirectUDPSocket fake_udp_socket;
@@ -129,7 +162,8 @@
   auto* chunk = DOMArrayBuffer::Create(/*num_elements=*/static_cast<size_t>(0),
                                        /*element_byte_size=*/1);
   auto* message = UDPMessage::Create();
-  message->setData(chunk);
+  message->setData(
+      MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferView>(chunk));
 
   ScriptPromise result =
       writer->write(script_state, ScriptValue::From(script_state, message),
@@ -190,7 +224,8 @@
   for (const auto* value : {"A", "B"}) {
     auto* chunk = DOMArrayBuffer::Create(value, 1);
     auto* message = UDPMessage::Create();
-    message->setData(chunk);
+    message->setData(
+        MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferView>(chunk));
 
     ScriptPromise result =
         writer->write(script_state, ScriptValue::From(script_state, message),
@@ -218,7 +253,8 @@
 
   auto* chunk = DOMArrayBuffer::Create("A", 1);
   auto* message = UDPMessage::Create();
-  message->setData(chunk);
+  message->setData(
+      MakeGarbageCollected<V8UnionArrayBufferOrArrayBufferView>(chunk));
 
   ScriptPromise write_result =
       writer->write(script_state, ScriptValue::From(script_state, message),
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.cc b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
index 7e9339401..0286811 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser.cc
@@ -37,6 +37,11 @@
 static wtf_size_t kMaxUrlHandlersSize = 10;
 static wtf_size_t kMaxOriginLength = 2000;
 
+// The max number of file extensions an app can handle via the File Handling
+// API.
+const int kFileHandlerExtensionLimit = 300;
+int g_file_handler_extension_limit_for_testing = 0;
+
 bool IsValidMimeType(const String& mime_type) {
   if (mime_type.StartsWith('.'))
     return true;
@@ -102,7 +107,14 @@
 
 ManifestParser::~ManifestParser() {}
 
+// static
+void ManifestParser::SetFileHandlerExtensionLimitForTesting(int limit) {
+  g_file_handler_extension_limit_for_testing = limit;
+}
+
 bool ManifestParser::Parse() {
+  DCHECK(!manifest_);
+
   JSONParseError error;
   bool has_comments = false;
   std::unique_ptr<JSONValue> root = ParseJSON(data_, &error, &has_comments);
@@ -1052,6 +1064,13 @@
   if (!accept)
     return result;
 
+  const int kExtensionLimit = g_file_handler_extension_limit_for_testing > 0
+                                  ? g_file_handler_extension_limit_for_testing
+                                  : kFileHandlerExtensionLimit;
+  if (total_file_handler_extension_count_ > kExtensionLimit) {
+    return result;
+  }
+
   for (wtf_size_t i = 0; i < accept->size(); ++i) {
     JSONObject::Entry entry = accept->at(i);
 
@@ -1092,7 +1111,23 @@
       continue;
     }
 
-    result.Set(mimetype, std::move(extensions));
+    total_file_handler_extension_count_ += extensions.size();
+    int extension_overflow =
+        total_file_handler_extension_count_ - kExtensionLimit;
+    if (extension_overflow > 0) {
+      auto* erase_iter = extensions.end() - extension_overflow;
+      AddErrorInfo(
+          "property 'accept': too many total file extensions, ignoring "
+          "extensions starting from \"" +
+          *erase_iter + "\"");
+      extensions.erase(erase_iter, extensions.end());
+    }
+
+    if (!extensions.IsEmpty())
+      result.Set(mimetype, std::move(extensions));
+
+    if (extension_overflow > 0)
+      break;
   }
 
   return result;
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser.h b/third_party/blink/renderer/modules/manifest/manifest_parser.h
index 7a609c6..de4cd89 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser.h
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser.h
@@ -42,6 +42,8 @@
 
   ~ManifestParser();
 
+  static void SetFileHandlerExtensionLimitForTesting(int limit);
+
   // Parse the Manifest from a string using following:
   // https://w3c.github.io/manifest/#processing
   bool Parse();
@@ -474,6 +476,10 @@
   KURL document_url_;
   const FeatureContext* feature_context_;
 
+  // The total number of file extensions seen so far while parsing
+  // `file_handlers` `accept` entries.
+  int total_file_handler_extension_count_ = 0;
+
   bool failed_;
   mojom::blink::ManifestPtr manifest_;
   Vector<mojom::blink::ManifestErrorPtr> errors_;
diff --git a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
index d8b3b5d..6ceb240 100644
--- a/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
+++ b/third_party/blink/renderer/modules/manifest/manifest_parser_unittest.cc
@@ -2152,20 +2152,22 @@
               "icons": [{ "src": "foo.jpg" }],
               "action": "/files",
               "accept": {
-                "image/png": [
-                  {}
-                ]
+                "image/png": 3
               }
             }
           ]
         })");
-    ASSERT_EQ(1u, GetErrorCount());
-    EXPECT_EQ("property 'accept' file extension ignored, type string expected.",
-              errors()[0]);
-    EXPECT_EQ(1u, manifest->file_handlers.size());
+    ASSERT_EQ(2u, GetErrorCount());
+    EXPECT_EQ(
+        "property 'accept' type ignored. File extensions must be type array or "
+        "type string.",
+        errors()[0]);
+    EXPECT_EQ("FileHandler ignored. Property 'accept' is invalid.",
+              errors()[1]);
+    EXPECT_EQ(0u, manifest->file_handlers.size());
   }
 
-  // Entry with an empty list of extensions is valid.
+  // Entry with an empty list of extensions is not valid.
   {
     auto& manifest = ParseManifest(
         R"({
@@ -2180,17 +2182,10 @@
             }
           ]
         })");
-    auto& file_handlers = manifest->file_handlers;
-
-    ASSERT_EQ(0u, GetErrorCount());
-    ASSERT_EQ(1u, file_handlers.size());
-
-    EXPECT_EQ("name", file_handlers[0]->name);
-    EXPECT_EQ("http://foo.com/foo.jpg",
-              file_handlers[0]->icons[0]->src.GetString());
-    EXPECT_EQ(KURL("http://foo.com/files"), file_handlers[0]->action);
-    ASSERT_TRUE(file_handlers[0]->accept.Contains("image/png"));
-    EXPECT_EQ(0u, file_handlers[0]->accept.find("image/png")->value.size());
+    ASSERT_EQ(1u, GetErrorCount());
+    EXPECT_EQ("FileHandler ignored. Property 'accept' is invalid.",
+              errors()[0]);
+    EXPECT_EQ(0u, manifest->file_handlers.size());
   }
 
   // Extensions that do not start with a '.' are invalid.
@@ -2212,18 +2207,13 @@
         })");
     auto& file_handlers = manifest->file_handlers;
 
-    ASSERT_EQ(1u, GetErrorCount());
+    ASSERT_EQ(2u, GetErrorCount());
     EXPECT_EQ(
         "property 'accept' file extension ignored, must start with a '.'.",
         errors()[0]);
-    ASSERT_EQ(1u, file_handlers.size());
-
-    EXPECT_EQ("name", file_handlers[0]->name);
-    EXPECT_EQ("http://foo.com/foo.jpg",
-              file_handlers[0]->icons[0]->src.GetString());
-    EXPECT_EQ(KURL("http://foo.com/files"), file_handlers[0]->action);
-    ASSERT_TRUE(file_handlers[0]->accept.Contains("image/png"));
-    EXPECT_EQ(0u, file_handlers[0]->accept.find("image/png")->value.size());
+    EXPECT_EQ("FileHandler ignored. Property 'accept' is invalid.",
+              errors()[1]);
+    ASSERT_EQ(0u, file_handlers.size());
   }
 
   // Invalid MIME types and those with parameters are stripped.
@@ -2414,6 +2404,69 @@
     ASSERT_EQ(1u, file_handlers[1]->accept.find("text/csv")->value.size());
     EXPECT_EQ(".csv", file_handlers[1]->accept.find("text/csv")->value[0]);
   }
+
+  // file_handlers limits the total number of file extensions. Everything after
+  // and including the file handler that hits the extension limit
+  {
+    ManifestParser::SetFileHandlerExtensionLimitForTesting(5);
+    auto& manifest = ParseManifest(
+        R"({
+          "file_handlers": [
+            {
+              "name": "Raw",
+              "action": "/raw",
+              "accept": {
+                "text/csv": ".csv"
+              }
+            },
+            {
+              "name": "Graph",
+              "action": "/graph",
+              "accept": {
+                "text/svg+xml": [
+                  ".graph1",
+                  ".graph2",
+                  ".graph3",
+                  ".graph4",
+                  ".graph5",
+                  ".graph6"
+                ]
+              }
+            },
+            {
+              "name": "Data",
+              "action": "/data",
+              "accept": {
+                "text/plain": [
+                  ".data"
+                ]
+              }
+            }
+          ]
+        })");
+    auto& file_handlers = manifest->file_handlers;
+
+    ASSERT_EQ(2u, GetErrorCount());
+    EXPECT_EQ(
+        "property 'accept': too many total file extensions, ignoring "
+        "extensions starting from \".graph5\"",
+        errors()[0]);
+    EXPECT_EQ("FileHandler ignored. Property 'accept' is invalid.",
+              errors()[1]);
+
+    ASSERT_EQ(2u, file_handlers.size());
+
+    EXPECT_EQ("Raw", file_handlers[0]->name);
+    EXPECT_EQ(1u, file_handlers[0]->accept.find("text/csv")->value.size());
+
+    EXPECT_EQ("Graph", file_handlers[1]->name);
+    auto accept_map = file_handlers[1]->accept.find("text/svg+xml")->value;
+    ASSERT_EQ(4u, accept_map.size());
+    EXPECT_TRUE(accept_map.Contains(".graph1"));
+    EXPECT_TRUE(accept_map.Contains(".graph2"));
+    EXPECT_TRUE(accept_map.Contains(".graph3"));
+    EXPECT_TRUE(accept_map.Contains(".graph4"));
+  }
 }
 
 TEST_F(ManifestParserTest, FileHandlerIconsParseRules) {
diff --git a/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc b/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc
index 1ff12697..ab0ec34 100644
--- a/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc
@@ -317,10 +317,13 @@
   }
 
   // TODO(b/181797390): Use VBR bitrate mode.
+  // TODO(crbug.com/1289907): remove the cast to uint32_t once
+  // |bits_per_second_| is stored as uint32_t.
   const media::VideoEncodeAccelerator::Config config(
       pixel_format, input_visible_size_, codec_,
-      media::Bitrate::ConstantBitrate(bits_per_second_), absl::nullopt,
-      absl::nullopt, level_, false, storage_type,
+      media::Bitrate::ConstantBitrate(
+          base::saturated_cast<uint32_t>(bits_per_second_)),
+      absl::nullopt, absl::nullopt, level_, false, storage_type,
       media::VideoEncodeAccelerator::Config::ContentType::kCamera);
   if (!video_encoder_ || !video_encoder_->Initialize(config, this))
     NotifyError(media::VideoEncodeAccelerator::kPlatformFailureError);
diff --git a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
index 8ce835e..45c34db 100644
--- a/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
+++ b/third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.cc
@@ -463,7 +463,7 @@
         list->Append(std::move(report).value());
     }
 
-    if (!list->GetList().empty()) {
+    if (!list->GetListDeprecated().empty()) {
       PostCrossThreadTask(
           *main_thread_.get(), FROM_HERE,
           CrossThreadBindOnce(&InternalLegacyStatsObserver::OnCompleteImpl,
@@ -487,7 +487,7 @@
       std::unique_ptr<base::ListValue> list,
       int lid,
       CrossThreadOnceFunction<void(int, base::Value)> completion_callback) {
-    DCHECK(!list->GetList().empty());
+    DCHECK(!list->GetListDeprecated().empty());
     std::move(completion_callback).Run(lid, std::move(*list.get()));
   }
 
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_decoder_broker.cc b/third_party/blink/renderer/modules/webcodecs/audio_decoder_broker.cc
index d47563a6..a52e3e4 100644
--- a/third_party/blink/renderer/modules/webcodecs/audio_decoder_broker.cc
+++ b/third_party/blink/renderer/modules/webcodecs/audio_decoder_broker.cc
@@ -14,7 +14,6 @@
 #include "media/base/audio_decoder_config.h"
 #include "media/base/decoder_factory.h"
 #include "media/base/media_log.h"
-#include "media/base/status_codes.h"
 #include "media/mojo/buildflags.h"
 #include "media/mojo/clients/mojo_decoder_factory.h"
 #include "media/mojo/mojom/interface_factory.mojom.h"
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc b/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc
index 512f49d..7a35c57 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer.cc
@@ -55,6 +55,37 @@
 
 }  // namespace
 
+// GPUMappedDOMArrayBuffer is returned from mappings created from
+// GPUBuffer which point to shared memory. This memory is owned by
+// the underlying WGPUBuffer used to implement GPUBuffer.
+// GPUMappedDOMArrayBuffer exists because mapped DOMArrayBuffers need
+// to keep their owning GPUBuffer alive, or the shared memory may be
+// freed while it is in use. It derives from DOMArrayBuffer and holds
+// a Member<GPUBuffer> to its owner. Alternative ideas might be to keep
+// the WGPUBuffer alive using a custom deleter of v8::BackingStore or
+// ArrayBufferContents. However, since these are non-GC objects, it
+// becomes complex to handle destruction when the last reference to
+// the WGPUBuffer may be held either by a GC object, or a non-GC object.
+class GPUMappedDOMArrayBuffer : public DOMArrayBuffer {
+ public:
+  static GPUMappedDOMArrayBuffer* Create(GPUBuffer* owner,
+                                         ArrayBufferContents contents) {
+    return MakeGarbageCollected<GPUMappedDOMArrayBuffer>(owner,
+                                                         std::move(contents));
+  }
+
+  GPUMappedDOMArrayBuffer(GPUBuffer* owner, ArrayBufferContents contents)
+      : DOMArrayBuffer(std::move(contents)), owner_(owner) {}
+
+  void Trace(Visitor* visitor) const override {
+    DOMArrayBuffer::Trace(visitor);
+    visitor->Trace(owner_);
+  }
+
+ private:
+  Member<GPUBuffer> owner_;
+};
+
 // static
 GPUBuffer* GPUBuffer::Create(GPUDevice* device,
                              const GPUBufferDescriptor* webgpu_desc) {
@@ -305,57 +336,10 @@
   DCHECK(data);
   DCHECK_LE(static_cast<uint64_t>(data_length), v8::TypedArray::kMaxLength);
 
-  // GPUBuffer::GetMappedRange returns ArrayBuffers that point to memory owned
-  // by handle_, which is a dawn::wire::client::Buffer. It is possible that the
-  // GPUBuffer gets garbage collected before the ArrayBuffer. When that happens
-  // the dawn::wire::client::Buffer must be kept alive, otherwise the
-  // ArrayBuffer will point to freed memory.
-  //
-  // To prevent this issue we make the ArrayBuffer keep a reference to the
-  // WGPUBuffer, by referencing the buffer and then have a custom deleter for
-  // the v8 backing store that releases that reference.
-  //
-  // V8 can call the ArrayBuffer deleter on any thread but dawn_wire and the
-  // rest of the WebGPU implementation expect to be used on a single thread at
-  // the moment. To fix this we keep a reference to the task runner for the
-  // execution context that called getMappedRange and do a deletion on a task
-  // posted to it.
-  struct ArrayBufferStrongRefs {
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner;
-    scoped_refptr<DawnControlClientHolder> dawn_control_client;
-    WGPUBuffer dawn_buffer;
-  };
-
-  GetProcs().bufferReference(GetHandle());
-  ArrayBufferStrongRefs* refs = new ArrayBufferStrongRefs{
-      execution_context->GetTaskRunner(TaskType::kWebGPU),
-      GetDawnControlClient(), GetHandle()};
-
-  v8::BackingStore::DeleterCallback deleter = [](void*, size_t,
-                                                 void* userdata) {
-    ArrayBufferStrongRefs* refs = static_cast<ArrayBufferStrongRefs*>(userdata);
-
-    // Happy case, we happen to be called on the correct thread. Release the
-    // buffer immediately.
-    if (refs->task_runner->BelongsToCurrentThread()) {
-      refs->dawn_control_client->GetProcs().bufferRelease(refs->dawn_buffer);
-      delete refs;
-      return;
-    }
-
-    refs->task_runner->PostTask(
-        FROM_HERE, ConvertToBaseOnceCallback(WTF::CrossThreadBindOnce(
-                       [](ArrayBufferStrongRefs* refs) {
-                         refs->dawn_control_client->GetProcs().bufferRelease(
-                             refs->dawn_buffer);
-                         delete refs;
-                       },
-                       WTF::CrossThreadUnretained(refs))));
-  };
-
-  ArrayBufferContents contents(
-      v8::ArrayBuffer::NewBackingStore(data, data_length, deleter, refs));
-  DOMArrayBuffer* array_buffer = DOMArrayBuffer::Create(contents);
+  ArrayBufferContents contents(v8::ArrayBuffer::NewBackingStore(
+      data, data_length, v8::BackingStore::EmptyDeleter, nullptr));
+  GPUMappedDOMArrayBuffer* array_buffer =
+      GPUMappedDOMArrayBuffer::Create(this, contents);
 
   mapped_array_buffers_.push_back(array_buffer);
   return array_buffer;
@@ -364,8 +348,9 @@
 void GPUBuffer::ResetMappingState(v8::Isolate* isolate) {
   mapped_ranges_.clear();
 
-  for (Member<DOMArrayBuffer>& mapped_array_buffer : mapped_array_buffers_) {
-    DOMArrayBuffer* array_buffer = mapped_array_buffer.Release();
+  for (Member<GPUMappedDOMArrayBuffer>& mapped_array_buffer :
+       mapped_array_buffers_) {
+    GPUMappedDOMArrayBuffer* array_buffer = mapped_array_buffer.Release();
     DCHECK(array_buffer->IsDetachable(isolate));
 
     // Detach the array buffer by transferring the contents out and dropping
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_buffer.h b/third_party/blink/renderer/modules/webgpu/gpu_buffer.h
index 743f439..95e7e0e 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_buffer.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_buffer.h
@@ -16,6 +16,7 @@
 
 class DOMArrayBuffer;
 class GPUBufferDescriptor;
+class GPUMappedDOMArrayBuffer;
 class ExecutionContext;
 class ScriptPromiseResolver;
 
@@ -80,7 +81,7 @@
 
   // Holds onto any ArrayBuffers returned by getMappedRange, mapReadAsync, or
   // mapWriteAsync.
-  HeapVector<Member<DOMArrayBuffer>> mapped_array_buffers_;
+  HeapVector<Member<GPUMappedDOMArrayBuffer>> mapped_array_buffers_;
 
   // List of ranges currently returned by getMappedRange, to avoid overlaps.
   Vector<std::pair<size_t, size_t>> mapped_ranges_;
diff --git a/third_party/blink/renderer/platform/instrumentation/tracing/traced_value_test.cc b/third_party/blink/renderer/platform/instrumentation/tracing/traced_value_test.cc
index c4030c7..fb8a6cfb 100644
--- a/third_party/blink/renderer/platform/instrumentation/tracing/traced_value_test.cc
+++ b/third_party/blink/renderer/platform/instrumentation/tracing/traced_value_test.cc
@@ -81,7 +81,7 @@
   base::Value* a1_value = parsed->FindListKey("a1");
   ASSERT_NE(nullptr, a1_value);
   ASSERT_TRUE(a1_value->is_list());
-  base::Value::ListView a1 = a1_value->GetList();
+  base::Value::ListView a1 = a1_value->GetListDeprecated();
   absl::optional<int> a1i0 = a1[0].GetIfInt();
   ASSERT_TRUE(a1i0.has_value());
   EXPECT_EQ(1, *a1i0);
@@ -157,7 +157,7 @@
   EXPECT_EQ("string", *string_value);
   base::Value* a1_value = parsed->FindListKey(array_str);
   ASSERT_TRUE(a1_value->is_list());
-  base::Value::ListView a1 = a1_value->GetList();
+  base::Value::ListView a1 = a1_value->GetListDeprecated();
   absl::optional<int> el0 = a1[0].GetIfInt();
   absl::optional<int> el1 = a1[1].GetIfInt();
   ASSERT_TRUE(el0.has_value());
diff --git a/third_party/blink/renderer/platform/loader/cors/cors.cc b/third_party/blink/renderer/platform/loader/cors/cors.cc
index 3062b4be..4e3c4c80 100644
--- a/third_party/blink/renderer/platform/loader/cors/cors.cc
+++ b/third_party/blink/renderer/platform/loader/cors/cors.cc
@@ -6,6 +6,8 @@
 
 #include <string>
 
+#include "base/bind.h"
+#include "base/callback.h"
 #include "net/http/http_util.h"
 #include "services/network/public/cpp/cors/cors.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
@@ -36,9 +38,15 @@
 
     while (true) {
       ConsumeSpaces();
+      // In RFC 7230, the parser must ignore a reasonable number of empty list
+      // elements for compatibility with legacy list rules.
+      // See: https://datatracker.ietf.org/doc/html/rfc7230#section-7
+      if (value_[pos_] == ',') {
+        ConsumeComma();
+        continue;
+      }
 
-      if (pos_ == value_.length() && !output.empty()) {
-        output.insert(std::string());
+      if (pos_ == value_.length()) {
         return;
       }
 
@@ -57,7 +65,8 @@
         return;
 
       if (value_[pos_] == ',') {
-        ++pos_;
+        if (pos_ < value_.length())
+          ++pos_;
       } else {
         output.clear();
         return;
@@ -66,30 +75,33 @@
   }
 
  private:
-  // Consumes zero or more spaces (SP and HTAB) from value_.
-  void ConsumeSpaces() {
+  void ConsumePermittedCharacters(
+      base::RepeatingCallback<bool(UChar)> is_permitted) {
     while (true) {
       if (pos_ == value_.length())
         return;
 
-      UChar c = value_[pos_];
-      if (c != ' ' && c != '\t')
+      if (!is_permitted.Run(value_[pos_]))
         return;
       ++pos_;
     }
   }
+  // Consumes zero or more spaces (SP and HTAB) from value_.
+  void ConsumeSpaces() {
+    ConsumePermittedCharacters(
+        base::BindRepeating([](UChar c) { return c == ' ' || c == '\t'; }));
+  }
+
+  // Consumes zero or more comma from value_.
+  void ConsumeComma() {
+    ConsumePermittedCharacters(
+        base::BindRepeating([](UChar c) { return c == ','; }));
+  }
 
   // Consumes zero or more tchars from value_.
   void ConsumeTokenChars() {
-    while (true) {
-      if (pos_ == value_.length())
-        return;
-
-      UChar c = value_[pos_];
-      if (c > 0x7F || !net::HttpUtil::IsTokenChar(c))
-        return;
-      ++pos_;
-    }
+    ConsumePermittedCharacters(base::BindRepeating(
+        [](UChar c) { return c <= 0x7F && net::HttpUtil::IsTokenChar(c); }));
   }
 
   const String value_;
diff --git a/third_party/blink/renderer/platform/loader/cors/cors_test.cc b/third_party/blink/renderer/platform/loader/cors/cors_test.cc
index 33a8264..0bc8f071 100644
--- a/third_party/blink/renderer/platform/loader/cors/cors_test.cc
+++ b/third_party/blink/renderer/platform/loader/cors/cors_test.cc
@@ -36,7 +36,8 @@
   EXPECT_EQ(Parse(CredentialsMode::kOmit, " \t   \t\t a"),
             HTTPHeaderSet({"a"}));
 
-  EXPECT_EQ(Parse(CredentialsMode::kOmit, "a , "), HTTPHeaderSet({"a", ""}));
+  EXPECT_EQ(Parse(CredentialsMode::kOmit, "a , "), HTTPHeaderSet({"a"}));
+  EXPECT_EQ(Parse(CredentialsMode::kOmit, " , a"), HTTPHeaderSet({"a"}));
 }
 
 TEST_F(CorsExposedHeadersTest, DuplicatedEntries) {
@@ -57,8 +58,6 @@
 
   EXPECT_TRUE(Parse(CredentialsMode::kOmit, " , ").empty());
 
-  EXPECT_TRUE(Parse(CredentialsMode::kOmit, " , a").empty());
-
   EXPECT_TRUE(Parse(CredentialsMode::kOmit, "").empty());
 
   EXPECT_TRUE(Parse(CredentialsMode::kOmit, " ").empty());
@@ -69,6 +68,16 @@
           .empty());
 }
 
+TEST_F(CorsExposedHeadersTest, WithEmptyElements) {
+  EXPECT_EQ(Parse(CredentialsMode::kOmit, ", bb-8"), HTTPHeaderSet({"bb-8"}));
+
+  EXPECT_EQ(Parse(CredentialsMode::kOmit, ", , , bb-8"),
+            HTTPHeaderSet({"bb-8"}));
+
+  EXPECT_EQ(Parse(CredentialsMode::kOmit, ", , , bb-8,"),
+            HTTPHeaderSet({"bb-8"}));
+}
+
 TEST_F(CorsExposedHeadersTest, Wildcard) {
   ResourceResponse response;
   response.AddHttpHeaderField("access-control-expose-headers", "a, b, *");
diff --git a/third_party/blink/renderer/platform/media/web_source_buffer_impl.cc b/third_party/blink/renderer/platform/media/web_source_buffer_impl.cc
index 24f4868..7f5409b 100644
--- a/third_party/blink/renderer/platform/media/web_source_buffer_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_source_buffer_impl.cc
@@ -42,20 +42,31 @@
 #undef CHROMIUM_PARSE_WARNING_TO_BLINK_ENUM_CASE
 }
 
+static_assert(media::kInfiniteDuration == base::TimeDelta::Max());
+static_assert(media::kNoTimestamp == base::TimeDelta::Min());
+
 static base::TimeDelta DoubleToTimeDelta(double time) {
   DCHECK(!std::isnan(time));
   DCHECK_NE(time, -std::numeric_limits<double>::infinity());
 
-  if (time == std::numeric_limits<double>::infinity())
+  // API sometimes needs conceptual +Infinity,
+  if (time == std::numeric_limits<double>::infinity()) {
     return media::kInfiniteDuration;
+  }
 
-  constexpr double max_time_in_seconds =
-      base::TimeDelta::FiniteMax().InSecondsF();
+  base::TimeDelta converted_time = base::Seconds(time);
 
-  if (time >= max_time_in_seconds)
+  // Avoid saturating finite positive input to kInfiniteDuration.
+  if (converted_time == media::kInfiniteDuration) {
     return base::TimeDelta::FiniteMax();
+  }
 
-  return base::Microseconds(time * base::Time::kMicrosecondsPerSecond);
+  // Avoid saturating finite negative input to KNoTimestamp.
+  if (converted_time == media::kNoTimestamp) {
+    return base::TimeDelta::FiniteMin();
+  }
+
+  return converted_time;
 }
 
 WebSourceBufferImpl::WebSourceBufferImpl(const std::string& id,
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
index 9c918f57..adda739e 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder.cc
@@ -491,9 +491,6 @@
   // of the completed frame in |input_buffers_|.
   void EncodeFrameFinished(int index);
 
-  // Checks if the bitrate would overflow when passing from kbps to bps.
-  bool IsBitrateTooHigh(uint32_t bitrate);
-
   // Checks if the frame size is different than hardware accelerator
   // requirements.
   bool RequiresSizeChange(const media::VideoFrame& frame) const;
@@ -658,7 +655,10 @@
   async_encode_event_.reset();
 
   // Check for overflow converting bitrate (kilobits/sec) to bits/sec.
-  if (IsBitrateTooHigh(bitrate)) {
+  uint32_t bitrate_bps;
+  if (!ConvertKbpsToBps(bitrate, &bitrate_bps)) {
+    LogAndNotifyError(FROM_HERE, "Overflow converting bitrate from kbps to bps",
+                      media::VideoEncodeAccelerator::kInvalidArgumentError);
     async_init_event_.SetAndReset(WEBRTC_VIDEO_CODEC_ERR_PARAMETER);
     return;
   }
@@ -717,7 +717,7 @@
   }
   const media::VideoEncodeAccelerator::Config config(
       pixel_format, input_visible_size_, profile,
-      media::Bitrate::ConstantBitrate(bitrate * 1000), absl::nullopt,
+      media::Bitrate::ConstantBitrate(bitrate_bps), absl::nullopt,
       absl::nullopt, absl::nullopt, is_constrained_h264, storage_type,
       video_content_type_ == webrtc::VideoContentType::SCREENSHARE
           ? media::VideoEncodeAccelerator::Config::ContentType::kDisplay
@@ -1424,15 +1424,6 @@
     EncodeOneFrame();
 }
 
-bool RTCVideoEncoder::Impl::IsBitrateTooHigh(uint32_t bitrate) {
-  uint32_t bitrate_bps = 0;
-  if (ConvertKbpsToBps(bitrate, &bitrate_bps))
-    return false;
-  LogAndNotifyError(FROM_HERE, "Overflow converting bitrate from kbps to bps",
-                    media::VideoEncodeAccelerator::kInvalidArgumentError);
-  return true;
-}
-
 bool RTCVideoEncoder::Impl::RequiresSizeChange(
     const media::VideoFrame& frame) const {
   return (frame.coded_size() != input_frame_coded_size_ ||
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc
index d657609..d1428cf 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_test.cc
@@ -155,6 +155,28 @@
                                                      mock_gpu_factories_.get());
   }
 
+  void CreateEncoderWithoutVea(webrtc::VideoCodecType codec_type) {
+    DVLOG(3) << __func__;
+    media::VideoCodecProfile media_profile;
+    switch (codec_type) {
+      case webrtc::kVideoCodecVP8:
+        media_profile = media::VP8PROFILE_ANY;
+        break;
+      case webrtc::kVideoCodecH264:
+        media_profile = media::H264PROFILE_BASELINE;
+        break;
+      case webrtc::kVideoCodecVP9:
+        media_profile = media::VP9PROFILE_PROFILE0;
+        break;
+      default:
+        ADD_FAILURE() << "Unexpected codec type: " << codec_type;
+        media_profile = media::VIDEO_CODEC_PROFILE_UNKNOWN;
+    }
+
+    rtc_encoder_ = std::make_unique<RTCVideoEncoder>(media_profile, false,
+                                                     mock_gpu_factories_.get());
+  }
+
   // media::VideoEncodeAccelerator implementation.
   bool Initialize(const media::VideoEncodeAccelerator::Config& config,
                   media::VideoEncodeAccelerator::Client* client) {
@@ -527,6 +549,20 @@
   }
 }
 
+TEST_F(RTCVideoEncoderTest, InitializeWithTooHighBitrateFails) {
+  // We expect initialization to fail. We do not want a mock video encoder, as
+  // it will not be successfully attached to the rtc_encoder_. So we do not call
+  // CreateEncoder, but instead CreateEncoderWithoutVea.
+  constexpr webrtc::VideoCodecType codec_type = webrtc::kVideoCodecVP8;
+  CreateEncoderWithoutVea(codec_type);
+
+  webrtc::VideoCodec codec = GetDefaultCodec();
+  codec.codecType = codec_type;
+  codec.startBitrate = std::numeric_limits<uint32_t>::max() / 100;
+  EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERR_PARAMETER,
+            rtc_encoder_->InitEncode(&codec, kVideoEncoderSettings));
+}
+
 #if defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS_ASH)
 // Currently we only test spatial SVC encoding on CrOS since only CrOS platform
 // support spatial SVC encoding.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index af70841..58512d1 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -111,6 +111,10 @@
       status: "experimental",
     },
     {
+      name: "AbortSignalTimeout",
+      status: "experimental",
+    },
+    {
       name: "Accelerated2dCanvas",
       settable_from_internals: true,
       status: "stable",
@@ -968,6 +972,10 @@
       status: "stable",
     },
     {
+      name: "ElementSuperRareData",
+      status: "experimental",
+    },
+    {
       name: "EncryptedMediaSessionClosedReason",
       status: "stable",
     },
@@ -2512,10 +2520,6 @@
       name: "WebAuthenticationLargeBlobExtension",
       status: "experimental",
     },
-    {
-      name: "WebAuthenticationResidentKeyRequirement",
-      status: "stable",
-    },
     // WebBluetooth is enabled by default on Android, ChromeOS and Mac.
     // It is also supported in Windows 10 which is handled in runtime_features.cc
     {
diff --git a/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc b/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc
index 0112b62..9ce537a 100644
--- a/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc
+++ b/third_party/blink/renderer/platform/webrtc/convert_to_webrtc_video_frame_buffer.cc
@@ -228,16 +228,16 @@
   if (tmp_buffer_needed) {
     std::unique_ptr<std::vector<uint8_t>> tmp_buffer =
         shared_resources->CreateTemporaryVectorBuffer();
-    media::Status status =
+    media::EncoderStatus status =
         media::ConvertAndScaleFrame(*source_frame, *dst_frame, *tmp_buffer);
     shared_resources->ReleaseTemporaryVectorBuffer(std::move(tmp_buffer));
-    return status == media::StatusCode::kOk ? dst_frame : nullptr;
+    return status.is_ok() ? dst_frame : nullptr;
   }
 
   std::vector<uint8_t> tmp_buffer;
-  media::Status status =
+  media::EncoderStatus status =
       media::ConvertAndScaleFrame(*source_frame, *dst_frame, tmp_buffer);
-  return status == media::StatusCode::kOk ? dst_frame : nullptr;
+  return status.is_ok() ? dst_frame : nullptr;
 }
 
 scoped_refptr<media::VideoFrame> MaybeConvertAndScaleFrame(
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 12dc8e1..4afea6dc 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -109,6 +109,7 @@
 crbug.com/829028 external/wpt/css/css-break/break-between-avoid-003.html [ Failure ]
 crbug.com/829028 external/wpt/css/css-break/break-between-avoid-004.html [ Failure ]
 crbug.com/829028 external/wpt/css/css-break/break-between-avoid-007.html [ Failure ]
+crbug.com/829028 external/wpt/css/css-break/break-between-avoid-009.html [ Failure ]
 crbug.com/1277976 external/wpt/css/css-break/change-inline-color.html [ Failure Pass ]
 crbug.com/726125 external/wpt/css/css-break/chrome-bug-1289999-crash.https.html [ Skip ]
 crbug.com/829028 external/wpt/css/css-break/fieldset-003.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index fb89b73..401d81b 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1948,8 +1948,6 @@
 crbug.com/1234841 external/wpt/html/semantics/grouping-content/the-li-element/grouping-li-reftest-007.html [ Failure ]
 crbug.com/1167095 external/wpt/html/semantics/forms/form-submission-0/text-plain.window.html [ Pass Timeout ]
 crbug.com/939561 [ Mac ] external/wpt/html/semantics/forms/the-input-element/show-picker.tentative.html [ Skip ]
-crbug.com/853146 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1.html [ Timeout ]
-crbug.com/853146 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3.html [ Timeout ]
 crbug.com/1132413 external/wpt/html/semantics/scripting-1/the-script-element/json-module/parse-error.html [ Timeout ]
 crbug.com/1232504 external/wpt/html/semantics/embedded-content/media-elements/src_object_blob.html [ Timeout ]
 crbug.com/1232504 [ Win ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ]
@@ -3207,6 +3205,8 @@
 crbug.com/626703 [ Linux ] external/wpt/url/failure.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Mac10.12 ] external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] virtual/fenced-frame-mparch/external/wpt/html/cross-origin-embedder-policy/anonymous-iframe/web-lock.tentative.https.window.html [ Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/scroll-to-text-fragment/force-load-at-top.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/hidpi/device-pixel-ratio.https.html [ Failure ]
 crbug.com/626703 [ Mac10.14 ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/hid.https.html [ Timeout ]
@@ -3954,9 +3954,6 @@
 crbug.com/626703 external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-align/baseline-rules/grid-item-input-type-number.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-align/baseline-rules/grid-item-input-type-text.html [ Failure ]
-crbug.com/626703 external/wpt/webaudio/the-audio-api/processing-model/feedback-delay-time.html [ Failure ]
-crbug.com/626703 external/wpt/webaudio/the-audio-api/processing-model/delay-time-clamping.html [ Failure ]
-crbug.com/626703 external/wpt/webaudio/the-audio-api/processing-model/cycle-without-delay.html [ Failure ]
 crbug.com/626703 [ Win7 ] external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-y_touch.html [ Timeout ]
 crbug.com/626703 [ Win7 ] external/wpt/pointerevents/pointerevent_touch-action-inherit_child-none_touch.html [ Timeout ]
 crbug.com/626703 [ Win7 ] external/wpt/pointerevents/pointerevent_touch-action-pan-y-css_touch.html [ Skip Timeout ]
@@ -5775,11 +5772,6 @@
 # Stale revalidation shouldn't be blocked:
 crbug.com/1079188 external/wpt/fetch/stale-while-revalidate/revalidate-not-blocked-by-csp.html [ Timeout ]
 
-# Web Audio active processing tests
-crbug.com/1073247 external/wpt/webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https.html [ Crash Failure Pass ]
-crbug.com/1073247 external/wpt/webaudio/the-audio-api/the-channelmergernode-interface/active-processing.https.html [ Crash Failure Pass ]
-crbug.com/1073247 external/wpt/webaudio/the-audio-api/the-convolvernode-interface/active-processing.https.html [ Crash Failure Pass ]
-
 # Sheriff 2020-04-22
 # Flaky test.
 crbug.com/1073505 [ Mac10.13 ] external/wpt/html/semantics/scripting-1/the-script-element/moving-between-documents/* [ Failure Pass ]
@@ -6761,9 +6753,6 @@
 # Now also flakily timing-out.
 crbug.com/1193920 virtual/threaded-prefer-compositing/fast/scrolling/events/overscroll-event-fired-to-scrolled-element.html [ Failure Pass Timeout ]
 
-# Sheriff 2021-07-02
-crbug.com/1226112 http/tests/text-autosizing/narrow-iframe.html [ Failure Pass ]
-
 # Sheriff 2021-07-05
 crbug.com/1226445 [ Mac ] virtual/storage-access-api/external/wpt/storage-access-api/storageAccess.testdriver.sub.html [ Failure Pass ]
 
@@ -7237,7 +7226,7 @@
 crbug.com/1259652 [ Mac10.13 ] external/wpt/streams/readable-streams/tee.any.sharedworker.html [ Failure Pass ]
 
 # Data URL navigation within Fenced Frames currently crashed in the MPArch implementation.
-crbug.com/1243568 virtual/fenced-frame-mparch/wpt_internal/fenced_frame/window-data-url-navigation.html [ Crash ]
+crbug.com/1243568 virtual/fenced-frame-mparch/wpt_internal/fenced_frame/window-data-url-navigation.html [ Timeout ]
 
 # Gesture of WPT Test Driver doesn't work well in MPArch Fenced Frame on some Mac try bots.
 crbug.com/1275997 [ Mac ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/pointer-lock.https.html [ Pass Timeout ]
@@ -7573,12 +7562,14 @@
 crbug.com/1291488 virtual/shared_array_buffer_on_desktop/fast/peerconnection/RTCPeerConnection-addMultipleTracks.html [ Skip ]
 
 # Sheriff 2022-01-28
-crbug.com/1248386 http/tests/text-autosizing/wide-iframe.html [ Failure Pass Timeout ]
 crbug.com/1287563 [ Linux ] external/wpt/webrtc/RTCPeerConnection-perfect-negotiation-stress-glare-linear.https.html [ Crash Failure Pass ]
 
 # Now flaky due to a timing issue.
 crbug.com/1292296 http/tests/inspector-protocol/accessibility/accessibility-getRootNode.js [ Failure Pass ]
 
+# Flaky due to timing issue.
+crbug.com/1293515 wpt_internal/resource-timing/initiator-type-early-hints-preload.h2.window.html [ Pass Failure ]
+
 # Sheriff 2022-02-01
 # Flaky test on Mac
 crbug.com/1292843 [ Mac ] external/wpt/css/css-transforms/animation/perspective-origin-interpolation.html [ Failure Pass ]
@@ -7600,3 +7591,6 @@
 
 crbug.com/1038139 [ Linux ] virtual/gpu-rasterization/images/2-comp.html [ Failure Pass ]
 crbug.com/1038139 [ Mac ] virtual/gpu-rasterization/images/2-comp.html [ Failure Pass ]
+
+# Need implementation of blocking=render attribute
+crbug.com/1271296 virtual/no-forced-frame-updates/external/wpt/html/dom/render-blocking/render-blocked-apis-by-preload-link.tentative.html [ Skip ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index d47b7bd..b951a67c 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -953,6 +953,7 @@
               "external/wpt/accessibility/crashtests/move-owned-inside-another-owned.html",
               "external/wpt/accessibility/crashtests/slot-assignment-lockup.html",
               "external/wpt/accessibility/crashtests/validation-message.html",
+              "external/wpt/accessibility/crashtests/displaylocked-serialize.html",
               "editing/text-iterator/auto-expand-details.html",
               "editing/text-iterator/auto-expand-details-shadowdom.html"],
     "args": ["--force-renderer-accessibility"]
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version
index e089db6..1a13d119 100644
--- a/third_party/blink/web_tests/external/Version
+++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@
-Version: 427b42c4b5b995f88bfa1f406d3f7ce5bbe8bbb3
+Version: 0598a5629ea4f8d408e6df0fdca7eab23cc1fbf0
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 8d6be88..84b6027 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -512,6 +512,13 @@
         {}
        ]
       ],
+      "columns-in-table-001-crash.html": [
+       "fe421500dade86b6fedbbf6289a668dcc5174f45",
+       [
+        null,
+        {}
+       ]
+      ],
       "container-type-change-chrome-legacy-crash.html": [
        "609142a2c5f7fa16f241b6ac06842a62ed68be8c",
        [
@@ -80667,6 +80674,19 @@
         ],
         {}
        ]
+      ],
+      "grid-item-fragmentation-043.html": [
+       "7a4ddc54e21206a723e5f7f1dd53902d1718eedd",
+       [
+        null,
+        [
+         [
+          "/css/reference/ref-filled-green-100px-square.xht",
+          "=="
+         ]
+        ],
+        {}
+       ]
       ]
      },
      "ink-overflow-002.html": [
@@ -229165,12 +229185,16 @@
       ]
      }
     },
-    "ordering": {
+    "ordering-and-transition": {
      "README.md": [
-      "9ae6c7b19ff77cac170dd8234aa11ea8f37a1200",
+      "ec65b9ddbd1aebd0c0ae419b9cadd8902007d714",
       []
      ],
      "resources": {
+      "helpers.mjs": [
+       "1cbf6e7460dd359ab1b20c2eb23bb047425f5699",
+       []
+      ],
       "notify-top-early.html": [
        "0dd796f609c0659bd489e10cb02ac4816a88960b",
        []
@@ -279763,7 +279787,7 @@
       []
      ],
      "delete.js": [
-      "edfdcdb393515a9d2849955fc63884443030f7cb",
+      "26858d17197e124728c548a58796d7a16a08eb03",
       []
      ],
      "fontname.js": [
@@ -279783,7 +279807,7 @@
       []
      ],
      "forwarddelete.js": [
-      "2f96ef642346490133f19b635e3ad82a06224015",
+      "323d2b81b9f45f044729331e0490ef7d2682a4cd",
       []
      ],
      "hilitecolor.js": [
@@ -279803,7 +279827,7 @@
       []
      ],
      "inserthtml.js": [
-      "1f0a8f588dd630e3bcdcccc37d6ba3d021cab084",
+      "841f5493c90ee915f435028252e23b6c993ad3bd",
       []
      ],
      "insertimage.js": [
@@ -280065,7 +280089,7 @@
       []
      ],
      "delete_7001-last-expected.txt": [
-      "881a294fdd3107dab0dfffa3640a0bcf69e5e896",
+      "1ae6a7192d7448b34abd555190cc89b0fffb79e1",
       []
      ],
      "fontname-expected.txt": [
@@ -280189,7 +280213,7 @@
       []
      ],
      "inserthtml-expected.txt": [
-      "06c23700443abaff3eb0e9e872ee308d5befa517",
+      "8629d0ac24d9321ffe065d0ec6b3dff084a721c6",
       []
      ],
      "insertimage-expected.txt": [
@@ -283921,11 +283945,11 @@
       []
      ],
      "worker-fetch.https.window-expected.txt": [
-      "4ea413e243878208fb41d891d71645b433c64018",
+      "4595be0a098e599f1906faf0874c864866b6f6e6",
       []
      ],
      "worker-fetch.window-expected.txt": [
-      "cd62872e656ae0b85bc3257d8e1b789e087b9935",
+      "6deb19ba9599d204a7ce1855510f442f331fcd1e",
       []
      ]
     },
@@ -285813,7 +285837,7 @@
         ]
        },
        "events-expected.txt": [
-        "b8ce62d7455e3811966bd3053e501818bc290286",
+        "6dad05534728dc6a05db46b5c112a2fd9546e8ce",
         []
        ],
        "resources": {
@@ -340001,23 +340025,37 @@
       ]
      ]
     },
-    "ordering": {
+    "ordering-and-transition": {
+     "back-same-document-transitionWhile-reject.html": [
+      "94494cb0be2c3c8fddcd91e0bfeb35a644e1fe4c",
+      [
+       "app-history/ordering-and-transition/back-same-document-transitionWhile-reject.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/back-same-document-transitionWhile-reject.html?currentchange",
+       {}
+      ]
+     ],
+     "back-same-document-transitionWhile.html": [
+      "c203aed8b9f43c42de1e5e26d08bd744320a6649",
+      [
+       "app-history/ordering-and-transition/back-same-document-transitionWhile.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/back-same-document-transitionWhile.html?currentchange",
+       {}
+      ]
+     ],
      "back-same-document.html": [
-      "f4a2c382b8b9fd7d642cd943ade4fc69f1e5a668",
+      "985536d6f9919ec9a01f1214776c3f9475b5f847",
       [
-       "app-history/ordering/back-same-document.html?",
+       "app-history/ordering-and-transition/back-same-document.html?",
        {}
       ],
       [
-       "app-history/ordering/back-same-document.html?currentchange",
-       {}
-      ],
-      [
-       "app-history/ordering/back-same-document.html?transitionWhile",
-       {}
-      ],
-      [
-       "app-history/ordering/back-same-document.html?transitionWhile&currentChange",
+       "app-history/ordering-and-transition/back-same-document.html?currentchange",
        {}
       ]
      ],
@@ -340028,6 +340066,71 @@
        {}
       ]
      ],
+     "location-href-canceled.html": [
+      "ed776ffcad637de40399c82777e769b7b9d995e2",
+      [
+       null,
+       {}
+      ]
+     ],
+     "location-href-double-transitionWhile.html": [
+      "adb719f63f4e71743fbcdd41d9b625388db29b4c",
+      [
+       "app-history/ordering-and-transition/location-href-double-transitionWhile.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/location-href-double-transitionWhile.html?currentchange",
+       {}
+      ]
+     ],
+     "location-href-transitionWhile-reentrant.html": [
+      "d472ebf525273892f01a65b2e37ad038d040e546",
+      [
+       "app-history/ordering-and-transition/location-href-transitionWhile-reentrant.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/location-href-transitionWhile-reentrant.html?currentchange",
+       {}
+      ]
+     ],
+     "location-href-transitionWhile-reject.html": [
+      "1a5341eb922a8fa316520b6d353bb395fec1922a",
+      [
+       "app-history/ordering-and-transition/location-href-transitionWhile-reject.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/location-href-transitionWhile-reject.html?currentchange",
+       {}
+      ]
+     ],
+     "location-href-transitionWhile.html": [
+      "a80fcfa954372bab5eff8c4d5da91a70341fec1f",
+      [
+       "app-history/ordering-and-transition/location-href-transitionWhile.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/location-href-transitionWhile.html?currentchange",
+       {}
+      ]
+     ],
+     "navigate-canceled.html": [
+      "550284139a94de0894306e190e2deb7ea36ffb52",
+      [
+       null,
+       {}
+      ]
+     ],
+     "navigate-cross-document-double.html": [
+      "ba1edceead52cb79b9bcb77c317dca5e2636d817",
+      [
+       null,
+       {}
+      ]
+     ],
      "navigate-cross-document-event-order.html": [
       "1c1758a002eb8ac5e8ba8945dc6163d32a1a70f4",
       [
@@ -340035,66 +340138,128 @@
        {}
       ]
      ],
-     "navigate-same-document-transitionWhile-reject.html": [
-      "84e95eea75259541c0a943cccec5fd5161de8b0d",
+     "navigate-double-transitionWhile.html": [
+      "3db2dc12df29d68292f8fc0edbeccb14a7dae5be",
       [
-       "app-history/ordering/navigate-same-document-transitionWhile-reject.html?",
+       "app-history/ordering-and-transition/navigate-double-transitionWhile.html?",
        {}
       ],
       [
-       "app-history/ordering/navigate-same-document-transitionWhile-reject.html?currentchange",
+       "app-history/ordering-and-transition/navigate-double-transitionWhile.html?currentchange",
+       {}
+      ]
+     ],
+     "navigate-in-transition-finished.html": [
+      "b99b7a592a17d82da002e7f16ec46108b9a6e3e3",
+      [
+       "app-history/ordering-and-transition/navigate-in-transition-finished.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/navigate-in-transition-finished.html?currentchange",
+       {}
+      ]
+     ],
+     "navigate-same-document-transitionWhile-reentrant.html": [
+      "a77288f7375bc709d740bc0ac28718daa85d6f9a",
+      [
+       "app-history/ordering-and-transition/navigate-same-document-transitionWhile-reentrant.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/navigate-same-document-transitionWhile-reentrant.html?currentchange",
+       {}
+      ]
+     ],
+     "navigate-same-document-transitionWhile-reject.html": [
+      "ff894cd3c4adf72324d946dfcddaa2a22212de8f",
+      [
+       "app-history/ordering-and-transition/navigate-same-document-transitionWhile-reject.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/navigate-same-document-transitionWhile-reject.html?currentchange",
        {}
       ]
      ],
      "navigate-same-document.html": [
-      "0d30eeddfb67da3c1d5efaef8a7b7af938db0c38",
+      "0dee0418b4b57c2559e46beaeaccf19d7ebc6ce0",
       [
-       "app-history/ordering/navigate-same-document.html?",
+       "app-history/ordering-and-transition/navigate-same-document.html?",
        {}
       ],
       [
-       "app-history/ordering/navigate-same-document.html?currentchange",
+       "app-history/ordering-and-transition/navigate-same-document.html?currentchange",
+       {}
+      ]
+     ],
+     "navigate-transitionWhile-stop.html": [
+      "4d3c71ef3f7a2c63453288806007735d82f4ac30",
+      [
+       "app-history/ordering-and-transition/navigate-transitionWhile-stop.html?",
        {}
       ],
       [
-       "app-history/ordering/navigate-same-document.html?transitionWhile",
+       "app-history/ordering-and-transition/navigate-transitionWhile-stop.html?currentchange",
+       {}
+      ]
+     ],
+     "navigate-transitionWhile.html": [
+      "6a83fbdd48b8218bb38a01e344d6ee5c8d493e8a",
+      [
+       "app-history/ordering-and-transition/navigate-transitionWhile.html?",
        {}
       ],
       [
-       "app-history/ordering/navigate-same-document.html?transitionWhile&currentChange",
+       "app-history/ordering-and-transition/navigate-transitionWhile.html?currentchange",
        {}
       ]
      ],
-     "navigateerror-ordering-location-api-reentrant.html": [
-      "435690fcbc7ade816d52c91c80372a7449755916",
+     "reload-canceled.html": [
+      "0e060d227653b2b743d8c58c5ccef624e400ec19",
       [
        null,
        {}
       ]
      ],
-     "navigateerror-ordering-location-api.html": [
-      "92b76ad5ff0a502b48dff59f49ad6547c3749cc7",
+     "reload-transitionWhile-reject.html": [
+      "39a780eda20d4e18ed6f12d9d181819510e9dcf4",
+      [
+       "app-history/ordering-and-transition/reload-transitionWhile-reject.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/reload-transitionWhile-reject.html?currentchange",
+       {}
+      ]
+     ],
+     "reload-transitionWhile.html": [
+      "272ec385717986e0aea89827eb65ed86fd1599bf",
+      [
+       "app-history/ordering-and-transition/reload-transitionWhile.html?",
+       {}
+      ],
+      [
+       "app-history/ordering-and-transition/reload-transitionWhile.html?currentchange",
+       {}
+      ]
+     ],
+     "transition-cross-document.html": [
+      "400cccec25e5400f56c828ac6a0fdba46817811c",
       [
        null,
        {}
       ]
      ],
-     "navigateerror-ordering-navigate-cross-document.html": [
-      "ba1edceead52cb79b9bcb77c317dca5e2636d817",
+     "transition-finished-mark-as-handled.html": [
+      "c3b2723191aa51fd9a73157b826159584f444595",
       [
        null,
        {}
       ]
      ],
-     "navigateerror-ordering-transitionWhile-reentrant.html": [
-      "f5b4f84e8b6911dc38be308603254550d391b971",
-      [
-       null,
-       {}
-      ]
-     ],
-     "navigateerror-ordering-transitionWhile.html": [
-      "8f99d8a8a021e6eeae90c0f46e360d05129614ad",
+     "transition-realms-and-identity.html": [
+      "8b825dab1a44631b8d211708873521126e6978ae",
       [
        null,
        {}
@@ -340151,120 +340316,6 @@
        {}
       ]
      ]
-    },
-    "transition": {
-     "back-transitionWhile-rejected.html": [
-      "0619ddcdeaa466f356e714de4b11177c8481c5a5",
-      [
-       null,
-       {}
-      ]
-     ],
-     "back-transitionWhile.html": [
-      "ab5e72559a3c1f752203ede3558b33acc448d48e",
-      [
-       null,
-       {}
-      ]
-     ],
-     "cross-document.html": [
-      "400cccec25e5400f56c828ac6a0fdba46817811c",
-      [
-       null,
-       {}
-      ]
-     ],
-     "fragment-nav-transitionWhile.html": [
-      "af71157a6f5f59f6b368c25dabf3a3f4655a4e1e",
-      [
-       null,
-       {}
-      ]
-     ],
-     "fragment-nav.html": [
-      "b5274169209acce35d907e70ee7b18f8a0e1e35d",
-      [
-       null,
-       {}
-      ]
-     ],
-     "location-href-canceled.html": [
-      "a142e3a40d666cbe5504e7feec1eebd96d086df6",
-      [
-       null,
-       {}
-      ]
-     ],
-     "location-href-transitionWhile-rejected.html": [
-      "7e98872ef12c734fd15b3c2c186def0f99b64808",
-      [
-       null,
-       {}
-      ]
-     ],
-     "location-href-transitionWhile.html": [
-      "f843d737a53b32dabb9862c6f35c8ec1dadc490b",
-      [
-       null,
-       {}
-      ]
-     ],
-     "navigate-canceled.html": [
-      "8f58977d136be7d81924ff10f66a712fb09c3c0d",
-      [
-       null,
-       {}
-      ]
-     ],
-     "navigate-transitionWhile-interrupted.html": [
-      "6e3d82169973167ddb2b693ceaf674208d150082",
-      [
-       null,
-       {}
-      ]
-     ],
-     "navigate-transitionWhile-rejected.html": [
-      "ad4655d1571bb1b3f47f9f338f30f455a693010a",
-      [
-       null,
-       {}
-      ]
-     ],
-     "navigate-transitionWhile-stop.html": [
-      "a3172ae7e89f4e358c40e7695df148f31f5ba0a1",
-      [
-       null,
-       {}
-      ]
-     ],
-     "navigate-transitionWhile.html": [
-      "1e74e0da20b3c696ecb999c671291c60e71222c4",
-      [
-       null,
-       {}
-      ]
-     ],
-     "reload-canceled.html": [
-      "dac3a79bb72d77d7416f67ba51d2e0cd3b339228",
-      [
-       null,
-       {}
-      ]
-     ],
-     "reload-transitionWhile-rejected.html": [
-      "c08d62d91e76299fbed920a62db73a2809958e2b",
-      [
-       null,
-       {}
-      ]
-     ],
-     "reload-transitionWhile.html": [
-      "46b8e08e2904a8253f649907a053aa6381df885a",
-      [
-       null,
-       {}
-      ]
-     ]
     }
    },
    "audio-output": {
@@ -417977,7 +418028,7 @@
       ]
      ],
      "worker-fetch.https.window.js": [
-      "528b556a2e5af8a765bd820ebd5aacb6730ec965",
+      "7ca0b4359c3708d284ef94a7068f3c2c0b7756f9",
       [
        "fetch/private-network-access/worker-fetch.https.window.html",
        {
@@ -417995,7 +418046,7 @@
       ]
      ],
      "worker-fetch.window.js": [
-      "77be8bb98f09bc825b35571a8630723327a8ff1f",
+      "cf6e1ca30d5fa7f64480576b518db7aa2d41dd9e",
       [
        "fetch/private-network-access/worker-fetch.window.html",
        {
diff --git a/third_party/blink/web_tests/external/wpt/accessibility/crashtests/displaylocked-serialize.html b/third_party/blink/web_tests/external/wpt/accessibility/crashtests/displaylocked-serialize.html
new file mode 100644
index 0000000..76784291
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/accessibility/crashtests/displaylocked-serialize.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<link rel=author href="mailto:jarhar@chromium.org">
+<link rel=help href="https://bugs.chromium.org/p/chromium/issues/detail?id=1291169">
+
+<selectmenu></selectmenu>
+<div></div>
+
+<script>
+  (async () => {
+    const selectmenu = document.querySelector('selectmenu');
+    await getComputedAccessibleNode(document.querySelector('div'));
+    selectmenu.style.setProperty('content-visibility', 'hidden');
+  })();
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/cors/access-control-expose-headers-parsing.window-expected.txt b/third_party/blink/web_tests/external/wpt/cors/access-control-expose-headers-parsing.window-expected.txt
deleted file mode 100644
index 0fe27f2f..0000000
--- a/third_party/blink/web_tests/external/wpt/cors/access-control-expose-headers-parsing.window-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-This is a testharness.js-based test.
-PASS Loading JSON…
-PASS Parsing: access-control-expose-headers%3A%20BB-8
-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11!
-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%2C%20no%20no
-PASS Parsing: Access-Control-Expose-Headers%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cbb-8
-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0D%0AAccess-Control-Expose-Headers%3A%20no
-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0D%0AAccess-Control-Expose-Headers%3A%20no%20no
-PASS Parsing: Access-Control-Expose-Headers%3A%20no%0D%0AAccess-Control-Expose-Headers%3A%20bb-8
-FAIL Parsing: Access-Control-Expose-Headers%3A%0D%0AAccess-Control-Expose-Headers%3A%20bb-8 assert_equals: expected (string) "hey" but got (object) null
-FAIL Parsing: Access-Control-Expose-Headers%3A%20%2Cbb-8 assert_equals: expected (string) "hey" but got (object) null
-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0C
-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0B
-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0B%2Cbb-8
-PASS Parsing: Access-Control-Expose-Headers%3A%20'bb-8'
-PASS Parsing: Access-Control-Expose-Headers%3A%20'bb-8'%2Cbb-8
-PASS Parsing: Access-Control-Expose-Headers%3A%20%22bb-8%22%2Cbb-8
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-between-avoid-009.html b/third_party/blink/web_tests/external/wpt/css/css-break/break-between-avoid-009.html
new file mode 100644
index 0000000..d2e84f2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-between-avoid-009.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#break-propagation">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width:100px; height:100px; background:red;">
+  <div style="columns:2; column-fill:auto; column-gap:0; height:250px;">
+    <div style="height:100px; background:green;"></div>
+    <div style="height:100px; background:green;"></div>
+    <div style="break-inside:avoid;">
+      <div>
+        <div style="break-before:avoid; height:100px;"></div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-between-force-000.html b/third_party/blink/web_tests/external/wpt/css/css-break/break-between-force-000.html
new file mode 100644
index 0000000..9bccf739
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-between-force-000.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://www.w3.org/TR/css-break-3/#break-propagation">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="width:100px; height:100px; background:red;">
+  <div style="columns:2; column-fill:auto; column-gap:0; height:250px;">
+    <div style="height:100px; background:green;"></div>
+    <div style="break-inside:avoid;">
+      <div>
+        <div style="break-before:column; height:100px; background:green;"></div>
+      </div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-multicol/remove-spanner-beside-spanner-in-inline-crash.html b/third_party/blink/web_tests/external/wpt/css/css-multicol/remove-spanner-beside-spanner-in-inline-crash.html
new file mode 100644
index 0000000..969d54a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-multicol/remove-spanner-beside-spanner-in-inline-crash.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1292004">
+<div style="columns:2;">
+  <span></span>
+  <div id="removeme" style="column-span:all;"></div>
+  <span>
+    <div style="column-span:all;"></div>
+  </span>
+  <div style="column-span:all;"></div>
+</div>
+<script>
+  document.body.offsetTop;
+  removeme.style.display = "none";
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/dom/abort/AbortSignal.any.js b/third_party/blink/web_tests/external/wpt/dom/abort/AbortSignal.any.js
index 1d7d767..3bbdc11 100644
--- a/third_party/blink/web_tests/external/wpt/dom/abort/AbortSignal.any.js
+++ b/third_party/blink/web_tests/external/wpt/dom/abort/AbortSignal.any.js
@@ -10,3 +10,31 @@
   s.onabort = t.unreached_func("abort event handler called");
   t.step_timeout(() => { t.done(); }, 2000);
 }, "signal returned by AbortSignal.abort() should not fire abort event");
+
+test(t => {
+  const signal = AbortSignal.timeout(0);
+  assert_true(signal instanceof AbortSignal, "returned object is an AbortSignal");
+  assert_false(signal.aborted, "returned signal is not already aborted");
+}, "AbortSignal.timeout() returns a non-aborted signal");
+
+async_test(t => {
+  const signal = AbortSignal.timeout(5);
+  signal.onabort = t.step_func_done(() => {
+    assert_true(signal.aborted, "signal is aborted");
+    assert_true(signal.reason instanceof DOMException, "signal.reason is a DOMException");
+    assert_equals(signal.reason.name, "TimeoutError", "signal.reason is a TimeoutError");
+  });
+}, "Signal returned by AbortSignal.timeout() times out");
+
+async_test(t => {
+  let result = "";
+  for (const value of ["1", "2", "3"]) {
+    const signal = AbortSignal.timeout(5);
+    signal.onabort = t.step_func(() => { result += value; });
+  }
+
+  const signal = AbortSignal.timeout(5);
+  signal.onabort = t.step_func_done(() => {
+    assert_equals(result, "123", "Timeout order should be 123");
+  });
+}, "AbortSignal timeouts fire in order");
diff --git a/third_party/blink/web_tests/external/wpt/dom/abort/abort-signal-timeout.html b/third_party/blink/web_tests/external/wpt/dom/abort/abort-signal-timeout.html
new file mode 100644
index 0000000..2a9c13d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/abort/abort-signal-timeout.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>AbortSignal.timeout frame detach</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<iframe id="iframe"></iframe>
+<script>
+  async_test(t => {
+    const signal = iframe.contentWindow.AbortSignal.timeout(5);
+    signal.onabort = t.unreached_func("abort must not fire");
+
+    iframe.remove();
+
+    t.step_timeout(() => {
+      assert_false(signal.aborted);
+      t.done();
+    }, 10);
+  }, "Signal returned by AbortSignal.timeout() is not aborted after frame detach");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/editing/data/delete.js b/third_party/blink/web_tests/external/wpt/editing/data/delete.js
index edfdcdb..26858d1 100644
--- a/third_party/blink/web_tests/external/wpt/editing/data/delete.js
+++ b/third_party/blink/web_tests/external/wpt/editing/data/delete.js
@@ -2772,4 +2772,38 @@
      "<div contenteditable=\"false\"><custom-element contenteditable=\"\"><p><b>a</b><br></p></custom-element></div>"],
     [true],
     {"delete":[false,false,"",false,false,""]}],
+
+// Non-editable elements in editable content should be removed by hitting the
+// Backspace key.  Delete the non-editable things, then, blocks should be
+// merged.
+["<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>",
+    [["delete",""]],
+    ["<p>abcghi</p>",
+     "<p>abcghi<br></p>"],
+    [true],
+    {"delete":[false,false,"",false,false,""]}],
+["<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>",
+    [["delete",""]],
+    ["<p>abcghi</p>",
+     "<p>abcghi<br></p>"],
+    [true],
+    {"delete":[false,false,"",false,false,""]}],
+["<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>",
+    [["delete",""]],
+    ["<p>abcghi</p>",
+     "<p>abcghi<br></p>"],
+    [true],
+    {"delete":[false,false,"",false,false,""]}],
+["<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>",
+    [["delete",""]],
+    ["<ul><li>abcghi</li></ul>",
+     "<ul><li>abcghi<br></li></ul>"],
+    [true],
+    {"delete":[false,false,"",false,false,""]}],
+["<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>",
+    [["delete",""]],
+    ["<ul><li>abcghi</li></ul>",
+     "<ul><li>abcghi<br></li></ul>"],
+    [true],
+    {"delete":[false,false,"",false,false,""]}],
 ]
diff --git a/third_party/blink/web_tests/external/wpt/editing/data/forwarddelete.js b/third_party/blink/web_tests/external/wpt/editing/data/forwarddelete.js
index 2f96ef6..323d2b8 100644
--- a/third_party/blink/web_tests/external/wpt/editing/data/forwarddelete.js
+++ b/third_party/blink/web_tests/external/wpt/editing/data/forwarddelete.js
@@ -2653,4 +2653,37 @@
      "<div contenteditable=\"false\"><custom-element contenteditable=\"\"><p><b>a</b><br></p></custom-element></div>"],
     [true],
     {"forwarddelete":[false,false,"",false,false,""]}],
+
+// Non-editable elements in editable content should be removed by hitting the
+// Delete key.  Delete the non-editable things, then, blocks should be merged.
+["<p>abc[]</p><ul contenteditable=\"false\"><li>def</li></ul><p>ghi</p>",
+    [["forwarddelete",""]],
+    ["<p>abcghi</p>",
+     "<p>abcghi<br></p>"],
+    [true],
+    {"forwarddelete":[false,false,"",false,false,""]}],
+["<p>abc[]</p><ul><li contenteditable=\"false\">def</li></ul><p>ghi</p>",
+    [["forwarddelete",""]],
+    ["<p>abcghi</p>",
+     "<p>abcghi<br></p>"],
+    [true],
+    {"forwarddelete":[false,false,"",false,false,""]}],
+["<ul><li>abc[]</li><li contenteditable=\"false\">def</li><li>ghi</li></ul>",
+    [["forwarddelete",""]],
+    ["<ul><li>abcghi</li></ul>",
+     "<ul><li>abcghi<br></li></ul>"],
+    [true],
+    {"forwarddelete":[false,false,"",false,false,""]}],
+["<p>abc[]</p><ul><li contenteditable=\"false\">def</li><li>ghi</li></ul>",
+    [["forwarddelete",""]],
+    ["<p>abcghi</p>",
+     "<p>abcghi<br></p>"],
+    [true],
+    {"forwarddelete":[false,false,"",false,false,""]}],
+["<ul><li>abc[]</li><li contenteditable=\"false\">def</li></ul><p>ghi</p>",
+    [["forwarddelete",""]],
+    ["<ul><li>abcghi</li></ul>",
+     "<ul><li>abcghi<br></li></ul>"],
+    [true],
+    {"forwarddelete":[false,false,"",false,false,""]}],
 ]
diff --git a/third_party/blink/web_tests/external/wpt/editing/data/inserthtml.js b/third_party/blink/web_tests/external/wpt/editing/data/inserthtml.js
index 1f0a8f5..841f549 100644
--- a/third_party/blink/web_tests/external/wpt/editing/data/inserthtml.js
+++ b/third_party/blink/web_tests/external/wpt/editing/data/inserthtml.js
@@ -585,4 +585,9 @@
      "<div>a<span class=\"s1\"></span>b<span class=\"s2\"></span>c<br></div>"],
     [true],
     {"inserthtml":[false,false,"",false,false,""]}],
+["{}",
+    [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]],
+    "<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>",
+    [true],
+    {"inserthtml":[false,false,"",false,false,""]}],
 ]
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/delete_7001-last-expected.txt b/third_party/blink/web_tests/external/wpt/editing/run/delete_7001-last-expected.txt
index 881a294..1ae6a71 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/delete_7001-last-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/editing/run/delete_7001-last-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 255 tests; 252 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 300 tests; 297 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS [["delete",""]] "<p contenteditable=false><span contenteditable=true>[abc]</span></p>" queryCommandIndeterm("delete") after
 PASS [["delete",""]] "<p contenteditable=false><span contenteditable=true>[abc]</span></p>" queryCommandState("delete") after
 PASS [["delete",""]] "<p contenteditable=false><span contenteditable=true>[abc]</span></p>" queryCommandValue("delete") after
@@ -255,5 +255,50 @@
 PASS [["delete",""]] "<div contenteditable=\"false\"><custom-element contenteditable=\"\"><p><b>a[b</b></p><p><i>cd]</i></p></custom-element></div>" queryCommandIndeterm("delete") after
 PASS [["delete",""]] "<div contenteditable=\"false\"><custom-element contenteditable=\"\"><p><b>a[b</b></p><p><i>cd]</i></p></custom-element></div>" queryCommandState("delete") after
 PASS [["delete",""]] "<div contenteditable=\"false\"><custom-element contenteditable=\"\"><p><b>a[b</b></p><p><i>cd]</i></p></custom-element></div>" queryCommandValue("delete") after
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>": execCommand("delete", false, "") return value
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" checks for modifications to non-editable content
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" compare innerHTML
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" queryCommandIndeterm("delete") before
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" queryCommandState("delete") before
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" queryCommandValue("delete") before
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" queryCommandIndeterm("delete") after
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" queryCommandState("delete") after
+PASS [["delete",""]] "<p>abc</p><ul contenteditable=\"false\"><li>def</li></ul><p>[]ghi</p>" queryCommandValue("delete") after
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>": execCommand("delete", false, "") return value
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" checks for modifications to non-editable content
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" compare innerHTML
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandIndeterm("delete") before
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandState("delete") before
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandValue("delete") before
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandIndeterm("delete") after
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandState("delete") after
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandValue("delete") after
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>": execCommand("delete", false, "") return value
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" checks for modifications to non-editable content
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" compare innerHTML
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandIndeterm("delete") before
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandState("delete") before
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandValue("delete") before
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandIndeterm("delete") after
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandState("delete") after
+PASS [["delete",""]] "<p>abc</p><ul><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandValue("delete") after
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>": execCommand("delete", false, "") return value
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" checks for modifications to non-editable content
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" compare innerHTML
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandIndeterm("delete") before
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandState("delete") before
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandValue("delete") before
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandIndeterm("delete") after
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandState("delete") after
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li><li>[]ghi</li></ul>" queryCommandValue("delete") after
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>": execCommand("delete", false, "") return value
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" checks for modifications to non-editable content
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" compare innerHTML
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandIndeterm("delete") before
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandState("delete") before
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandValue("delete") before
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandIndeterm("delete") after
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandState("delete") after
+PASS [["delete",""]] "<ul><li>abc</li><li contenteditable=\"false\">def</li></ul><p>[]ghi</p>" queryCommandValue("delete") after
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt b/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt
index 06c23700..8629d0a 100644
--- a/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/editing/run/inserthtml-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 1516 tests; 1460 PASS, 56 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1525 tests; 1469 PASS, 56 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS [["stylewithcss","true"],["inserthtml","ab<b>c</b>d"]] "foo[]bar": execCommand("stylewithcss", false, "true") return value
 PASS [["stylewithcss","true"],["inserthtml","ab<b>c</b>d"]] "foo[]bar": execCommand("inserthtml", false, "ab<b>c</b>d") return value
 PASS [["stylewithcss","true"],["inserthtml","ab<b>c</b>d"]] "foo[]bar" checks for modifications to non-editable content
@@ -1516,5 +1516,14 @@
 PASS [["inserthtml","<span class=\"s1\"></span>b<span class=\"s2\"></span>"]] "<div>a[]c</div>" queryCommandIndeterm("inserthtml") after
 PASS [["inserthtml","<span class=\"s1\"></span>b<span class=\"s2\"></span>"]] "<div>a[]c</div>" queryCommandState("inserthtml") after
 PASS [["inserthtml","<span class=\"s1\"></span>b<span class=\"s2\"></span>"]] "<div>a[]c</div>" queryCommandValue("inserthtml") after
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}": execCommand("inserthtml", false, "<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>") return value
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" checks for modifications to non-editable content
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" compare innerHTML
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" queryCommandIndeterm("inserthtml") before
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" queryCommandState("inserthtml") before
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" queryCommandValue("inserthtml") before
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" queryCommandIndeterm("inserthtml") after
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" queryCommandState("inserthtml") after
+PASS [["inserthtml","<div class=\"d1\"></div><div class=\"d2\"><span class=\"s1\">some text</span><a href=\"foo.html\"></a></div>"]] "{}" queryCommandValue("inserthtml") after
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/render-blocked-apis-by-preload-link.tentative.html b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/render-blocked-apis-by-preload-link.tentative.html
new file mode 100644
index 0000000..cbc7a9a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/render-blocked-apis-by-preload-link.tentative.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<title>Certain APIs should not trigger while rendering is blocked by a preload link</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="support/test-render-blocking.js"></script>
+
+<link id="font-preload" rel="preload" as="font" blocking="render" crossorigin
+      href="/fonts/Ahem.ttf?pipe=trickle(d1)">
+<style>
+@font-face {
+  font-family: custom-font;
+  src: url('/fonts/Ahem.ttf?pipe=trickle(d1)');
+}
+</style>
+<span id="target" style="font: 20px/1 custom-font">Lorem ipsum</span>
+
+<script>
+const preload = document.getElementById('font-preload');
+test_render_blocked_apis(
+    preload,
+    () => {
+      const target = document.getElementById('target');
+      assert_equals(target.offsetHeight, 20);
+      assert_equals(target.offsetWidth, 220);
+    },
+    'Render-blocking web font is applied');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/render-blocked-apis-by-stylesheet-link.tentative.html b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/render-blocked-apis-by-stylesheet-link.tentative.html
new file mode 100644
index 0000000..1be31b03
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/render-blocked-apis-by-stylesheet-link.tentative.html
@@ -0,0 +1,20 @@
+<!doctype html>
+<title>Certain APIs should not trigger while rendering is blocked by a stylesheet link</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="support/test-render-blocking.js"></script>
+<script>
+// Test case must be set up before the stylesheet, because the stylesheet is
+// script-blocking, which means we can't set it up while the stylesheet is
+// loading.
+test_render_blocked_apis(() => {
+  let color = getComputedStyle(document.querySelector('.target')).color;
+  assert_equals(color, 'rgb(255, 0, 0)');
+}, 'Render-blocking stylesheet is applied');
+</script>
+<link rel="stylesheet" href="support/target-red.css?pipe=trickle(d1)">
+<div class="target">
+  This should be red
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/test-render-blocking.js b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/test-render-blocking.js
index 3cd3b7d..bc87aef6 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/test-render-blocking.js
+++ b/third_party/blink/web_tests/external/wpt/html/dom/render-blocking/support/test-render-blocking.js
@@ -15,6 +15,44 @@
   }
 }
 
+function createAutofocusTarget() {
+  const autofocusTarget = document.createElement('textarea');
+  autofocusTarget.setAttribute('autofocus', '');
+  // We may not have a body element at this point if we are testing a
+  // script-blocking stylesheet. Hence, the new element is added to
+  // documentElement.
+  document.documentElement.appendChild(autofocusTarget);
+  return autofocusTarget;
+}
+
+function createScrollTarget() {
+  const scrollTarget = document.createElement('div');
+  scrollTarget.style.overflow = 'scroll';
+  scrollTarget.style.height = '100px';
+  const scrollContent = document.createElement('div');
+  scrollContent.style.height = '200px';
+  scrollTarget.appendChild(scrollContent);
+  document.documentElement.appendChild(scrollTarget);
+  return scrollTarget;
+}
+
+function createAnimationTarget() {
+  const style = document.createElement('style');
+  style.textContent = `
+      @keyframes anim {
+        from { height: 100px; }
+        to { height: 200px; }
+      }
+  `;
+  const animationTarget = document.createElement('div');
+  animationTarget.style.backgroundColor = 'green';
+  animationTarget.style.height = '50px';
+  animationTarget.style.animation = 'anim 100ms';
+  document.documentElement.appendChild(style);
+  document.documentElement.appendChild(animationTarget);
+  return animationTarget;
+}
+
 // Error margin for comparing timestamps of paint and load events, in case they
 // are reported by different threads.
 const epsilon = 50;
@@ -44,3 +82,93 @@
   }, finalTestTitle);
 }
 
+// Tests that certain steps of Update the rendering [1] are not reached when
+// the document is render-blocked and hence has no rendering opportunities.
+// [1] https://html.spec.whatwg.org/multipage/webappapis.html#update-the-rendering
+function test_render_blocked_apis(optional_element, finalTest, finalTestTitle) {
+  // Ideally, we should observe the 'load' event on the specific render-blocking
+  // elements. However, this is not possible for script-blocking stylesheets, so
+  // we have to observe the 'load' event on 'window' instead.
+  if (!(optional_element instanceof HTMLElement)) {
+    finalTestTitle = finalTest;
+    finalTest = optional_element;
+    optional_element = undefined;
+  }
+  const loadObserver = new LoadObserver(optional_element || window);
+
+  function test_event_blocked(target, events, title, optional_action) {
+    if (!Array.isArray(events))
+      events = [events];
+    const promise = new Promise((resolve, reject) => {
+      for (let eventName of events) {
+        target.addEventListener(eventName,
+                                () => reject(`'${eventName}' event is dispatched`));
+      }
+      loadObserver.load.then(resolve);
+
+      if (optional_action)
+        optional_action();
+    });
+    promise_test(() => promise, title);
+  }
+
+  test_event_blocked(
+      createAutofocusTarget(), 'focus',
+      'Should not flush autofocus candidates when render-blocked');
+
+  // requestFullscreen() below will trigger viewport resize.
+  test_event_blocked(
+      window, 'resize',
+      'Should not run the resize steps when render-blocked');
+
+  const scrollTarget = createScrollTarget();
+  test_event_blocked(
+      scrollTarget, 'scroll',
+      'Should not run the scroll steps when render-blocked',
+      () => scrollTarget.scrollTop = 100);
+
+  // requestFullscreen() below will change the matches state
+  test_event_blocked(
+      matchMedia('all and (display-mode: fullscreen)'), 'change',
+      'Should not run the evaluate media queries and report changes steps when render-blocked');
+
+  test_event_blocked(
+      createAnimationTarget(), ['animationstart', 'animationend'],
+      'Should not run the update animations and send events steps when render-blocked');
+
+  test_event_blocked(
+      document, ['fullscreenchange', 'fullscreenerror'],
+      'Should not run the fullscreen steps when render-blocked',
+      () => {
+        if (window.test_driver) {
+          test_driver.bless('Initiate fullscreen',
+              () => document.documentElement.requestFullscreen()
+              .then(() => document.exitFullscreen()));
+        }
+      });
+
+  // We should also verify that the context lost steps for canvas are not run,
+  // but there's currently no way to reliably trigger a context lost in WPT.
+  // See https://github.com/web-platform-tests/wpt/issues/30039
+
+  const raf = new Promise((resolve, reject) => {
+    requestAnimationFrame(() => reject('Animation frame callback is run'));
+    loadObserver.load.then(resolve);
+  });
+  promise_test(
+      () => raf,
+      'Should not run animation frame callbacks when render-blocked');
+
+  const intersection = new Promise((resolve, reject) => {
+    new IntersectionObserver(() => reject('IntersectionObserver callback is run'))
+        .observe(document.documentElement);
+    loadObserver.load.then(resolve);
+  });
+  promise_test(
+      () => intersection,
+      'Should not run the update intersection observers step when render-blocked');
+
+  promise_test(test => {
+    return loadObserver.load.then(() => finalTest(test));
+  }, finalTestTitle);
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1-expected.txt
deleted file mode 100644
index 17ffcf3..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-1-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Frames with `allow-top-navigation` should be able to navigate the top frame. assert_equals: expected "can navigate" but got "cannot navigate"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3-expected.txt
deleted file mode 100644
index c7156339..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/iframe_sandbox_allow_top_navigation-3-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL Frames with `allow-top-navigation` should be able to navigate the top frame even when `allow-top-navigation-by-user-activation` is set. assert_equals: expected "can navigate" but got "cannot navigate"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html
index 04682784..9b9eae8 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/support/iframe-that-performs-top-navigation-on-popup.html
@@ -4,7 +4,7 @@
 <script>
 window.onload = function() {
   try {
-    top.location = "data:text/html,\u003c!DOCTYPE html\u003e\u003cscript\u003eopener.postMessage('can navigate', '*');\u003c/script\u003e";
+    top.location = "iframe-that-send-message-to-the-opener.html";
   } catch(e) {
     top.postMessage("cannot navigate", "*");
   }
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/support/iframe-that-send-message-to-the-opener.html b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/support/iframe-that-send-message-to-the-opener.html
new file mode 100644
index 0000000..0dc3b11
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/embedded-content/the-iframe-element/support/iframe-that-send-message-to-the-opener.html
@@ -0,0 +1,8 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script>
+opener.postMessage('can navigate', '*');
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/cycle-without-delay-expected.txt b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/cycle-without-delay-expected.txt
new file mode 100644
index 0000000..a46ff8f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/cycle-without-delay-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test that cycles that don't contain a DelayNode are muted assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/delay-time-clamping-expected.txt b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/delay-time-clamping-expected.txt
new file mode 100644
index 0000000..6ad8fe5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/delay-time-clamping-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test that a DelayNode allows a feedback loop of a single rendering quantum assert_equals: Silent audio found instead of a delayed impulse expected 1 but got 0
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/feedback-delay-time-expected.txt b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/feedback-delay-time-expected.txt
new file mode 100644
index 0000000..6ad8fe5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/processing-model/feedback-delay-time-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test that a DelayNode allows a feedback loop of a single rendering quantum assert_equals: Silent audio found instead of a delayed impulse expected 1 but got 0
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https-expected.txt b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https-expected.txt
new file mode 100644
index 0000000..432473d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiobuffersourcenode-interface/active-processing.https-expected.txt
@@ -0,0 +1,25 @@
+This is a testharness.js-based test.
+PASS # AUDIT TASK RUNNER STARTED.
+PASS Executing "Setup graph"
+PASS Executing "verify count change"
+PASS Audit report
+PASS > [Setup graph] 
+PASS   AudioWorklet and graph construction resolved correctly.
+PASS < [Setup graph] All assertions passed. (total 1 assertions)
+PASS > [verify count change] 
+FAIL X Number of channels changed is not true. Got false. assert_true: expected true got false
+PASS   Index where input channel count changed is less than or equal to 1280.
+FAIL X Number of channels in input[0:-2]: Expected 7 for all values but found 1023 unexpected values: 
+	Index	Actual
+	[256]	0
+	[257]	0
+	[258]	0
+	[259]	0
+	...and 1019 more errors. assert_true: expected true got false
+FAIL X Number of channels in input[-1:]: Expected 1 for all values but found 1 unexpected values: 
+	Index	Actual
+	[0]	0 assert_true: expected true got false
+FAIL < [verify count change] 3 out of 4 assertions were failed. assert_true: expected true got false
+FAIL # AUDIT TASK RUNNER FINISHED: 1 out of 2 tasks were failed. assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-channelmergernode-interface/active-processing.https-expected.txt b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-channelmergernode-interface/active-processing.https-expected.txt
new file mode 100644
index 0000000..4961c5ce
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-channelmergernode-interface/active-processing.https-expected.txt
@@ -0,0 +1,16 @@
+This is a testharness.js-based test.
+PASS # AUDIT TASK RUNNER STARTED.
+PASS Executing "initialize"
+PASS Executing "test"
+PASS Audit report
+PASS > [initialize] 
+PASS   AudioWorklet module loading resolved correctly.
+PASS < [initialize] All assertions passed. (total 1 assertions)
+PASS > [test] 
+PASS   Test 0: Number of convolver output channels is equal to 7.
+FAIL X Test 1: Number of convolver output channels is not equal to 1. Got 0. assert_true: expected true got false
+PASS   Number of distinct values is equal to 2.
+FAIL < [test] 1 out of 3 assertions were failed. assert_true: expected true got false
+FAIL # AUDIT TASK RUNNER FINISHED: 1 out of 2 tasks were failed. assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-convolvernode-interface/active-processing.https-expected.txt b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-convolvernode-interface/active-processing.https-expected.txt
new file mode 100644
index 0000000..876a0308
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-convolvernode-interface/active-processing.https-expected.txt
@@ -0,0 +1,16 @@
+This is a testharness.js-based test.
+PASS # AUDIT TASK RUNNER STARTED.
+PASS Executing "initialize"
+PASS Executing "test"
+PASS Audit report
+PASS > [initialize] 
+PASS   AudioWorklet module loading resolved correctly.
+PASS < [initialize] All assertions passed. (total 1 assertions)
+PASS > [test] 
+PASS   Test 0: Number of convolver output channels is equal to 2.
+FAIL X Test 1: Number of convolver output channels is not equal to 1. Got 0. assert_true: expected true got false
+PASS   Number of distinct values is equal to 2.
+FAIL < [test] 1 out of 3 assertions were failed. assert_true: expected true got false
+FAIL # AUDIT TASK RUNNER FINISHED: 1 out of 2 tasks were failed. assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/fast/forms/date/date-text-height-appearance.html b/third_party/blink/web_tests/fast/forms/date/date-text-height-appearance.html
new file mode 100644
index 0000000..7042f14
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/date/date-text-height-appearance.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+
+<p>These pairs of inputs should each have the same height:</p>
+
+<div id=s1>
+  <input type="text" value="hello">
+  <input type="date" value="2022-01-01">
+</div>
+<div id=s2>
+  <input type="text" value="hello">
+  <input type="date" value="2022-01-01">
+</div>
+<div id=s3>
+  <input type="text" value="hello">
+  <input type="date" value="2022-01-01">
+</div>
+
+<style>
+* {
+  margin:0;
+  padding:0;
+  border:0;
+  font-family: serif;
+  font-size:0;
+}
+p {
+  font-size: 12pt;
+}
+input {
+  display:inline-block;
+}
+div {
+  margin-top: 10px;
+  border: 1px solid black;
+  width: max-content;
+  height: min-content;
+  max-height: min-content;
+  background:red;
+}
+#s1 input {
+  font-size:6pt;
+}
+#s2 input {
+  font-size:12pt;
+}
+#s3 input {
+  font-size:18pt;
+}
+</style>
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 7212104c..e1b913f 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 2923e65..32e3840 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png
index 4e37b1b..ad691c7 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 1682119..4abf678 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png
index 9337485..bee2022 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 14c5823..5fe7f61 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 3be45fa0..411ee99 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index 821c9b2..88c0cb4 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index d3f5448..d2a99c4 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png
index 0d584594..dca3d0bf 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 218dcbc3..b232c62 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..88c0cb4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..d2a99c4
--- /dev/null
+++ b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index f8573f3..95e57228 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 17be6af..6bd97078 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png
index be9ff57..a4e1e2c 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index edcc7b0..287f311 100644
--- a/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/flag-specific/highdpi/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/media/media-source/mediasource-timestamp-offset.html b/third_party/blink/web_tests/http/tests/media/media-source/mediasource-timestamp-offset.html
index ebf5348d..2db5b3a 100644
--- a/third_party/blink/web_tests/http/tests/media/media-source/mediasource-timestamp-offset.html
+++ b/third_party/blink/web_tests/http/tests/media/media-source/mediasource-timestamp-offset.html
@@ -42,6 +42,14 @@
           simpleTimestampOffsetTest('10.5', 10.5, 'a number string');
           simpleTimestampOffsetTest('', 0, 'an empty string');
 
+          // Specific to Chromium's usage of TimeDelta with int64_t range in
+          // microseconds for offsets internally, ensure that setting
+          // timestampOffset to a very small value does not saturate to
+          // internal concept of -Infinity in TimeDelta and then fail DCHECK.
+          simpleTimestampOffsetTest(
+              '-9223372036854.776', -9223372036854.776,
+              'a number less than internal kNoTimestamp, but not -Infinity');
+
           mediasource_testafterdataloaded(function(test, mediaElement, mediaSource, segmentInfo, sourceBuffer, mediaData)
           {
               var initSegment = MediaSourceUtil.extractSegmentData(mediaData, segmentInfo.init);
@@ -83,18 +91,18 @@
               test.expectEvent(sourceBuffer, "updateend", "initSegment append ended.");
               sourceBuffer.appendBuffer(initSegment);
               assert_equals(mediaSource.sourceBuffers[0].timestampOffset, 0, "read initial value");
-              
+
               test.waitForExpectedEvents(function()
               {
                   test.expectEvent(sourceBuffer, "updateend", "mediaSegment append ended.");
                   sourceBuffer.appendBuffer(mediaSegment);
-                  assert_equals(mediaSource.sourceBuffers[0].timestampOffset, 0, 
+                  assert_equals(mediaSource.sourceBuffers[0].timestampOffset, 0,
                       "No change to timestampoffset after segments mode init segment append");
               });
-             
+
               test.waitForExpectedEvents(function()
               {
-                  assert_equals(mediaSource.sourceBuffers[0].timestampOffset, 0, 
+                  assert_equals(mediaSource.sourceBuffers[0].timestampOffset, 0,
                       "No change to timestampoffset after segments mode media segment append");
                   test.done();
               });
@@ -104,18 +112,18 @@
           {
               var sourceBuffer = mediaSource.addSourceBuffer(MediaSourceUtil.AUDIO_VIDEO_TYPE);
               assert_true(sourceBuffer != null, "New SourceBuffer returned");
-             
+
               // FIXME: verify activeSourceBuffers is empty before removeSourceBuffer as well.
-            
-              mediaSource.removeSourceBuffer(sourceBuffer);  
+
+              mediaSource.removeSourceBuffer(sourceBuffer);
               assert_true(mediaSource.sourceBuffers.length == 0, "MediaSource.sourceBuffers is empty");
               assert_true(mediaSource.activeSourceBuffers.length == 0, "MediaSource.activesourceBuffers is empty");
-                          
-              assert_throws_dom("InvalidStateError", function() 
+
+              assert_throws_dom("InvalidStateError", function()
               {
                   sourceBuffer.timestampOffset = 10;
               });
-               
+
               test.done();
           }, "Test setting timestampoffset after removing the sourcebuffer.");
         </script>
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 7b777414..051fc75 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -10,6 +10,7 @@
     method respondWith
 interface AbortSignal : EventTarget
     static method abort
+    static method timeout
     attribute @@toStringTag
     getter aborted
     getter onabort
diff --git a/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe-expected.html b/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe-expected.html
index def47433..d7557ff6 100644
--- a/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe-expected.html
+++ b/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe-expected.html
@@ -5,8 +5,22 @@
 <style>
 body { width: 800px; margin: 0; }
 </style>
+<script>
+  if (window.testRunner)
+    testRunner.waitUntilDone();
+
+  function done() {
+    if (window.testRunner) {
+      requestAnimationFrame(()=> {
+        requestAnimationFrame(()=> {
+          testRunner.notifyDone();
+        });
+      });
+    }
+  }
+</script>
 </head>
 <body>
-<iframe style="width: 100%; height: 300px; border: 0" src='http://localhost:8000/text-autosizing/resources/narrow-iframe-expected.html'>
+<iframe onload="done()" style="width: 100%; height: 300px; border: 0" src='http://localhost:8000/text-autosizing/resources/narrow-iframe-expected.html'>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe.html b/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe.html
index 5f4009f..b9aa562 100644
--- a/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe.html
+++ b/third_party/blink/web_tests/http/tests/text-autosizing/narrow-iframe.html
@@ -6,10 +6,24 @@
 body { width: 800px; margin: 0; }
 </style>
 <script src="resources/autosizingTest.js"></script>
+<script>
+  if (window.testRunner)
+    testRunner.waitUntilDone();
+
+  function done() {
+    if (window.testRunner) {
+      requestAnimationFrame(()=> {
+        requestAnimationFrame(()=> {
+          testRunner.notifyDone();
+        });
+      });
+    }
+  }
+</script>
 </head>
 <body>
   <iframe
-      style="width: 100%; height: 300px; border: 0"
+      onload="done()" style="width: 100%; height: 300px; border: 0"
       src="http://localhost:8000/text-autosizing/resources/narrow-iframe.html">
 </body>
 </html>
diff --git a/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe-expected.html b/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe-expected.html
index 86bfc41..d38033e 100644
--- a/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe-expected.html
+++ b/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe-expected.html
@@ -6,11 +6,24 @@
 <style>
 body { width: 800px; margin: 0; }
 </style>
+<script>
+  if (window.testRunner)
+    testRunner.waitUntilDone();
 
+  function done() {
+    if (window.testRunner) {
+      requestAnimationFrame(()=> {
+        requestAnimationFrame(()=> {
+          testRunner.notifyDone();
+        });
+      });
+    }
+  }
+</script>
 </head>
 <body>
 
-<iframe style="width: 3200px; height: 50%; border: 0" src='http://localhost:8000/text-autosizing/resources/wide-iframe-expected.html'>
+<iframe onload="done()" style="width: 3200px; height: 50%; border: 0" src='http://localhost:8000/text-autosizing/resources/wide-iframe-expected.html'>
 
 </body>
 </html>
diff --git a/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe.html b/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe.html
index b9c71ed..87b1ebd 100644
--- a/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe.html
+++ b/third_party/blink/web_tests/http/tests/text-autosizing/wide-iframe.html
@@ -8,12 +8,26 @@
 </style>
 
 <script src="resources/autosizingTest.js"></script>
+<script>
+  if (window.testRunner)
+    testRunner.waitUntilDone();
+
+  function done() {
+    if (window.testRunner) {
+      requestAnimationFrame(()=> {
+        requestAnimationFrame(()=> {
+          testRunner.notifyDone();
+        });
+      });
+    }
+  }
+</script>
 
 </head>
 <body>
 
   <iframe
-      style="width: 3200px; height: 50%; border: 0"
+      onload="done()" style="width: 3200px; height: 50%; border: 0"
       src="http://localhost:8000/text-autosizing/resources/wide-iframe.html">
 
 </body>
diff --git a/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png
index c815c74e..0b306bc 100644
--- a/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/linux/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index a6e40bc..7bd20a1 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index b59938c..8dac75f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 9b1a926..aa88162 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index 22544d4..33e117121 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index f01e557c5..889d20e5 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index b8a5d0e..0c008f0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 3e84cc1a..54ed990 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index 4876819..5c58bdc 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 2ea5278..ce34721d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index a6e40bc..7bd20a1 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index 01af686d..393ab40 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index de471b91..ff9d0ca 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index b527819..db5e26e 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 8c24098..34ddc3b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png
index 77a3992..b445031 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index 78f307ae..fbe7bbf 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png
index ae914fd..cb76a157 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 30e564ad..6e8fc37 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index f24d71ca..578182b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 45633d5cc..0f752cc 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 49e2ecca..1a4c6de4 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 7e5c1d4..8802c83 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index d3bc585..c273a1c3 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index ba6b4d4..b24fa3a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 5a6ae80..24bb8e0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 83edb14..bb9ca6b 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 8e01d4dc..7fbe1dc 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 3d16ac3..341c4d39 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index b66bb9d..3aa0c113 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 44d8b2a..328fc1e 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 74dec6c..f5f21bab 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 9fbbc66..3e2923a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index af835e7..3fad39a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 04e4cc0..3ce771a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 66f3ef61..9786d43 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png
index 59409ba0..29681f8 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png
index f2df5a39..9b83443 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png
index 184aa08..ed09a89 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..efe37d1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 2289e90..ccf4eec3 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index eb108ce..abdda3c7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index e84d10d..13dc832 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png
index 71e595e..b3afe7f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png
index 8fffff82..0ccad93 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png
index 218e126d..23dc6256 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index 2f6edd0..b1f1dc6 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png
index 5a56a3d..72b65c0 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png
index 0bda3215..155c3db 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index 79d7bc49..c71bc6d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 1ec0830..a91aeb3 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 3059687c..31a268c 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
index 010c86f9..5da1fce 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
index 6d0bf10..6f08c52 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 0cd7c02..d5c7a68 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
index 1f402ff..8dd2001 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index 3ccf384b..60dd8cae7 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index ed89690..5067c57c 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index d09fa5a..671d4571 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index 1ba49a1..aeeb87d9 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 81702759..7fbe697f 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
index ca89c85..098a9b2d 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
index 31dec7a7..a51f4dd 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
index 1ca0119..8c0be07 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png
index 3f0a4ee..adf754a 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png
index b7b84199..4849b975 100644
--- a/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/week/week-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 782c8252..a2aecce 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 2afee44..1359c52 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 2be8342..2476bdf 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index c3770e8..5e27703 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index aaf7bc96..1c67892 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index f97847b..7bcf999 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 679fa66..08262c8 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index f6d823d..bdf0cfdd 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 28aca2e6..29ee873 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 0f7f0ea..bbb9d79 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 82ba251..1baf6ad0c 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index ea5b105..da017fe 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 6f20f71..22d7702 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 09c9113..640a068 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 3cbdbdec..00342f5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 2245ab0..531c173a 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 01206acd..2ca1e741 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png
index 21603e0d..41ced69d 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index 1cf104a..b03cf16 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png
index c201490..805b57b 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
index 6fab181..5abf433 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index dfb6320f..11397d2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 79e0cdf..4b6ce05 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index a6b76af4..303e9cfd 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 3049d29..7bc9640b 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 8fa9b68..fc5498f8 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 20c2f70..88e6c9e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 2802b10d..460e41e5 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 28884fd3..080bfd3 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 3663643a..0c5f626 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 33e096c..0a3b7033e 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index ab5013a..fc487b2 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 6009c4d..9a6bd4a4 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index afaa478..efce4490 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 5b127029..243fe79 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
index 6e6b90e..7da1797 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
index 6e6b90e..7da1797 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
index f8573f3..95e57228 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 7b8dd60..c31aa251 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index 9a23caa1..0d8f917 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
index 9a23caa1..0d8f917 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index ee2b9253..4a43b68 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..31a268c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..5da1fce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..6f08c52
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
new file mode 100644
index 0000000..8dd2001
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..60dd8cae7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..5067c57c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..671d4571
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..aeeb87d9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..7fbe697f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
new file mode 100644
index 0000000..098a9b2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..a51f4dd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..8c0be07
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/scroll-unification/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
deleted file mode 100644
index a6d768f..0000000
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 9b56399..b66de54 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
new file mode 100644
index 0000000..9c35547
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..dad32dba
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-step-expected.png
new file mode 100644
index 0000000..e92bbaf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 3f8a4bafb..d522c03 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index 80f4029..ef56db6 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 81fefe9..1dbfdcf 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
new file mode 100644
index 0000000..3a5beb75
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
new file mode 100644
index 0000000..0a2fc8c2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 047777a..584f28f 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png
index 6363b74..aed67c5 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-picker-appearance-step-expected.png
new file mode 100644
index 0000000..8d940d2
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.13/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
new file mode 100644
index 0000000..1c16251d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png
index 832eca8..abfa1f40 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 536ede29..8487627 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png
index 8f7ee6d9..456ef20 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index ed7ce9b..6b9a2b9 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png
index 18f2dc4..e288ec7 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.15/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/month/month-picker-appearance-zoom150-expected.png
deleted file mode 100644
index 4fc9ca7..0000000
--- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..0bcd796
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png
index a8e6cf6..23bbf00 100644
--- a/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/mac/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
similarity index 81%
copy from third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
copy to third_party/blink/web_tests/platform/mac/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
index f8f1c989..714a65a 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
@@ -1,4 +1,4 @@
 This is a testharness.js-based test.
-FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4720
+FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4718.65625
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index e7aaa99..4a42584 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index 84c3b88..4b9c454 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 8a23de32..8a64b0f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index 913e970..b11c2a9 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index aa4e3e2..e0ceb13 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index f48a51b2..2ee3211 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index df41e58..eb2d63e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index d80742b..bf4aa49 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 0df9fd24..a419cdf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index e7aaa99..4a42584 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index ecbc986..c10d30c1 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 4a4cea7..e327d83 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index d70acec7..89916634 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 2ff0013f..41cb8a66 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png
index 8b08e354..f418b71 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index cf866cd..31a1f20 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png
index cc3b881..b65ced553 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 5f98cb2..b1636ce 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index fc16c2dc..7ddafcf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index db1236b..5220ee7e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 273c3df..232dcbbc4 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index fae63175..7e96037 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 035115e..9c35547 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 14470b0..8c85818e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index b8b22e9..ec899024 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index aa3c8c6e..52ba9e9 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index cdde3703..ad76227 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 7b1f2f4..157c408 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index fde74cb1..e15dcc0e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index a31ec37a..afa56a57 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 1d968d6..a0c424d 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 11f07cb..ab62ee8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 2e60dea..0a2fc8c2 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 8e718aa..171a220 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 501e900..6a0b8b9 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png
index 2dbf52d..4f4e092 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png
index cb58e8b..a2f15ea 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png
index 301e9ea..37f9ad7 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..f59c00e1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 42d0a7e..678b979 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 0594ff51..b174ddc 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index d369ce88..36d2cf31 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png
index 7ea28f68..496aa831 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png
index 1c33e7d..30aa04e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png
index b871f0e..2338f64 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index 85deb2a..623452f 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png
index ccb3667..379c82c6 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png
index f9f0508..e92bbaf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index c0bac6c..1de545e 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png
index 3bbee40..8bb9456 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 2aa87fc..e9c3acc 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
index 911f3d74..a0aa077 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
index 5a3a0b8..6427aa8 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 7b9eb149..375e7e1 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
index 6722ef9..343192ad 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index e359853c..ce6bd97 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index 5985027a6..ebb46c5 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 87877a3..a1989ea 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index 0356410..e8213804 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 4315cc1..1cdc28a 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
index a87d48661..c30c8bfc 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
index 67864ba..e97fe43 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
index fe308f7..b10879c 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png
index cc27574..af692fd 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png
index 0bca035..995c592 100644
--- a/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/week/week-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 76912b4..2552bd4 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 50d15bd..cfb480d3 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 5b8236182..ddf1dcc 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index ba0f38b..db52e60 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 79699e68..bc68d827 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 8e7e61d..91e94ef 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 0ee8d1c..4ed1ccea 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index b51a996..3e9b686 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 858a143..b4964ed9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 0959094f..1fa6f82 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 10408733..93e1d6a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 1b768dd..5300606 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 7292c7e8..141e63e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index bf4fd61..e57c91e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index bc169ca..f98d299 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 6338915..e338279 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 38b914e..ebe88e62 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png
index 07571313..0d2c575 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index 98eb003..bb0cfe9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png
index 031676b0..84632a5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
index 6772933..0c920bd9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index 701c9d6..ec0a6418 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 4e8daa7..50b063e 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 6784d41..981b720 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index eca3c935..1405a2a 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index d698ff0..85c6afb 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index a9dc7ed..dbc277f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 9f710e7..d8a7656 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index dd2b013..c5694b5 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 1771e9b..e2e1a46 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 25c4d9a6..c492c32 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index df9dc27..a08f2ba3 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index b823190..9852a0c2 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index e516f14..71049de9 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 187e80ac..e008dc8 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
index c6cfaca..6b7bf79f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
index c6cfaca..6b7bf79f 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index ea0c986..c7ab634 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index e1859b3..b1566ee4 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png
index e469293..de80442 100644
--- a/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/win/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
similarity index 83%
rename from third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
rename to third_party/blink/web_tests/platform/win/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
index f8f1c989..48717ed 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
+++ b/third_party/blink/web_tests/platform/win/external/wpt/css/css-scroll-snap/scroll-target-margin-005-expected.txt
@@ -1,4 +1,4 @@
 This is a testharness.js-based test.
-FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4720
+FAIL scroll-margin on input widget assert_between_exclusive: Should honor date input scroll-margin expected a number greater than 4750 and less than 4850 but got 4719
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index 2abd583..fa142077 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index f57dac18..5fe3aed 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 8f0279ca..bcba0f6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index 5dffab7..a0125ae4 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
index 73b39a49..58a98e6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-ru-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index 5201f8aa..029a31f 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index 137ef6a..24739a8 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index 63e9daa..dd380c21 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 624cdab..41ca588 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index 2abd583..fa142077 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index cce1caf..7e4a611 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 3037044..36385e1 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index ff140fab..a170dfc 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 878963e..c2acba1 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png
index cd99842..8b6239a0 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index 0709ed9..9ad068e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png
index c0b892c..8269f62 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 5fc7e18..a2e8b23 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index d3953d0..51c2b82 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 124f51a..d4604c6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 3ab2d54..c9a3663c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 62e4d24c..923130b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 5f2df55..3773804 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 4e7179b..eecc3d2 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 4fefc39..3d2e915 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 8fbbd9a..abfa71c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 0715a88..210cca1 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 3ef329ea..9e1a5d6 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 3a2c6c4..b9a5360 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 92305ae..8d04d56 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index d3dd9da1..10907dd 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 4f69a2b..5ac4d44c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 1c2709f..00c12c2 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index e70cdc0..4718e3b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 384d34ad..3827c63e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png
index de48939b..9aa1aad 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png
index 4f8f223d..0ddee2a 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png
index 7b771b9..fedaf2e5 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..8fd88a62
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
index 86f075a..9b189db 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 66716f2..832e907ce 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index 6bb736e..54efc06 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png
index 103853c5..db4067ef 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
index e83014c..b4b4af2 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png
index 4358481..3e25dd7 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index d6cb3ae..f554d9a 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png
index 3224caa..80240c5 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png
index 0a84ae2..cd61859 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index e588a68..be17577e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png
index fd97625c..b1969ca 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 49005e8..62cd725 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
index 8d40c3eb..61a20825 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
index 9539258..178ca29 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 9bf02c4..e69767e 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
index c003ac31..c1c0f45 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-locale-hebrew-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
index f1e2c7d..4990a07 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
index 3f7543cf..477ac19b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/datetimelocal-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 07a21ce6..4863c0b 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index c34608e..c2fd011f 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 4b2cfbc..5020767 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 54e471d..a769a17 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
index a2b5d70c..09b4cce 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
index 04d05057..d08f3bb 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png
index d9e24145..26d2bb4 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png
index cb89df1..61cb79c 100644
--- a/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win/fast/forms/week/week-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index b22e889..b5ea1a0 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 6ced17e..6a89275 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index 53c03a8..82e9516d2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 62a20c5b..e3ca519d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index c4c9b935..c690fa89 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 7266afd..72a6f8d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index f9e20f33..56c5fb2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 0262c356..70fea86 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 5c797fd..b14eeb1 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index cd55d1f..3eb402a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
index 5ac842ab..e89c2c1b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/date-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
index 3cf6a33..034a257 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/datetimelocal-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 861ba0a..c521efad 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
index 5920803..101d4f3 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index ae8050b8..7a2e0bc9 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index c3faa86..d1e1bb7 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 5f82982..d5053c32 100644
--- a/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/controls-refresh-hc/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png
index b97bc4d..5e56451 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index 28c73d05..bc926b2 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png
index ca52697..44e0c25 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
index 075a478..a5a9548f8 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-focus-ring-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index a49af54..e50590a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 304a391..d905d16b 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index e855960..5f47e67 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index e46f788a..55d05b7 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
index 2d2dff24..8bd1c22 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 9a36c7c3..ee5290f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
index 97f27fd..0400e320 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 9cefea7..97b299a 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 4fc483b..76cd54f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 98de2ad..552439f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 6ad77ca4..8d80e9e 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index e68514c..879f587 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 443ec0f..daaec91 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
index 75ca996..5fa9e6d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-color-scheme/fast/forms/color-scheme/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
index 74f077f..592c4ea4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
index 74f077f..592c4ea4 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-increase-text-contrast/dark-mode/colors/web-theme-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
index e2bb1948..c15cebfe 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 0aa666f..49419172 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index 361c940..6134156 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index f2d9436..546026f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
index 361c940..6134156 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 8e5abbd..546026f 100644
--- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
index 18b0075..5a49087 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
index ba135e4..d0f480c0 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-minimum-date-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
index 9d01faae..2ebd5771 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-ar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
index bf1e377..2d63425 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-required-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
index a63a2434..d0316b088 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
index d7290f62..13a800b 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom125-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
index bff4f72..5f7fd6c8 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/calendar-picker-appearance-zoom200-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-coarse-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
index 11a06c8..caadefde 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-disabled-previous-month-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
index 18b0075..5a49087 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
index ad30dccb..eec66e7 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
index 971f5b1d..306cceb 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
index 0da3c55..732a3d9 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
index 6e403495..0b9f05e 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/date-picker-month-selection-changed-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png
index 09b719a5..8a6f329 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
index 11c6b400..b3a22bd 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png
index b0d878f..d84f3f9e 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
index 222788b..daaa0a7ea 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/calendar-picker/week-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 474635c3..afb364a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 7412d894..bb0fc3a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index fd926ba6..38dd860 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 879da59..43c85ea 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index eb3af14..1b601ce 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index bf39923..7d718ed 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index b1dfd141..6228eaa 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 6454c142..8ee78ff 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 73a95cd..18170bd 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 5493d5c..12ca136 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index 11514e8..d8a75f1 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/date/date-text-height-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/date/date-text-height-appearance-expected.png
new file mode 100644
index 0000000..1fd205a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/date/date-text-height-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
index 51ffa5c..3de79c6 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
index 0cb7ff9..2fe4e71 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/datetimelocal/datetimelocal-picker-step2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png
index 9c10dbe..c267e7b6 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
index 4cc6c6ae..949f71b 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-l10n-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png
index 2e4272e..7032f70 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-appearance-pseudo-elements-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png
index 6a9025936..7a8df7ad 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-disabled-today-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png
index fb4fbb4..fb182ed 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png
index 3d54765c..d34745b1 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-step-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
index 284610e..7077b66 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-value-not-in-interval-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png
index a6788b6..06d8a3a 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/month/month-picker-appearance-zoom150-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
deleted file mode 100644
index cb4e704..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
deleted file mode 100644
index 9390d81..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/date-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index f44c015..168085d 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
index 9f0ced1..c72df20e6 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
index 9b7dc92..97d8ce7d 100644
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
deleted file mode 100644
index 41a74ca..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
deleted file mode 100644
index 6de1d43..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-rtl-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
deleted file mode 100644
index 423a022..0000000
--- a/third_party/blink/web_tests/platform/win7/fast/forms/suggestion-picker/week-suggestion-picker-appearance-with-scroll-bar-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index ff77d15..ac3a68a 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index ae0118e..d9f6e17 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index b3f1003..a6fa3f36 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index 32f7495..66f3346 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 88490f7..4ef71eb 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 3a3c840..7b50fb4 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index 6e18317..9f8fc88 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index 66372a1..fba2ade 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
index 06f2b79..6f16460 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index e4b5a4d..2edc244 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index d6d05f0..26ce1e8 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh-hc/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
index eb39917b..c48aa74 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png
index 75f249a5e..02c430c 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/date/date-picker-open-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
index 954c9269..a735131d5 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/datetimelocal-picker/datetimelocal-month-year-selector-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
index 0e7cd62..02b6fb57 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
index 4319c97f..2801805 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
index f8c56ba4..0d01f592 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
index d49f620..2afd43f 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/datetimelocal-picker/datetimelocal-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
index 869ecbc..b7a6847 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-disabled-values-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
index 51d4fa2..6b9b5352 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
index c7012f1e..dabc52f 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month-picker/month-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
index d2290b7..66e253a 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
index 59636dc..5dbcf1b 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-es-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
index f91d5fd..2405d71c 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/dark-color-scheme/fast/forms/color-scheme/week-picker/week-picker-appearance-highlight-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
index f0dbe7f..d9b9422 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index f0f9d804..22127ab 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor150/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
index fde4489..2e85da81 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 7bc8edb..6271ad1 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
index fde4489..2e85da81 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/calendar-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
index 309fdc9..6271ad1 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scalefactor200withzoom/fast/hidpi/static/data-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
index f44c015..168085d 100644
--- a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
+++ b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
new file mode 100644
index 0000000..c72df20e6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-rtl-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
new file mode 100644
index 0000000..97d8ce7d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/scroll-unification/fast/forms/suggestion-picker/month-suggestion-picker-appearance-with-scroll-bar-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index ce0b6a35..cd0b02b 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -11,6 +11,7 @@
 [Worker]     method constructor
 [Worker] interface AbortSignal : EventTarget
 [Worker]     static method abort
+[Worker]     static method timeout
 [Worker]     attribute @@toStringTag
 [Worker]     getter aborted
 [Worker]     getter onabort
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 8aafcad..cc2a846 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -10,6 +10,7 @@
     method constructor
 interface AbortSignal : EventTarget
     static method abort
+    static method timeout
     attribute @@toStringTag
     getter aborted
     getter onabort
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index ba10730..d220defe 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -11,6 +11,7 @@
 [Worker]     method constructor
 [Worker] interface AbortSignal : EventTarget
 [Worker]     static method abort
+[Worker]     static method timeout
 [Worker]     attribute @@toStringTag
 [Worker]     getter aborted
 [Worker]     getter onabort
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/download.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/download.https.html
new file mode 100644
index 0000000..ae9cebbe
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/download.https.html
@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<title>Test fenced frame does not allow triggering download</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/utils.js"></script>
+<script src="resources/utils.js"></script>
+<script src="resources/download-helper.js"></script>
+
+<body>
+  <script>
+    const testTypes = [
+      {
+        type: "anchor",
+        description: "Anchor click triggering download in fenced frames is blocked."
+      },
+      {
+        type: "navigation",
+        description: "Navigation resulted download in fenced frames is blocked."
+      }
+    ];
+
+    testTypes.forEach(({type, description}) => {
+      promise_test(async t => {
+        const download_key = token();
+        const download_ack_key = token();
+
+        // The download link is clicked inside the fenced frame after the loading
+        const fenced_frame_url = generateURL("resources/download-inner.html", [download_key, download_ack_key]) + `&type=${type}`;
+        attachFencedFrame(fenced_frame_url);
+
+        const response = await nextValueFromServer(download_ack_key);
+        assert_equals(response, 'Triggered the action for download');
+
+        const result = await VerifyDownload(t, download_key);
+        assert_false(result, 'Expect no download to happen');
+      }, description);
+    });
+  </script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-helper.js b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-helper.js
new file mode 100644
index 0000000..011d5c8
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-helper.js
@@ -0,0 +1,29 @@
+function StreamDownloadFinishDelay() {
+  return 1000;
+}
+
+function DownloadVerifyDelay() {
+  return 1000;
+}
+
+async function VerifyDownload(test_obj, token) {
+  const verifyToken = async (token) => {
+    const url = `resources/download-stash.py?verify-token&token=${token}`;
+    const response = await fetch(url);
+    if (!response.ok) {
+      throw new Error('An error happened in the server');
+    }
+    const message = await response.text();
+    return message === 'TOKEN_SET';
+  };
+
+  return new Promise((resolve) => {
+    test_obj.step_wait(
+        async () => {
+          const result = await verifyToken(token);
+          resolve(result);
+        },
+        'Check if the download has finished or not',
+        StreamDownloadFinishDelay() + DownloadVerifyDelay());
+  });
+}
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-inner.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-inner.html
new file mode 100644
index 0000000..9bc816cb
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-inner.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <title>The page triggering download embedded as a Fenced Frame</title>
+  <script src="/resources/testdriver.js"></script>
+  <script src="/resources/testdriver-vendor.js"></script>
+  <script src="download-helper.js"></script>
+  <script src="utils.js"></script>
+  <script>
+    window.addEventListener('DOMContentLoaded', async () => {
+      const [download_key, download_ack_key] = parseKeylist();
+      const type = new URL(location).searchParams.get('type');
+      const href = `download-stash.py?token=${download_key}`;
+
+      if (type == 'anchor') {
+        const anchor = document.querySelector('#download');
+        anchor.href = href;
+        test_driver.click(anchor);
+      } else {
+        const delay = StreamDownloadFinishDelay();
+        location.href = `${href}&finish-delay=${delay}`
+      }
+
+      await writeValueToServer(download_ack_key, 'Triggered the action for download');
+    });
+  </script>
+</head>
+
+<body>
+  <a id="download" download>Download</a>
+</body>
+
+</html>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-inner.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-inner.html.headers
new file mode 100644
index 0000000..6247f6d
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-inner.html.headers
@@ -0,0 +1 @@
+Supports-Loading-Mode: fenced-frame
\ No newline at end of file
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-stash.py b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-stash.py
new file mode 100644
index 0000000..497f7cb0
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/download-stash.py
@@ -0,0 +1,28 @@
+import time
+
+
+def main(request, response):
+    token = request.GET[b"token"]
+    response.status = 200
+    response.headers.append(b"Content-Type", b"text/html")
+    if b"verify-token" in request.GET:
+        if request.server.stash.take(token):
+            return u'TOKEN_SET'
+        return u'TOKEN_NOT_SET'
+
+    if b"finish-delay" not in request.GET:
+        # <a download>
+        request.server.stash.put(token, True)
+        return
+
+    # navigation to download
+    response.headers.append(b"Content-Disposition", b"attachment")
+    response.write_status_headers()
+    finish_delay = float(request.GET[b"finish-delay"]) / 1E3
+    count = 10
+    single_delay = finish_delay / count
+    for i in range(count):  # pylint: disable=unused-variable
+        time.sleep(single_delay)
+        if not response.writer.write_content(b"\n"):
+            return
+    request.server.stash.put(token, True)
diff --git a/third_party/closure_compiler/externs/developer_private.js b/third_party/closure_compiler/externs/developer_private.js
index dcf27c7..90634eb 100644
--- a/third_party/closure_compiler/externs/developer_private.js
+++ b/third_party/closure_compiler/externs/developer_private.js
@@ -868,3 +868,9 @@
  * @type {!ChromeEvent}
  */
 chrome.developerPrivate.onProfileStateChanged;
+
+/**
+ * Fired when the lists of sites in the user's site settings have changed.
+ * @type {!ChromeEvent}
+ */
+chrome.developerPrivate.onUserSiteSettingsChanged;
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 3eeb323..8dc1a28 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-11-1-91-g946e1353e
-Revision: 946e1353eaa34872d0b138a13820fc03a782c545
+Version: VER-2-11-1-94-g56d182a74
+Revision: 56d182a74d90cde8753d5ec28d37f748f909c729
 CPEPrefix: cpe:/a:freetype:freetype:2.11.1
 License: Custom license "inspired by the BSD, Artistic, and IJG (Independent
          JPEG Group) licenses"
diff --git a/third_party/jsoncpp/BUILD.gn b/third_party/jsoncpp/BUILD.gn
index b51aa3a..03d76df 100644
--- a/third_party/jsoncpp/BUILD.gn
+++ b/third_party/jsoncpp/BUILD.gn
@@ -11,7 +11,7 @@
   # declaration flag.
   # This temporary flag allowing clients to update to the new version, and then
   # update to the new StreamWriter and CharReader classes.
-  if (!is_win || is_clang) {
+  if (!is_win || (is_clang && !is_ios)) {
     cflags_cc = [ "-Wno-deprecated-declarations" ]
   }
 }
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium
index 0d8f24f..89f016b 100644
--- a/third_party/libaom/README.chromium
+++ b/third_party/libaom/README.chromium
@@ -3,9 +3,9 @@
 URL: https://aomedia.googlesource.com/aom/
 Version: 3.1.2
 CPEPrefix: cpe:/a:aomedia:aomedia:3.1.2
-Date: Wednesday December 01 2021
-Branch: master
-Commit: fae44ad0475640af761691a06b5fbeb5c147b84e
+Date: Monday January 24 2022
+Branch: main
+Commit: c9feb209a41343981c215072583d385bdda2bab1
 License: BSD
 License File: source/libaom/LICENSE
 Security Critical: yes
diff --git a/third_party/libaom/libaom_srcs.gni b/third_party/libaom/libaom_srcs.gni
index 5fdf4177..eace2582 100644
--- a/third_party/libaom/libaom_srcs.gni
+++ b/third_party/libaom/libaom_srcs.gni
@@ -8,8 +8,6 @@
   "//third_party/libaom/source/libaom/av1/common/x86/convolve_2d_avx2.c",
   "//third_party/libaom/source/libaom/av1/common/x86/convolve_avx2.c",
   "//third_party/libaom/source/libaom/av1/common/x86/highbd_inv_txfm_avx2.c",
-  "//third_party/libaom/source/libaom/av1/common/x86/highbd_jnt_convolve_avx2.c",
-  "//third_party/libaom/source/libaom/av1/common/x86/highbd_wiener_convolve_avx2.c",
   "//third_party/libaom/source/libaom/av1/common/x86/jnt_convolve_avx2.c",
   "//third_party/libaom/source/libaom/av1/common/x86/reconinter_avx2.c",
   "//third_party/libaom/source/libaom/av1/common/x86/wiener_convolve_avx2.c",
@@ -51,7 +49,6 @@
   "//third_party/libaom/source/libaom/av1/common/x86/av1_txfm_sse4.h",
   "//third_party/libaom/source/libaom/av1/common/x86/filterintra_sse4.c",
   "//third_party/libaom/source/libaom/av1/common/x86/highbd_inv_txfm_sse4.c",
-  "//third_party/libaom/source/libaom/av1/common/x86/highbd_jnt_convolve_sse4.c",
   "//third_party/libaom/source/libaom/av1/common/x86/intra_edge_sse4.c",
   "//third_party/libaom/source/libaom/av1/common/x86/reconinter_sse4.c",
 ]
@@ -61,9 +58,7 @@
   "//third_party/libaom/source/libaom/av1/common/x86/av1_inv_txfm_ssse3.c",
   "//third_party/libaom/source/libaom/av1/common/x86/av1_inv_txfm_ssse3.h",
   "//third_party/libaom/source/libaom/av1/common/x86/cfl_ssse3.c",
-  "//third_party/libaom/source/libaom/av1/common/x86/highbd_wiener_convolve_ssse3.c",
   "//third_party/libaom/source/libaom/av1/common/x86/jnt_convolve_ssse3.c",
-  "//third_party/libaom/source/libaom/av1/common/x86/reconinter_ssse3.c",
   "//third_party/libaom/source/libaom/av1/common/x86/resize_ssse3.c",
 ]
 
@@ -172,7 +167,6 @@
 
 aom_av1_encoder_intrin_avx2 = [
   "//third_party/libaom/source/libaom/av1/encoder/x86/av1_quantize_avx2.c",
-  "//third_party/libaom/source/libaom/av1/encoder/x86/av1_highbd_quantize_avx2.c",
   "//third_party/libaom/source/libaom/av1/encoder/x86/corner_match_avx2.c",
   "//third_party/libaom/source/libaom/av1/encoder/x86/error_intrin_avx2.c",
   "//third_party/libaom/source/libaom/av1/encoder/x86/av1_fwd_txfm_avx2.h",
@@ -223,7 +217,6 @@
 aom_av1_encoder_intrin_sse4_1 = [
   "//third_party/libaom/source/libaom/av1/encoder/x86/av1_fwd_txfm1d_sse4.c",
   "//third_party/libaom/source/libaom/av1/encoder/x86/av1_fwd_txfm2d_sse4.c",
-  "//third_party/libaom/source/libaom/av1/encoder/x86/av1_highbd_quantize_sse4.c",
   "//third_party/libaom/source/libaom/av1/encoder/x86/corner_match_sse4.c",
   "//third_party/libaom/source/libaom/av1/encoder/x86/encodetxb_sse4.c",
   "//third_party/libaom/source/libaom/av1/encoder/x86/highbd_fwd_txfm_sse4.c",
@@ -462,6 +455,8 @@
   "//third_party/libaom/source/libaom/aom_dsp/x86/blend_a64_hmask_sse4.c",
   "//third_party/libaom/source/libaom/aom_dsp/x86/blend_a64_mask_sse4.c",
   "//third_party/libaom/source/libaom/aom_dsp/x86/blend_a64_vmask_sse4.c",
+  "//third_party/libaom/source/libaom/aom_dsp/x86/intrapred_sse4.c",
+  "//third_party/libaom/source/libaom/aom_dsp/x86/intrapred_utils.h",
 ]
 
 aom_dsp_common_intrin_ssse3 = [
@@ -518,8 +513,6 @@
 ]
 
 aom_dsp_encoder_asm_sse2 = [
-  "//third_party/libaom/source/libaom/aom_dsp/x86/highbd_subpel_variance_impl_sse2.asm",
-  "//third_party/libaom/source/libaom/aom_dsp/x86/highbd_variance_impl_sse2.asm",
   "//third_party/libaom/source/libaom/aom_dsp/x86/sad4d_sse2.asm",
   "//third_party/libaom/source/libaom/aom_dsp/x86/sad_sse2.asm",
   "//third_party/libaom/source/libaom/aom_dsp/x86/subpel_variance_sse2.asm",
@@ -643,6 +636,20 @@
 
 aom_ports_asm_x86 = [ "//third_party/libaom/source/libaom/aom_ports/float.asm" ]
 
+aom_rc_interface_sources = [
+  "//third_party/libaom/source/libaom/common/y4minput.c",
+  "//third_party/libaom/source/libaom/common/y4minput.h",
+  "//third_party/libaom/source/libaom/test/codec_factory.h",
+  "//third_party/libaom/source/libaom/test/decode_test_driver.cc",
+  "//third_party/libaom/source/libaom/test/decode_test_driver.h",
+  "//third_party/libaom/source/libaom/test/encode_test_driver.cc",
+  "//third_party/libaom/source/libaom/test/encode_test_driver.h",
+  "//third_party/libaom/source/libaom/test/ratectrl_rtc_test.cc",
+  "//third_party/libaom/source/libaom/test/test_aom_rc_interface.cc",
+  "//third_party/libaom/source/libaom/test/y4m_video_source.h",
+  "//third_party/libaom/source/libaom/test/yuv_video_source.h",
+]
+
 aom_rtcd_sources = [
   "//third_party/libaom/source/libaom/aom_dsp/aom_dsp_rtcd.c",
   "//third_party/libaom/source/libaom/aom_scale/aom_scale_rtcd.c",
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h
index 4a14763a..1b75a55 100644
--- a/third_party/libaom/source/config/config/aom_version.h
+++ b/third_party/libaom/source/config/config/aom_version.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -12,8 +12,8 @@
 #define VERSION_MAJOR 3
 #define VERSION_MINOR 2
 #define VERSION_PATCH 0
-#define VERSION_EXTRA "269-gfae44ad04"
+#define VERSION_EXTRA "430-gc9feb209a"
 #define VERSION_PACKED \
   ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH))
-#define VERSION_STRING_NOSP "3.2.0-269-gfae44ad04"
-#define VERSION_STRING " 3.2.0-269-gfae44ad04"
+#define VERSION_STRING_NOSP "3.2.0-430-gc9feb209a"
+#define VERSION_STRING " 3.2.0-430-gc9feb209a"
diff --git a/third_party/libaom/source/config/ios/arm-neon/config/aom_config.asm b/third_party/libaom/source/config/ios/arm-neon/config/aom_config.asm
index 14a2b3f2..829c5671c 100644
--- a/third_party/libaom/source/config/ios/arm-neon/config/aom_config.asm
+++ b/third_party/libaom/source/config/ios/arm-neon/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/ios/arm-neon/config/aom_config.h b/third_party/libaom/source/config/ios/arm-neon/config/aom_config.h
index f4cd495..21d1197a 100644
--- a/third_party/libaom/source/config/ios/arm-neon/config/aom_config.h
+++ b/third_party/libaom/source/config/ios/arm-neon/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h
index 45a57863..cb33dbb5c 100644
--- a/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm-neon/config/aom_dsp_rtcd.h
@@ -1138,11 +1138,11 @@
 int16_t aom_int_pro_col_neon(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_neon
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_neon(int16_t* hbuf,
+void aom_int_pro_row_neon(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -1364,13 +1364,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1385,13 +1385,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1406,13 +1406,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1427,13 +1427,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1448,13 +1448,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1469,13 +1469,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1490,13 +1490,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1511,13 +1511,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1532,13 +1532,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1553,13 +1553,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1574,13 +1574,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1595,13 +1595,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1616,13 +1616,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1637,13 +1637,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1658,13 +1658,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1679,13 +1679,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -2171,17 +2171,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -2199,17 +2199,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -2239,22 +2239,22 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_neon
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2272,17 +2272,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2304,17 +2304,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2340,17 +2340,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2372,22 +2372,22 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad32x32x4d aom_sad32x32x4d_neon
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2405,17 +2405,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2445,17 +2445,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2473,17 +2473,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2509,17 +2509,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2537,17 +2537,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2569,22 +2569,22 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad64x64x4d aom_sad64x64x4d_neon
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2614,17 +2614,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2642,17 +2642,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2674,17 +2674,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2707,14 +2707,14 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_neon(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 #define aom_sad_skip_128x128x4d aom_sad_skip_128x128x4d_neon
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
@@ -2729,14 +2729,14 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_128x64x4d aom_sad_skip_128x64x4d_neon
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
@@ -2751,14 +2751,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_neon
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -2773,14 +2773,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_neon
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -2795,14 +2795,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_neon
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -2817,14 +2817,14 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x16x4d aom_sad_skip_32x16x4d_neon
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
@@ -2839,14 +2839,14 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x32x4d aom_sad_skip_32x32x4d_neon
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
@@ -2861,14 +2861,14 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x64x4d aom_sad_skip_32x64x4d_neon
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
@@ -2879,9 +2879,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -2896,14 +2896,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_neon
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -2918,14 +2918,14 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_64x128x4d aom_sad_skip_64x128x4d_neon
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
@@ -2940,14 +2940,14 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x32x4d aom_sad_skip_64x32x4d_neon
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
@@ -2962,14 +2962,14 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x64x4d aom_sad_skip_64x64x4d_neon
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
@@ -2984,14 +2984,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_neon
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -3002,9 +3002,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -3019,14 +3019,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_neon
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h b/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h
index 6aac910..ab613f4fb 100644
--- a/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm-neon/config/av1_rtcd.h
@@ -234,18 +234,6 @@
 #define av1_build_compound_diffwtd_mask_d16 \
   av1_build_compound_diffwtd_mask_d16_neon
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -745,71 +733,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_neon
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_neon(const int16_t* input,
                              tran_low_t* output,
@@ -1477,8 +1400,7 @@
                                         int h);
 #define cdef_copy_rect8_8bit_to_16bit cdef_copy_rect8_8bit_to_16bit_neon
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1488,8 +1410,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_neon(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_neon(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -1501,6 +1422,28 @@
                             int coeff_shift);
 #define cdef_filter_block cdef_filter_block_neon
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_neon(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+#define cdef_filter_block_highbd cdef_filter_block_highbd_neon
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
diff --git a/third_party/libaom/source/config/ios/arm64/config/aom_config.asm b/third_party/libaom/source/config/ios/arm64/config/aom_config.asm
index 14a2b3f2..829c5671c 100644
--- a/third_party/libaom/source/config/ios/arm64/config/aom_config.asm
+++ b/third_party/libaom/source/config/ios/arm64/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/ios/arm64/config/aom_config.h b/third_party/libaom/source/config/ios/arm64/config/aom_config.h
index f4cd495..21d1197a 100644
--- a/third_party/libaom/source/config/ios/arm64/config/aom_config.h
+++ b/third_party/libaom/source/config/ios/arm64/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h
index 45a57863..cb33dbb5c 100644
--- a/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm64/config/aom_dsp_rtcd.h
@@ -1138,11 +1138,11 @@
 int16_t aom_int_pro_col_neon(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_neon
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_neon(int16_t* hbuf,
+void aom_int_pro_row_neon(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -1364,13 +1364,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1385,13 +1385,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1406,13 +1406,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1427,13 +1427,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1448,13 +1448,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1469,13 +1469,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1490,13 +1490,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1511,13 +1511,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1532,13 +1532,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1553,13 +1553,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1574,13 +1574,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1595,13 +1595,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1616,13 +1616,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1637,13 +1637,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1658,13 +1658,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1679,13 +1679,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -2171,17 +2171,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -2199,17 +2199,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -2239,22 +2239,22 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_neon
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2272,17 +2272,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2304,17 +2304,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2340,17 +2340,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2372,22 +2372,22 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad32x32x4d aom_sad32x32x4d_neon
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2405,17 +2405,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2445,17 +2445,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2473,17 +2473,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2509,17 +2509,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2537,17 +2537,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2569,22 +2569,22 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad64x64x4d aom_sad64x64x4d_neon
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2614,17 +2614,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2642,17 +2642,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2674,17 +2674,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2707,14 +2707,14 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_neon(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 #define aom_sad_skip_128x128x4d aom_sad_skip_128x128x4d_neon
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
@@ -2729,14 +2729,14 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_128x64x4d aom_sad_skip_128x64x4d_neon
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
@@ -2751,14 +2751,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_neon
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -2773,14 +2773,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_neon
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -2795,14 +2795,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_neon
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -2817,14 +2817,14 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x16x4d aom_sad_skip_32x16x4d_neon
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
@@ -2839,14 +2839,14 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x32x4d aom_sad_skip_32x32x4d_neon
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
@@ -2861,14 +2861,14 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x64x4d aom_sad_skip_32x64x4d_neon
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
@@ -2879,9 +2879,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -2896,14 +2896,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_neon
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -2918,14 +2918,14 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_64x128x4d aom_sad_skip_64x128x4d_neon
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
@@ -2940,14 +2940,14 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x32x4d aom_sad_skip_64x32x4d_neon
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
@@ -2962,14 +2962,14 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x64x4d aom_sad_skip_64x64x4d_neon
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
@@ -2984,14 +2984,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_neon
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -3002,9 +3002,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -3019,14 +3019,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_neon
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h b/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h
index 6aac910..ab613f4fb 100644
--- a/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/ios/arm64/config/av1_rtcd.h
@@ -234,18 +234,6 @@
 #define av1_build_compound_diffwtd_mask_d16 \
   av1_build_compound_diffwtd_mask_d16_neon
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -745,71 +733,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_neon
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_neon(const int16_t* input,
                              tran_low_t* output,
@@ -1477,8 +1400,7 @@
                                         int h);
 #define cdef_copy_rect8_8bit_to_16bit cdef_copy_rect8_8bit_to_16bit_neon
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1488,8 +1410,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_neon(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_neon(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -1501,6 +1422,28 @@
                             int coeff_shift);
 #define cdef_filter_block cdef_filter_block_neon
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_neon(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+#define cdef_filter_block_highbd cdef_filter_block_highbd_neon
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm
index 41428b2..e059481eb 100644
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h
index 7e0c46b..3c26f1a3 100644
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h
index c30725a..b3f3fa2 100644
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/aom_dsp_rtcd.h
@@ -1246,15 +1246,15 @@
 int16_t aom_int_pro_col_neon(const uint8_t* ref, const int width);
 RTCD_EXTERN int16_t (*aom_int_pro_col)(const uint8_t* ref, const int width);
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_neon(int16_t* hbuf,
+void aom_int_pro_row_neon(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
-RTCD_EXTERN void (*aom_int_pro_row)(int16_t* hbuf,
+RTCD_EXTERN void (*aom_int_pro_row)(int16_t hbuf[16],
                                     const uint8_t* ref,
                                     const int ref_stride,
                                     const int height);
@@ -1519,13 +1519,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1540,13 +1540,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1561,13 +1561,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1582,13 +1582,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1603,13 +1603,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1624,13 +1624,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1645,13 +1645,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1666,13 +1666,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1687,13 +1687,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1708,13 +1708,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1729,13 +1729,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1750,13 +1750,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1771,13 +1771,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1792,13 +1792,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1813,13 +1813,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1834,13 +1834,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -2366,17 +2366,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -2394,17 +2394,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -2437,26 +2437,26 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad16x16x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2474,17 +2474,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2509,17 +2509,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2545,17 +2545,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2580,26 +2580,26 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2617,17 +2617,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2660,17 +2660,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2688,17 +2688,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2724,17 +2724,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2752,17 +2752,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2787,26 +2787,26 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2839,17 +2839,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2867,17 +2867,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2902,17 +2902,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2938,19 +2938,19 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_neon(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x128x4d)(const uint8_t* src_ptr,
                                             int src_stride,
-                                            const uint8_t* const ref_ptr[],
+                                            const uint8_t* const ref_ptr[4],
                                             int ref_stride,
-                                            uint32_t* sad_array);
+                                            uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
                                    int src_stride,
@@ -2967,19 +2967,19 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x64x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -2996,19 +2996,19 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_16x16x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -3025,19 +3025,19 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_16x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
                                  int src_stride,
@@ -3054,19 +3054,19 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_16x8x4d)(const uint8_t* src_ptr,
                                          int src_stride,
-                                         const uint8_t* const ref_ptr[],
+                                         const uint8_t* const ref_ptr[4],
                                          int ref_stride,
-                                         uint32_t* sad_array);
+                                         uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -3083,19 +3083,19 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x16x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -3112,19 +3112,19 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -3141,19 +3141,19 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
                                 int src_stride,
@@ -3163,9 +3163,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -3183,19 +3183,19 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_4x8x4d)(const uint8_t* src_ptr,
                                         int src_stride,
-                                        const uint8_t* const ref_ptr[],
+                                        const uint8_t* const ref_ptr[4],
                                         int ref_stride,
-                                        uint32_t* sad_array);
+                                        uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
                                    int src_stride,
@@ -3212,19 +3212,19 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x128x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -3241,19 +3241,19 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -3270,19 +3270,19 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
                                  int src_stride,
@@ -3299,19 +3299,19 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_8x16x4d)(const uint8_t* src_ptr,
                                          int src_stride,
-                                         const uint8_t* const ref_ptr[],
+                                         const uint8_t* const ref_ptr[4],
                                          int ref_stride,
-                                         uint32_t* sad_array);
+                                         uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
                                 int src_stride,
@@ -3321,9 +3321,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -3341,19 +3341,19 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_8x8x4d)(const uint8_t* src_ptr,
                                         int src_stride,
-                                        const uint8_t* const ref_ptr[],
+                                        const uint8_t* const ref_ptr[4],
                                         int ref_stride,
-                                        uint32_t* sad_array);
+                                        uint32_t sad_array[4]);
 
 int aom_satd_c(const tran_low_t* coeff, int length);
 int aom_satd_neon(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h
index 49d7899..1b6833b 100644
--- a/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon-cpu-detect/config/av1_rtcd.h
@@ -262,18 +262,6 @@
     ConvolveParams* conv_params,
     int bd);
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -940,71 +928,6 @@
                                             const TX_CLASS tx_class,
                                             int8_t* const coeff_contexts);
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_neon(const int16_t* input,
                              tran_low_t* output,
@@ -1870,8 +1793,7 @@
                                                   int v,
                                                   int h);
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1881,8 +1803,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_neon(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_neon(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -1892,8 +1813,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-RTCD_EXTERN void (*cdef_filter_block)(uint8_t* dst8,
-                                      uint16_t* dst16,
+RTCD_EXTERN void (*cdef_filter_block)(void* dst8,
                                       int dstride,
                                       const uint16_t* in,
                                       int pri_strength,
@@ -1904,6 +1824,37 @@
                                       int bsize,
                                       int coeff_shift);
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_neon(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+RTCD_EXTERN void (*cdef_filter_block_highbd)(void* dst16,
+                                             int dstride,
+                                             const uint16_t* in,
+                                             int pri_strength,
+                                             int sec_strength,
+                                             int dir,
+                                             int pri_damping,
+                                             int sec_damping,
+                                             int bsize,
+                                             int coeff_shift);
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
@@ -2196,6 +2147,9 @@
   cdef_filter_block = cdef_filter_block_c;
   if (flags & HAS_NEON)
     cdef_filter_block = cdef_filter_block_neon;
+  cdef_filter_block_highbd = cdef_filter_block_highbd_c;
+  if (flags & HAS_NEON)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_neon;
   cdef_find_dir = cdef_find_dir_c;
   if (flags & HAS_NEON)
     cdef_find_dir = cdef_find_dir_neon;
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm
index 14a2b3f2..829c5671c 100644
--- a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h
index f4cd495..21d1197a 100644
--- a/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm-neon/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h
index 45a57863..cb33dbb5c 100644
--- a/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon/config/aom_dsp_rtcd.h
@@ -1138,11 +1138,11 @@
 int16_t aom_int_pro_col_neon(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_neon
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_neon(int16_t* hbuf,
+void aom_int_pro_row_neon(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -1364,13 +1364,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1385,13 +1385,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1406,13 +1406,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1427,13 +1427,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1448,13 +1448,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1469,13 +1469,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1490,13 +1490,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1511,13 +1511,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1532,13 +1532,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1553,13 +1553,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1574,13 +1574,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1595,13 +1595,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1616,13 +1616,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1637,13 +1637,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1658,13 +1658,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1679,13 +1679,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -2171,17 +2171,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -2199,17 +2199,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -2239,22 +2239,22 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_neon
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2272,17 +2272,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2304,17 +2304,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2340,17 +2340,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2372,22 +2372,22 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad32x32x4d aom_sad32x32x4d_neon
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2405,17 +2405,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2445,17 +2445,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2473,17 +2473,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2509,17 +2509,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2537,17 +2537,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2569,22 +2569,22 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad64x64x4d aom_sad64x64x4d_neon
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2614,17 +2614,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2642,17 +2642,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2674,17 +2674,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2707,14 +2707,14 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_neon(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 #define aom_sad_skip_128x128x4d aom_sad_skip_128x128x4d_neon
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
@@ -2729,14 +2729,14 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_128x64x4d aom_sad_skip_128x64x4d_neon
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
@@ -2751,14 +2751,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_neon
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -2773,14 +2773,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_neon
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -2795,14 +2795,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_neon
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -2817,14 +2817,14 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x16x4d aom_sad_skip_32x16x4d_neon
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
@@ -2839,14 +2839,14 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x32x4d aom_sad_skip_32x32x4d_neon
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
@@ -2861,14 +2861,14 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x64x4d aom_sad_skip_32x64x4d_neon
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
@@ -2879,9 +2879,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -2896,14 +2896,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_neon
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -2918,14 +2918,14 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_64x128x4d aom_sad_skip_64x128x4d_neon
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
@@ -2940,14 +2940,14 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x32x4d aom_sad_skip_64x32x4d_neon
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
@@ -2962,14 +2962,14 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x64x4d aom_sad_skip_64x64x4d_neon
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
@@ -2984,14 +2984,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_neon
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -3002,9 +3002,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -3019,14 +3019,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_neon
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h
index 6aac910..ab613f4fb 100644
--- a/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm-neon/config/av1_rtcd.h
@@ -234,18 +234,6 @@
 #define av1_build_compound_diffwtd_mask_d16 \
   av1_build_compound_diffwtd_mask_d16_neon
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -745,71 +733,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_neon
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_neon(const int16_t* input,
                              tran_low_t* output,
@@ -1477,8 +1400,7 @@
                                         int h);
 #define cdef_copy_rect8_8bit_to_16bit cdef_copy_rect8_8bit_to_16bit_neon
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1488,8 +1410,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_neon(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_neon(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -1501,6 +1422,28 @@
                             int coeff_shift);
 #define cdef_filter_block cdef_filter_block_neon
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_neon(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+#define cdef_filter_block_highbd cdef_filter_block_highbd_neon
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
diff --git a/third_party/libaom/source/config/linux/arm/config/aom_config.asm b/third_party/libaom/source/config/linux/arm/config/aom_config.asm
index 2ac0950a..5fb8a82 100644
--- a/third_party/libaom/source/config/linux/arm/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/linux/arm/config/aom_config.h b/third_party/libaom/source/config/linux/arm/config/aom_config.h
index c955b43..73b02f0 100644
--- a/third_party/libaom/source/config/linux/arm/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h
index 8aa7c37..d7d13ba 100644
--- a/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm/config/aom_dsp_rtcd.h
@@ -1000,7 +1000,7 @@
 int16_t aom_int_pro_col_c(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_c
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
@@ -1169,13 +1169,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1190,13 +1190,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1211,13 +1211,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1232,13 +1232,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1253,13 +1253,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1274,13 +1274,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1295,13 +1295,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1316,13 +1316,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1337,13 +1337,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1358,13 +1358,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1379,13 +1379,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1400,13 +1400,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1421,13 +1421,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1442,13 +1442,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1463,13 +1463,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1484,13 +1484,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -1931,17 +1931,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -1959,17 +1959,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -1995,17 +1995,17 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_c
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2023,17 +2023,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2051,17 +2051,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2087,17 +2087,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2115,17 +2115,17 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x32x4d aom_sad32x32x4d_c
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2143,17 +2143,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2179,17 +2179,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2207,17 +2207,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2243,17 +2243,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2271,17 +2271,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2299,17 +2299,17 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x64x4d aom_sad64x64x4d_c
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2335,17 +2335,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2363,17 +2363,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2391,17 +2391,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2420,9 +2420,9 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_128x128x4d aom_sad_skip_128x128x4d_c
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
@@ -2433,9 +2433,9 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_128x64x4d aom_sad_skip_128x64x4d_c
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
@@ -2446,9 +2446,9 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_c
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -2459,9 +2459,9 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_c
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -2472,9 +2472,9 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_c
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -2485,9 +2485,9 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_32x16x4d aom_sad_skip_32x16x4d_c
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
@@ -2498,9 +2498,9 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_32x32x4d aom_sad_skip_32x32x4d_c
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
@@ -2511,9 +2511,9 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_32x64x4d aom_sad_skip_32x64x4d_c
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
@@ -2524,9 +2524,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -2537,9 +2537,9 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_c
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -2550,9 +2550,9 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_64x128x4d aom_sad_skip_64x128x4d_c
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
@@ -2563,9 +2563,9 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_64x32x4d aom_sad_skip_64x32x4d_c
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
@@ -2576,9 +2576,9 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_64x64x4d aom_sad_skip_64x64x4d_c
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
@@ -2589,9 +2589,9 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_c
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -2602,9 +2602,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -2615,9 +2615,9 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_c
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h
index a7691ad..6080a21 100644
--- a/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm/config/av1_rtcd.h
@@ -202,18 +202,6 @@
 #define av1_build_compound_diffwtd_mask_d16 \
   av1_build_compound_diffwtd_mask_d16_c
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -523,71 +511,6 @@
                                int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_c
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 #define av1_highbd_fwht4x4 av1_highbd_fwht4x4_c
 
@@ -1011,8 +934,7 @@
                                      int h);
 #define cdef_copy_rect8_8bit_to_16bit cdef_copy_rect8_8bit_to_16bit_c
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1024,6 +946,18 @@
                          int coeff_shift);
 #define cdef_filter_block cdef_filter_block_c
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+#define cdef_filter_block_highbd cdef_filter_block_highbd_c
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
diff --git a/third_party/libaom/source/config/linux/arm64/config/aom_config.asm b/third_party/libaom/source/config/linux/arm64/config/aom_config.asm
index 14a2b3f2..829c5671c 100644
--- a/third_party/libaom/source/config/linux/arm64/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/arm64/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/linux/arm64/config/aom_config.h b/third_party/libaom/source/config/linux/arm64/config/aom_config.h
index f4cd495..21d1197a 100644
--- a/third_party/libaom/source/config/linux/arm64/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/arm64/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h
index 45a57863..cb33dbb5c 100644
--- a/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm64/config/aom_dsp_rtcd.h
@@ -1138,11 +1138,11 @@
 int16_t aom_int_pro_col_neon(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_neon
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_neon(int16_t* hbuf,
+void aom_int_pro_row_neon(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -1364,13 +1364,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1385,13 +1385,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1406,13 +1406,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1427,13 +1427,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1448,13 +1448,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1469,13 +1469,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1490,13 +1490,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1511,13 +1511,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1532,13 +1532,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1553,13 +1553,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1574,13 +1574,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1595,13 +1595,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1616,13 +1616,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1637,13 +1637,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1658,13 +1658,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1679,13 +1679,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -2171,17 +2171,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -2199,17 +2199,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -2239,22 +2239,22 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_neon
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2272,17 +2272,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2304,17 +2304,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2340,17 +2340,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2372,22 +2372,22 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad32x32x4d aom_sad32x32x4d_neon
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2405,17 +2405,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2445,17 +2445,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2473,17 +2473,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2509,17 +2509,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2537,17 +2537,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2569,22 +2569,22 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad64x64x4d aom_sad64x64x4d_neon
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2614,17 +2614,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2642,17 +2642,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2674,17 +2674,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2707,14 +2707,14 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_neon(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 #define aom_sad_skip_128x128x4d aom_sad_skip_128x128x4d_neon
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
@@ -2729,14 +2729,14 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_128x64x4d aom_sad_skip_128x64x4d_neon
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
@@ -2751,14 +2751,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_neon
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -2773,14 +2773,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_neon
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -2795,14 +2795,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_neon
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -2817,14 +2817,14 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x16x4d aom_sad_skip_32x16x4d_neon
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
@@ -2839,14 +2839,14 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x32x4d aom_sad_skip_32x32x4d_neon
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
@@ -2861,14 +2861,14 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x64x4d aom_sad_skip_32x64x4d_neon
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
@@ -2879,9 +2879,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -2896,14 +2896,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_neon
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -2918,14 +2918,14 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_64x128x4d aom_sad_skip_64x128x4d_neon
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
@@ -2940,14 +2940,14 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x32x4d aom_sad_skip_64x32x4d_neon
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
@@ -2962,14 +2962,14 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x64x4d aom_sad_skip_64x64x4d_neon
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
@@ -2984,14 +2984,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_neon
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -3002,9 +3002,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -3019,14 +3019,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_neon
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h b/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h
index 6aac910..ab613f4fb 100644
--- a/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/arm64/config/av1_rtcd.h
@@ -234,18 +234,6 @@
 #define av1_build_compound_diffwtd_mask_d16 \
   av1_build_compound_diffwtd_mask_d16_neon
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -745,71 +733,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_neon
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_neon(const int16_t* input,
                              tran_low_t* output,
@@ -1477,8 +1400,7 @@
                                         int h);
 #define cdef_copy_rect8_8bit_to_16bit cdef_copy_rect8_8bit_to_16bit_neon
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1488,8 +1410,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_neon(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_neon(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -1501,6 +1422,28 @@
                             int coeff_shift);
 #define cdef_filter_block cdef_filter_block_neon
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_neon(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+#define cdef_filter_block_highbd cdef_filter_block_highbd_neon
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
diff --git a/third_party/libaom/source/config/linux/generic/config/aom_config.asm b/third_party/libaom/source/config/linux/generic/config/aom_config.asm
index 794411f..03255fb 100644
--- a/third_party/libaom/source/config/linux/generic/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/generic/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/linux/generic/config/aom_config.h b/third_party/libaom/source/config/linux/generic/config/aom_config.h
index 16abf79d..37169b68 100644
--- a/third_party/libaom/source/config/linux/generic/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/generic/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h
index bc80c3f..d1b443b8 100644
--- a/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/generic/config/aom_dsp_rtcd.h
@@ -1000,7 +1000,7 @@
 int16_t aom_int_pro_col_c(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_c
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
@@ -1169,13 +1169,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1190,13 +1190,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1211,13 +1211,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1232,13 +1232,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1253,13 +1253,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1274,13 +1274,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1295,13 +1295,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1316,13 +1316,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1337,13 +1337,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1358,13 +1358,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1379,13 +1379,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1400,13 +1400,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1421,13 +1421,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1442,13 +1442,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1463,13 +1463,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1484,13 +1484,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -1931,17 +1931,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -1959,17 +1959,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -1995,17 +1995,17 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_c
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2023,17 +2023,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2051,17 +2051,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2087,17 +2087,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2115,17 +2115,17 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x32x4d aom_sad32x32x4d_c
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2143,17 +2143,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2179,17 +2179,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2207,17 +2207,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2243,17 +2243,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2271,17 +2271,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2299,17 +2299,17 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x64x4d aom_sad64x64x4d_c
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2335,17 +2335,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2363,17 +2363,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2391,17 +2391,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2420,9 +2420,9 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_128x128x4d aom_sad_skip_128x128x4d_c
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
@@ -2433,9 +2433,9 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_128x64x4d aom_sad_skip_128x64x4d_c
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
@@ -2446,9 +2446,9 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_c
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -2459,9 +2459,9 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_c
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -2472,9 +2472,9 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_c
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -2485,9 +2485,9 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_32x16x4d aom_sad_skip_32x16x4d_c
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
@@ -2498,9 +2498,9 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_32x32x4d aom_sad_skip_32x32x4d_c
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
@@ -2511,9 +2511,9 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_32x64x4d aom_sad_skip_32x64x4d_c
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
@@ -2524,9 +2524,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -2537,9 +2537,9 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_c
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -2550,9 +2550,9 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_64x128x4d aom_sad_skip_64x128x4d_c
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
@@ -2563,9 +2563,9 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_64x32x4d aom_sad_skip_64x32x4d_c
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
@@ -2576,9 +2576,9 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad_skip_64x64x4d aom_sad_skip_64x64x4d_c
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
@@ -2589,9 +2589,9 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_c
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -2602,9 +2602,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -2615,9 +2615,9 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_c
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h b/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h
index bffa6f3..e2ebe62 100644
--- a/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/generic/config/av1_rtcd.h
@@ -202,18 +202,6 @@
 #define av1_build_compound_diffwtd_mask_d16 \
   av1_build_compound_diffwtd_mask_d16_c
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -523,71 +511,6 @@
                                int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_c
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 #define av1_highbd_fwht4x4 av1_highbd_fwht4x4_c
 
@@ -1011,8 +934,7 @@
                                      int h);
 #define cdef_copy_rect8_8bit_to_16bit cdef_copy_rect8_8bit_to_16bit_c
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1024,6 +946,18 @@
                          int coeff_shift);
 #define cdef_filter_block cdef_filter_block_c
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+#define cdef_filter_block_highbd cdef_filter_block_highbd_c
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
diff --git a/third_party/libaom/source/config/linux/ia32/config/aom_config.asm b/third_party/libaom/source/config/linux/ia32/config/aom_config.asm
index 533888b..0a3abf7 100644
--- a/third_party/libaom/source/config/linux/ia32/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/ia32/config/aom_config.asm
@@ -11,6 +11,7 @@
 %define CONFIG_AV1_TEMPORAL_DENOISING 1
 %define CONFIG_BIG_ENDIAN 0
 %define CONFIG_BITRATE_ACCURACY 0
+%define CONFIG_BITRATE_ACCURACY_BL 0
 %define CONFIG_BITSTREAM_DEBUG 0
 %define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 %define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -51,6 +52,7 @@
 %define CONFIG_SIZE_LIMIT 1
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_SPEED_STATS 0
+%define CONFIG_TFLITE 0
 %define CONFIG_THREE_PASS 0
 %define CONFIG_TUNE_BUTTERAUGLI 0
 %define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/ia32/config/aom_config.h b/third_party/libaom/source/config/linux/ia32/config/aom_config.h
index 144c731..81f383f 100644
--- a/third_party/libaom/source/config/linux/ia32/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/ia32/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h
index e705f8c..ea9069c 100644
--- a/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/ia32/config/aom_dsp_rtcd.h
@@ -2130,7 +2130,10 @@
 void aom_hadamard_4x4_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
                         tran_low_t* coeff);
-#define aom_hadamard_4x4 aom_hadamard_4x4_c
+void aom_hadamard_4x4_sse2(const int16_t* src_diff,
+                           ptrdiff_t src_stride,
+                           tran_low_t* coeff);
+#define aom_hadamard_4x4 aom_hadamard_4x4_sse2
 
 void aom_hadamard_8x8_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
@@ -2193,11 +2196,11 @@
 int16_t aom_int_pro_col_sse2(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_sse2
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_sse2(int16_t* hbuf,
+void aom_int_pro_row_sse2(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -2531,31 +2534,31 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 void aom_masked_sad128x128x4d_ssse3(const uint8_t* src,
                                     int src_stride,
-                                    const uint8_t* ref[],
+                                    const uint8_t* ref[4],
                                     int ref_stride,
                                     const uint8_t* second_pred,
                                     const uint8_t* msk,
                                     int msk_stride,
                                     int invert_mask,
-                                    unsigned sads[]);
+                                    unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x128x4d)(const uint8_t* src,
                                              int src_stride,
-                                             const uint8_t* ref[],
+                                             const uint8_t* ref[4],
                                              int ref_stride,
                                              const uint8_t* second_pred,
                                              const uint8_t* msk,
                                              int msk_stride,
                                              int invert_mask,
-                                             unsigned sads[]);
+                                             unsigned sads[4]);
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
                                     int src_stride,
@@ -2592,31 +2595,31 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad128x64x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x64x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2653,31 +2656,31 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2714,31 +2717,31 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
                                   int src_stride,
@@ -2775,31 +2778,31 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad16x8x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x8x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2836,31 +2839,31 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2897,31 +2900,31 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
                                    int src_stride,
@@ -2958,31 +2961,31 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3019,31 +3022,31 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3080,31 +3083,31 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
                                     int src_stride,
@@ -3141,31 +3144,31 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad64x128x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x128x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
                                    int src_stride,
@@ -3202,31 +3205,31 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
                                    int src_stride,
@@ -3263,31 +3266,31 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
                                   int src_stride,
@@ -3324,31 +3327,31 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad8x16x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x16x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3385,31 +3388,31 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3446,31 +3449,31 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
                                                     int src_stride,
@@ -4609,38 +4612,32 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 void aom_sad128x128x4d_sse2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad128x128x4d_avx2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x128x4d)(const uint8_t* src_ptr,
                                       int src_stride,
-                                      const uint8_t* const ref_ptr[],
+                                      const uint8_t* const ref_ptr[4],
                                       int ref_stride,
-                                      uint32_t* sad_array);
+                                      uint32_t sad_array[4]);
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
-void aom_sad128x128x4d_avg_sse2(const uint8_t* src_ptr,
-                                int src_stride,
-                                const uint8_t* const ref_ptr[],
-                                int ref_stride,
-                                const uint8_t* second_pred,
-                                uint32_t* sad_array);
-#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_sse2
+                             uint32_t sad_array[4]);
+#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
                              int src_stride,
@@ -4682,38 +4679,32 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad128x64x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad128x64x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x64x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad128x64x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
                             int a_stride,
@@ -4753,29 +4744,23 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_sse2
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -4801,29 +4786,23 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_sse2
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
                            int src_stride,
@@ -4849,29 +4828,23 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad16x8x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_sse2
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad16x8x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
                            int a_stride,
@@ -4927,38 +4900,32 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x16x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x16x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5000,38 +4967,32 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5073,38 +5034,32 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
                            int a_stride,
@@ -5144,29 +5099,23 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_sse2
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5192,29 +5141,23 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_sse2
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
                           int a_stride,
@@ -5270,38 +5213,32 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad64x128x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad64x128x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x128x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad64x128x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5343,38 +5280,32 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5416,38 +5347,32 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
                            int a_stride,
@@ -5487,29 +5412,23 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad8x16x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_sse2
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad8x16x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5535,29 +5454,23 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_sse2
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5583,29 +5496,23 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_sse2
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
                           int a_stride,
@@ -5640,24 +5547,24 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_sse2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_avx2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x128x4d)(const uint8_t* src_ptr,
                                             int src_stride,
-                                            const uint8_t* const ref_ptr[],
+                                            const uint8_t* const ref_ptr[4],
                                             int ref_stride,
-                                            uint32_t* sad_array);
+                                            uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
                                    int src_stride,
@@ -5678,24 +5585,24 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x64x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5709,14 +5616,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_sse2
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -5731,14 +5638,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_sse2
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -5753,14 +5660,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_sse2
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -5782,24 +5689,24 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x16x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5820,24 +5727,24 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5858,24 +5765,24 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
                                 int src_stride,
@@ -5885,9 +5792,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -5902,14 +5809,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_sse2
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -5931,24 +5838,24 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x128x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5969,24 +5876,24 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -6007,24 +5914,24 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
                                  int src_stride,
@@ -6038,14 +5945,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_sse2
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -6056,9 +5963,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -6073,14 +5980,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_sse2
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h b/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h
index d118b2f..e366d77b 100644
--- a/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/ia32/config/av1_rtcd.h
@@ -347,44 +347,6 @@
     ConvolveParams* conv_params,
     int bd);
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-void av1_build_compound_diffwtd_mask_highbd_ssse3(uint8_t* mask,
-                                                  DIFFWTD_MASK_TYPE mask_type,
-                                                  const uint8_t* src0,
-                                                  int src0_stride,
-                                                  const uint8_t* src1,
-                                                  int src1_stride,
-                                                  int h,
-                                                  int w,
-                                                  int bd);
-void av1_build_compound_diffwtd_mask_highbd_avx2(uint8_t* mask,
-                                                 DIFFWTD_MASK_TYPE mask_type,
-                                                 const uint8_t* src0,
-                                                 int src0_stride,
-                                                 const uint8_t* src1,
-                                                 int src1_stride,
-                                                 int h,
-                                                 int w,
-                                                 int bd);
-RTCD_EXTERN void (*av1_build_compound_diffwtd_mask_highbd)(
-    uint8_t* mask,
-    DIFFWTD_MASK_TYPE mask_type,
-    const uint8_t* src0,
-    int src0_stride,
-    const uint8_t* src1,
-    int src1_stride,
-    int h,
-    int w,
-    int bd);
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -831,6 +793,15 @@
                             int upsample_above,
                             int dx,
                             int dy);
+void av1_dr_prediction_z1_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z1_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -860,6 +831,16 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z2_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z2_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -890,6 +871,15 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z3_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z3_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -1247,71 +1237,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_sse2
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_sse4_1(const int16_t* input,
                                tran_low_t* output,
@@ -2110,8 +2035,7 @@
                                                   int v,
                                                   int h);
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -2121,8 +2045,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_sse2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_sse2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2132,8 +2055,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-void cdef_filter_block_ssse3(uint8_t* dst8,
-                             uint16_t* dst16,
+void cdef_filter_block_ssse3(void* dst8,
                              int dstride,
                              const uint16_t* in,
                              int pri_strength,
@@ -2143,8 +2065,7 @@
                              int sec_damping,
                              int bsize,
                              int coeff_shift);
-void cdef_filter_block_sse4_1(uint8_t* dst8,
-                              uint16_t* dst16,
+void cdef_filter_block_sse4_1(void* dst8,
                               int dstride,
                               const uint16_t* in,
                               int pri_strength,
@@ -2154,8 +2075,7 @@
                               int sec_damping,
                               int bsize,
                               int coeff_shift);
-void cdef_filter_block_avx2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_avx2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2165,8 +2085,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-RTCD_EXTERN void (*cdef_filter_block)(uint8_t* dst8,
-                                      uint16_t* dst16,
+RTCD_EXTERN void (*cdef_filter_block)(void* dst8,
                                       int dstride,
                                       const uint16_t* in,
                                       int pri_strength,
@@ -2177,6 +2096,67 @@
                                       int bsize,
                                       int coeff_shift);
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_sse2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+void cdef_filter_block_highbd_ssse3(void* dst16,
+                                    int dstride,
+                                    const uint16_t* in,
+                                    int pri_strength,
+                                    int sec_strength,
+                                    int dir,
+                                    int pri_damping,
+                                    int sec_damping,
+                                    int bsize,
+                                    int coeff_shift);
+void cdef_filter_block_highbd_sse4_1(void* dst16,
+                                     int dstride,
+                                     const uint16_t* in,
+                                     int pri_strength,
+                                     int sec_strength,
+                                     int dir,
+                                     int pri_damping,
+                                     int sec_damping,
+                                     int bsize,
+                                     int coeff_shift);
+void cdef_filter_block_highbd_avx2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+RTCD_EXTERN void (*cdef_filter_block_highbd)(void* dst16,
+                                             int dstride,
+                                             const uint16_t* in,
+                                             int pri_strength,
+                                             int sec_strength,
+                                             int dir,
+                                             int pri_damping,
+                                             int sec_damping,
+                                             int bsize,
+                                             int coeff_shift);
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
@@ -2262,14 +2242,6 @@
   if (flags & HAS_AVX2)
     av1_build_compound_diffwtd_mask_d16 =
         av1_build_compound_diffwtd_mask_d16_avx2;
-  av1_build_compound_diffwtd_mask_highbd =
-      av1_build_compound_diffwtd_mask_highbd_c;
-  if (flags & HAS_SSSE3)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_ssse3;
-  if (flags & HAS_AVX2)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_avx2;
   av1_calc_indices_dim1 = av1_calc_indices_dim1_sse2;
   if (flags & HAS_AVX2)
     av1_calc_indices_dim1 = av1_calc_indices_dim1_avx2;
@@ -2311,12 +2283,18 @@
   if (flags & HAS_AVX2)
     av1_dist_wtd_convolve_y = av1_dist_wtd_convolve_y_avx2;
   av1_dr_prediction_z1 = av1_dr_prediction_z1_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z1 = av1_dr_prediction_z1_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z1 = av1_dr_prediction_z1_avx2;
   av1_dr_prediction_z2 = av1_dr_prediction_z2_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z2 = av1_dr_prediction_z2_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z2 = av1_dr_prediction_z2_avx2;
   av1_dr_prediction_z3 = av1_dr_prediction_z3_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z3 = av1_dr_prediction_z3_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z3 = av1_dr_prediction_z3_avx2;
   av1_filter_intra_edge = av1_filter_intra_edge_c;
@@ -2506,6 +2484,13 @@
     cdef_filter_block = cdef_filter_block_sse4_1;
   if (flags & HAS_AVX2)
     cdef_filter_block = cdef_filter_block_avx2;
+  cdef_filter_block_highbd = cdef_filter_block_highbd_sse2;
+  if (flags & HAS_SSSE3)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_ssse3;
+  if (flags & HAS_SSE4_1)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_sse4_1;
+  if (flags & HAS_AVX2)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_avx2;
   cdef_find_dir = cdef_find_dir_sse2;
   if (flags & HAS_SSSE3)
     cdef_find_dir = cdef_find_dir_ssse3;
diff --git a/third_party/libaom/source/config/linux/x64/config/aom_config.asm b/third_party/libaom/source/config/linux/x64/config/aom_config.asm
index b0c30d6..2ad83b6 100644
--- a/third_party/libaom/source/config/linux/x64/config/aom_config.asm
+++ b/third_party/libaom/source/config/linux/x64/config/aom_config.asm
@@ -11,6 +11,7 @@
 %define CONFIG_AV1_TEMPORAL_DENOISING 1
 %define CONFIG_BIG_ENDIAN 0
 %define CONFIG_BITRATE_ACCURACY 0
+%define CONFIG_BITRATE_ACCURACY_BL 0
 %define CONFIG_BITSTREAM_DEBUG 0
 %define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 %define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -51,6 +52,7 @@
 %define CONFIG_SIZE_LIMIT 1
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_SPEED_STATS 0
+%define CONFIG_TFLITE 0
 %define CONFIG_THREE_PASS 0
 %define CONFIG_TUNE_BUTTERAUGLI 0
 %define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/x64/config/aom_config.h b/third_party/libaom/source/config/linux/x64/config/aom_config.h
index 4e5fe6e..b078667 100644
--- a/third_party/libaom/source/config/linux/x64/config/aom_config.h
+++ b/third_party/libaom/source/config/linux/x64/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h
index 0c5e6882..40eb235 100644
--- a/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/linux/x64/config/aom_dsp_rtcd.h
@@ -2133,7 +2133,10 @@
 void aom_hadamard_4x4_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
                         tran_low_t* coeff);
-#define aom_hadamard_4x4 aom_hadamard_4x4_c
+void aom_hadamard_4x4_sse2(const int16_t* src_diff,
+                           ptrdiff_t src_stride,
+                           tran_low_t* coeff);
+#define aom_hadamard_4x4 aom_hadamard_4x4_sse2
 
 void aom_hadamard_8x8_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
@@ -2196,11 +2199,11 @@
 int16_t aom_int_pro_col_sse2(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_sse2
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_sse2(int16_t* hbuf,
+void aom_int_pro_row_sse2(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -2534,31 +2537,31 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 void aom_masked_sad128x128x4d_ssse3(const uint8_t* src,
                                     int src_stride,
-                                    const uint8_t* ref[],
+                                    const uint8_t* ref[4],
                                     int ref_stride,
                                     const uint8_t* second_pred,
                                     const uint8_t* msk,
                                     int msk_stride,
                                     int invert_mask,
-                                    unsigned sads[]);
+                                    unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x128x4d)(const uint8_t* src,
                                              int src_stride,
-                                             const uint8_t* ref[],
+                                             const uint8_t* ref[4],
                                              int ref_stride,
                                              const uint8_t* second_pred,
                                              const uint8_t* msk,
                                              int msk_stride,
                                              int invert_mask,
-                                             unsigned sads[]);
+                                             unsigned sads[4]);
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
                                     int src_stride,
@@ -2595,31 +2598,31 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad128x64x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x64x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2656,31 +2659,31 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2717,31 +2720,31 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
                                   int src_stride,
@@ -2778,31 +2781,31 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad16x8x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x8x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2839,31 +2842,31 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2900,31 +2903,31 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
                                    int src_stride,
@@ -2961,31 +2964,31 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3022,31 +3025,31 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3083,31 +3086,31 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
                                     int src_stride,
@@ -3144,31 +3147,31 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad64x128x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x128x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
                                    int src_stride,
@@ -3205,31 +3208,31 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
                                    int src_stride,
@@ -3266,31 +3269,31 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
                                   int src_stride,
@@ -3327,31 +3330,31 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad8x16x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x16x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3388,31 +3391,31 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3449,31 +3452,31 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
                                                     int src_stride,
@@ -4636,38 +4639,32 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 void aom_sad128x128x4d_sse2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad128x128x4d_avx2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x128x4d)(const uint8_t* src_ptr,
                                       int src_stride,
-                                      const uint8_t* const ref_ptr[],
+                                      const uint8_t* const ref_ptr[4],
                                       int ref_stride,
-                                      uint32_t* sad_array);
+                                      uint32_t sad_array[4]);
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
-void aom_sad128x128x4d_avg_sse2(const uint8_t* src_ptr,
-                                int src_stride,
-                                const uint8_t* const ref_ptr[],
-                                int ref_stride,
-                                const uint8_t* second_pred,
-                                uint32_t* sad_array);
-#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_sse2
+                             uint32_t sad_array[4]);
+#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
                              int src_stride,
@@ -4709,38 +4706,32 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad128x64x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad128x64x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x64x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad128x64x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
                             int a_stride,
@@ -4780,29 +4771,23 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_sse2
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -4828,29 +4813,23 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_sse2
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
                            int src_stride,
@@ -4876,29 +4855,23 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad16x8x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_sse2
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad16x8x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
                            int a_stride,
@@ -4954,38 +4927,32 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x16x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x16x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5027,38 +4994,32 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5100,38 +5061,32 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
                            int a_stride,
@@ -5171,29 +5126,23 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_sse2
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5219,29 +5168,23 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_sse2
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
                           int a_stride,
@@ -5297,38 +5240,32 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad64x128x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad64x128x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x128x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad64x128x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5370,38 +5307,32 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5443,38 +5374,32 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
                            int a_stride,
@@ -5514,29 +5439,23 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad8x16x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_sse2
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad8x16x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5562,29 +5481,23 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_sse2
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5610,29 +5523,23 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_sse2
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
                           int a_stride,
@@ -5667,24 +5574,24 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_sse2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_avx2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x128x4d)(const uint8_t* src_ptr,
                                             int src_stride,
-                                            const uint8_t* const ref_ptr[],
+                                            const uint8_t* const ref_ptr[4],
                                             int ref_stride,
-                                            uint32_t* sad_array);
+                                            uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
                                    int src_stride,
@@ -5705,24 +5612,24 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x64x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5736,14 +5643,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_sse2
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -5758,14 +5665,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_sse2
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -5780,14 +5687,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_sse2
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -5809,24 +5716,24 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x16x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5847,24 +5754,24 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5885,24 +5792,24 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
                                 int src_stride,
@@ -5912,9 +5819,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -5929,14 +5836,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_sse2
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -5958,24 +5865,24 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x128x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5996,24 +5903,24 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -6034,24 +5941,24 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
                                  int src_stride,
@@ -6065,14 +5972,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_sse2
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -6083,9 +5990,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -6100,14 +6007,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_sse2
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h b/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h
index 8ce1650..e366d77b 100644
--- a/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/linux/x64/config/av1_rtcd.h
@@ -347,44 +347,6 @@
     ConvolveParams* conv_params,
     int bd);
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-void av1_build_compound_diffwtd_mask_highbd_ssse3(uint8_t* mask,
-                                                  DIFFWTD_MASK_TYPE mask_type,
-                                                  const uint8_t* src0,
-                                                  int src0_stride,
-                                                  const uint8_t* src1,
-                                                  int src1_stride,
-                                                  int h,
-                                                  int w,
-                                                  int bd);
-void av1_build_compound_diffwtd_mask_highbd_avx2(uint8_t* mask,
-                                                 DIFFWTD_MASK_TYPE mask_type,
-                                                 const uint8_t* src0,
-                                                 int src0_stride,
-                                                 const uint8_t* src1,
-                                                 int src1_stride,
-                                                 int h,
-                                                 int w,
-                                                 int bd);
-RTCD_EXTERN void (*av1_build_compound_diffwtd_mask_highbd)(
-    uint8_t* mask,
-    DIFFWTD_MASK_TYPE mask_type,
-    const uint8_t* src0,
-    int src0_stride,
-    const uint8_t* src1,
-    int src1_stride,
-    int h,
-    int w,
-    int bd);
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -831,6 +793,15 @@
                             int upsample_above,
                             int dx,
                             int dy);
+void av1_dr_prediction_z1_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z1_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -860,6 +831,16 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z2_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z2_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -890,6 +871,15 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z3_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z3_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -1247,104 +1237,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_sse2
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-void av1_highbd_convolve8_sse2(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_sse2
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-void av1_highbd_convolve8_horiz_sse2(const uint8_t* src,
-                                     ptrdiff_t src_stride,
-                                     uint8_t* dst,
-                                     ptrdiff_t dst_stride,
-                                     const int16_t* filter_x,
-                                     int x_step_q4,
-                                     const int16_t* filter_y,
-                                     int y_step_q4,
-                                     int w,
-                                     int h,
-                                     int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_sse2
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-void av1_highbd_convolve8_vert_sse2(const uint8_t* src,
-                                    ptrdiff_t src_stride,
-                                    uint8_t* dst,
-                                    ptrdiff_t dst_stride,
-                                    const int16_t* filter_x,
-                                    int x_step_q4,
-                                    const int16_t* filter_y,
-                                    int y_step_q4,
-                                    int w,
-                                    int h,
-                                    int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_sse2
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_sse4_1(const int16_t* input,
                                tran_low_t* output,
@@ -2143,8 +2035,7 @@
                                                   int v,
                                                   int h);
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -2154,8 +2045,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_sse2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_sse2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2165,8 +2055,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-void cdef_filter_block_ssse3(uint8_t* dst8,
-                             uint16_t* dst16,
+void cdef_filter_block_ssse3(void* dst8,
                              int dstride,
                              const uint16_t* in,
                              int pri_strength,
@@ -2176,8 +2065,7 @@
                              int sec_damping,
                              int bsize,
                              int coeff_shift);
-void cdef_filter_block_sse4_1(uint8_t* dst8,
-                              uint16_t* dst16,
+void cdef_filter_block_sse4_1(void* dst8,
                               int dstride,
                               const uint16_t* in,
                               int pri_strength,
@@ -2187,8 +2075,7 @@
                               int sec_damping,
                               int bsize,
                               int coeff_shift);
-void cdef_filter_block_avx2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_avx2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2198,8 +2085,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-RTCD_EXTERN void (*cdef_filter_block)(uint8_t* dst8,
-                                      uint16_t* dst16,
+RTCD_EXTERN void (*cdef_filter_block)(void* dst8,
                                       int dstride,
                                       const uint16_t* in,
                                       int pri_strength,
@@ -2210,6 +2096,67 @@
                                       int bsize,
                                       int coeff_shift);
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_sse2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+void cdef_filter_block_highbd_ssse3(void* dst16,
+                                    int dstride,
+                                    const uint16_t* in,
+                                    int pri_strength,
+                                    int sec_strength,
+                                    int dir,
+                                    int pri_damping,
+                                    int sec_damping,
+                                    int bsize,
+                                    int coeff_shift);
+void cdef_filter_block_highbd_sse4_1(void* dst16,
+                                     int dstride,
+                                     const uint16_t* in,
+                                     int pri_strength,
+                                     int sec_strength,
+                                     int dir,
+                                     int pri_damping,
+                                     int sec_damping,
+                                     int bsize,
+                                     int coeff_shift);
+void cdef_filter_block_highbd_avx2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+RTCD_EXTERN void (*cdef_filter_block_highbd)(void* dst16,
+                                             int dstride,
+                                             const uint16_t* in,
+                                             int pri_strength,
+                                             int sec_strength,
+                                             int dir,
+                                             int pri_damping,
+                                             int sec_damping,
+                                             int bsize,
+                                             int coeff_shift);
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
@@ -2295,14 +2242,6 @@
   if (flags & HAS_AVX2)
     av1_build_compound_diffwtd_mask_d16 =
         av1_build_compound_diffwtd_mask_d16_avx2;
-  av1_build_compound_diffwtd_mask_highbd =
-      av1_build_compound_diffwtd_mask_highbd_c;
-  if (flags & HAS_SSSE3)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_ssse3;
-  if (flags & HAS_AVX2)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_avx2;
   av1_calc_indices_dim1 = av1_calc_indices_dim1_sse2;
   if (flags & HAS_AVX2)
     av1_calc_indices_dim1 = av1_calc_indices_dim1_avx2;
@@ -2344,12 +2283,18 @@
   if (flags & HAS_AVX2)
     av1_dist_wtd_convolve_y = av1_dist_wtd_convolve_y_avx2;
   av1_dr_prediction_z1 = av1_dr_prediction_z1_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z1 = av1_dr_prediction_z1_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z1 = av1_dr_prediction_z1_avx2;
   av1_dr_prediction_z2 = av1_dr_prediction_z2_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z2 = av1_dr_prediction_z2_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z2 = av1_dr_prediction_z2_avx2;
   av1_dr_prediction_z3 = av1_dr_prediction_z3_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z3 = av1_dr_prediction_z3_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z3 = av1_dr_prediction_z3_avx2;
   av1_filter_intra_edge = av1_filter_intra_edge_c;
@@ -2539,6 +2484,13 @@
     cdef_filter_block = cdef_filter_block_sse4_1;
   if (flags & HAS_AVX2)
     cdef_filter_block = cdef_filter_block_avx2;
+  cdef_filter_block_highbd = cdef_filter_block_highbd_sse2;
+  if (flags & HAS_SSSE3)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_ssse3;
+  if (flags & HAS_SSE4_1)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_sse4_1;
+  if (flags & HAS_AVX2)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_avx2;
   cdef_find_dir = cdef_find_dir_sse2;
   if (flags & HAS_SSSE3)
     cdef_find_dir = cdef_find_dir_ssse3;
diff --git a/third_party/libaom/source/config/win/arm64/config/aom_config.asm b/third_party/libaom/source/config/win/arm64/config/aom_config.asm
index 14a2b3f2..829c5671c 100644
--- a/third_party/libaom/source/config/win/arm64/config/aom_config.asm
+++ b/third_party/libaom/source/config/win/arm64/config/aom_config.asm
@@ -1,5 +1,5 @@
 ;
-; Copyright (c) 2021, Alliance for Open Media. All rights reserved
+; Copyright (c) 2022, Alliance for Open Media. All rights reserved
 ;
 ; This source code is subject to the terms of the BSD 2 Clause License and
 ; the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -21,6 +21,7 @@
 CONFIG_AV1_TEMPORAL_DENOISING equ 1
 CONFIG_BIG_ENDIAN equ 0
 CONFIG_BITRATE_ACCURACY equ 0
+CONFIG_BITRATE_ACCURACY_BL equ 0
 CONFIG_BITSTREAM_DEBUG equ 0
 CONFIG_COEFFICIENT_RANGE_CHECKING equ 0
 CONFIG_COLLECT_COMPONENT_TIMING equ 0
@@ -61,6 +62,7 @@
 CONFIG_SIZE_LIMIT equ 1
 CONFIG_SPATIAL_RESAMPLING equ 1
 CONFIG_SPEED_STATS equ 0
+CONFIG_TFLITE equ 0
 CONFIG_THREE_PASS equ 0
 CONFIG_TUNE_BUTTERAUGLI equ 0
 CONFIG_TUNE_VMAF equ 0
diff --git a/third_party/libaom/source/config/win/arm64/config/aom_config.h b/third_party/libaom/source/config/win/arm64/config/aom_config.h
index 9bf20e8..55310cf5 100644
--- a/third_party/libaom/source/config/win/arm64/config/aom_config.h
+++ b/third_party/libaom/source/config/win/arm64/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h
index 45a57863..cb33dbb5c 100644
--- a/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/win/arm64/config/aom_dsp_rtcd.h
@@ -1138,11 +1138,11 @@
 int16_t aom_int_pro_col_neon(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_neon
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_neon(int16_t* hbuf,
+void aom_int_pro_row_neon(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -1364,13 +1364,13 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 #define aom_masked_sad128x128x4d aom_masked_sad128x128x4d_c
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
@@ -1385,13 +1385,13 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad128x64x4d aom_masked_sad128x64x4d_c
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
@@ -1406,13 +1406,13 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x16x4d aom_masked_sad16x16x4d_c
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
@@ -1427,13 +1427,13 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad16x32x4d aom_masked_sad16x32x4d_c
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
@@ -1448,13 +1448,13 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad16x8x4d aom_masked_sad16x8x4d_c
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
@@ -1469,13 +1469,13 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x16x4d aom_masked_sad32x16x4d_c
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
@@ -1490,13 +1490,13 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x32x4d aom_masked_sad32x32x4d_c
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
@@ -1511,13 +1511,13 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad32x64x4d aom_masked_sad32x64x4d_c
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
@@ -1532,13 +1532,13 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x4x4d aom_masked_sad4x4x4d_c
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
@@ -1553,13 +1553,13 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad4x8x4d aom_masked_sad4x8x4d_c
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
@@ -1574,13 +1574,13 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 #define aom_masked_sad64x128x4d aom_masked_sad64x128x4d_c
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
@@ -1595,13 +1595,13 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x32x4d aom_masked_sad64x32x4d_c
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
@@ -1616,13 +1616,13 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 #define aom_masked_sad64x64x4d aom_masked_sad64x64x4d_c
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
@@ -1637,13 +1637,13 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 #define aom_masked_sad8x16x4d aom_masked_sad8x16x4d_c
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
@@ -1658,13 +1658,13 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x4x4d aom_masked_sad8x4x4d_c
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
@@ -1679,13 +1679,13 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 #define aom_masked_sad8x8x4d aom_masked_sad8x8x4d_c
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
@@ -2171,17 +2171,17 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad128x128x4d aom_sad128x128x4d_c
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 #define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
@@ -2199,17 +2199,17 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad128x64x4d aom_sad128x64x4d_c
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
@@ -2239,22 +2239,22 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_neon
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
@@ -2272,17 +2272,17 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_c
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
@@ -2304,17 +2304,17 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_c
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
@@ -2340,17 +2340,17 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x16x4d aom_sad32x16x4d_c
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
@@ -2372,22 +2372,22 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad32x32x4d aom_sad32x32x4d_neon
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
@@ -2405,17 +2405,17 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad32x64x4d aom_sad32x64x4d_c
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
@@ -2445,17 +2445,17 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_c
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
@@ -2473,17 +2473,17 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_c
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
@@ -2509,17 +2509,17 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad64x128x4d aom_sad64x128x4d_c
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 #define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
@@ -2537,17 +2537,17 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 #define aom_sad64x32x4d aom_sad64x32x4d_c
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
@@ -2569,22 +2569,22 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_neon(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad64x64x4d aom_sad64x64x4d_neon
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
@@ -2614,17 +2614,17 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_c
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
@@ -2642,17 +2642,17 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_c
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
@@ -2674,17 +2674,17 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_c
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
@@ -2707,14 +2707,14 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_neon(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 #define aom_sad_skip_128x128x4d aom_sad_skip_128x128x4d_neon
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
@@ -2729,14 +2729,14 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_128x64x4d aom_sad_skip_128x64x4d_neon
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
@@ -2751,14 +2751,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_neon
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -2773,14 +2773,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_neon
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -2795,14 +2795,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_neon
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -2817,14 +2817,14 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x16x4d aom_sad_skip_32x16x4d_neon
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
@@ -2839,14 +2839,14 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x32x4d aom_sad_skip_32x32x4d_neon
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
@@ -2861,14 +2861,14 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_32x64x4d aom_sad_skip_32x64x4d_neon
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
@@ -2879,9 +2879,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -2896,14 +2896,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_neon
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -2918,14 +2918,14 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_neon(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 #define aom_sad_skip_64x128x4d aom_sad_skip_64x128x4d_neon
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
@@ -2940,14 +2940,14 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x32x4d aom_sad_skip_64x32x4d_neon
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
@@ -2962,14 +2962,14 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_neon(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_64x64x4d aom_sad_skip_64x64x4d_neon
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
@@ -2984,14 +2984,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_neon(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_neon
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -3002,9 +3002,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -3019,14 +3019,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_neon(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_neon
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h b/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h
index 6aac910..ab613f4fb 100644
--- a/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/win/arm64/config/av1_rtcd.h
@@ -234,18 +234,6 @@
 #define av1_build_compound_diffwtd_mask_d16 \
   av1_build_compound_diffwtd_mask_d16_neon
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-#define av1_build_compound_diffwtd_mask_highbd \
-  av1_build_compound_diffwtd_mask_highbd_c
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -745,71 +733,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_neon
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_neon(const int16_t* input,
                              tran_low_t* output,
@@ -1477,8 +1400,7 @@
                                         int h);
 #define cdef_copy_rect8_8bit_to_16bit cdef_copy_rect8_8bit_to_16bit_neon
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -1488,8 +1410,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_neon(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_neon(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -1501,6 +1422,28 @@
                             int coeff_shift);
 #define cdef_filter_block cdef_filter_block_neon
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_neon(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+#define cdef_filter_block_highbd cdef_filter_block_highbd_neon
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
diff --git a/third_party/libaom/source/config/win/ia32/config/aom_config.asm b/third_party/libaom/source/config/win/ia32/config/aom_config.asm
index 8b99a989..c59fc4f 100644
--- a/third_party/libaom/source/config/win/ia32/config/aom_config.asm
+++ b/third_party/libaom/source/config/win/ia32/config/aom_config.asm
@@ -11,6 +11,7 @@
 %define CONFIG_AV1_TEMPORAL_DENOISING 1
 %define CONFIG_BIG_ENDIAN 0
 %define CONFIG_BITRATE_ACCURACY 0
+%define CONFIG_BITRATE_ACCURACY_BL 0
 %define CONFIG_BITSTREAM_DEBUG 0
 %define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 %define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -51,6 +52,7 @@
 %define CONFIG_SIZE_LIMIT 1
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_SPEED_STATS 0
+%define CONFIG_TFLITE 0
 %define CONFIG_THREE_PASS 0
 %define CONFIG_TUNE_BUTTERAUGLI 0
 %define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/win/ia32/config/aom_config.h b/third_party/libaom/source/config/win/ia32/config/aom_config.h
index cdb49f1..1f62a7e 100644
--- a/third_party/libaom/source/config/win/ia32/config/aom_config.h
+++ b/third_party/libaom/source/config/win/ia32/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h
index e705f8c..ea9069c 100644
--- a/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/win/ia32/config/aom_dsp_rtcd.h
@@ -2130,7 +2130,10 @@
 void aom_hadamard_4x4_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
                         tran_low_t* coeff);
-#define aom_hadamard_4x4 aom_hadamard_4x4_c
+void aom_hadamard_4x4_sse2(const int16_t* src_diff,
+                           ptrdiff_t src_stride,
+                           tran_low_t* coeff);
+#define aom_hadamard_4x4 aom_hadamard_4x4_sse2
 
 void aom_hadamard_8x8_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
@@ -2193,11 +2196,11 @@
 int16_t aom_int_pro_col_sse2(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_sse2
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_sse2(int16_t* hbuf,
+void aom_int_pro_row_sse2(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -2531,31 +2534,31 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 void aom_masked_sad128x128x4d_ssse3(const uint8_t* src,
                                     int src_stride,
-                                    const uint8_t* ref[],
+                                    const uint8_t* ref[4],
                                     int ref_stride,
                                     const uint8_t* second_pred,
                                     const uint8_t* msk,
                                     int msk_stride,
                                     int invert_mask,
-                                    unsigned sads[]);
+                                    unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x128x4d)(const uint8_t* src,
                                              int src_stride,
-                                             const uint8_t* ref[],
+                                             const uint8_t* ref[4],
                                              int ref_stride,
                                              const uint8_t* second_pred,
                                              const uint8_t* msk,
                                              int msk_stride,
                                              int invert_mask,
-                                             unsigned sads[]);
+                                             unsigned sads[4]);
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
                                     int src_stride,
@@ -2592,31 +2595,31 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad128x64x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x64x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2653,31 +2656,31 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2714,31 +2717,31 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
                                   int src_stride,
@@ -2775,31 +2778,31 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad16x8x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x8x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2836,31 +2839,31 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2897,31 +2900,31 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
                                    int src_stride,
@@ -2958,31 +2961,31 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3019,31 +3022,31 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3080,31 +3083,31 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
                                     int src_stride,
@@ -3141,31 +3144,31 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad64x128x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x128x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
                                    int src_stride,
@@ -3202,31 +3205,31 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
                                    int src_stride,
@@ -3263,31 +3266,31 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
                                   int src_stride,
@@ -3324,31 +3327,31 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad8x16x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x16x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3385,31 +3388,31 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3446,31 +3449,31 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
                                                     int src_stride,
@@ -4609,38 +4612,32 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 void aom_sad128x128x4d_sse2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad128x128x4d_avx2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x128x4d)(const uint8_t* src_ptr,
                                       int src_stride,
-                                      const uint8_t* const ref_ptr[],
+                                      const uint8_t* const ref_ptr[4],
                                       int ref_stride,
-                                      uint32_t* sad_array);
+                                      uint32_t sad_array[4]);
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
-void aom_sad128x128x4d_avg_sse2(const uint8_t* src_ptr,
-                                int src_stride,
-                                const uint8_t* const ref_ptr[],
-                                int ref_stride,
-                                const uint8_t* second_pred,
-                                uint32_t* sad_array);
-#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_sse2
+                             uint32_t sad_array[4]);
+#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
                              int src_stride,
@@ -4682,38 +4679,32 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad128x64x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad128x64x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x64x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad128x64x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
                             int a_stride,
@@ -4753,29 +4744,23 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_sse2
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -4801,29 +4786,23 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_sse2
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
                            int src_stride,
@@ -4849,29 +4828,23 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad16x8x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_sse2
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad16x8x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
                            int a_stride,
@@ -4927,38 +4900,32 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x16x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x16x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5000,38 +4967,32 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5073,38 +5034,32 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
                            int a_stride,
@@ -5144,29 +5099,23 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_sse2
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5192,29 +5141,23 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_sse2
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
                           int a_stride,
@@ -5270,38 +5213,32 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad64x128x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad64x128x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x128x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad64x128x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5343,38 +5280,32 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5416,38 +5347,32 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
                            int a_stride,
@@ -5487,29 +5412,23 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad8x16x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_sse2
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad8x16x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5535,29 +5454,23 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_sse2
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5583,29 +5496,23 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_sse2
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
                           int a_stride,
@@ -5640,24 +5547,24 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_sse2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_avx2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x128x4d)(const uint8_t* src_ptr,
                                             int src_stride,
-                                            const uint8_t* const ref_ptr[],
+                                            const uint8_t* const ref_ptr[4],
                                             int ref_stride,
-                                            uint32_t* sad_array);
+                                            uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
                                    int src_stride,
@@ -5678,24 +5585,24 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x64x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5709,14 +5616,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_sse2
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -5731,14 +5638,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_sse2
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -5753,14 +5660,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_sse2
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -5782,24 +5689,24 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x16x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5820,24 +5727,24 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5858,24 +5765,24 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
                                 int src_stride,
@@ -5885,9 +5792,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -5902,14 +5809,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_sse2
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -5931,24 +5838,24 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x128x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5969,24 +5876,24 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -6007,24 +5914,24 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
                                  int src_stride,
@@ -6038,14 +5945,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_sse2
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -6056,9 +5963,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -6073,14 +5980,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_sse2
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h b/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h
index d118b2f..e366d77b 100644
--- a/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/win/ia32/config/av1_rtcd.h
@@ -347,44 +347,6 @@
     ConvolveParams* conv_params,
     int bd);
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-void av1_build_compound_diffwtd_mask_highbd_ssse3(uint8_t* mask,
-                                                  DIFFWTD_MASK_TYPE mask_type,
-                                                  const uint8_t* src0,
-                                                  int src0_stride,
-                                                  const uint8_t* src1,
-                                                  int src1_stride,
-                                                  int h,
-                                                  int w,
-                                                  int bd);
-void av1_build_compound_diffwtd_mask_highbd_avx2(uint8_t* mask,
-                                                 DIFFWTD_MASK_TYPE mask_type,
-                                                 const uint8_t* src0,
-                                                 int src0_stride,
-                                                 const uint8_t* src1,
-                                                 int src1_stride,
-                                                 int h,
-                                                 int w,
-                                                 int bd);
-RTCD_EXTERN void (*av1_build_compound_diffwtd_mask_highbd)(
-    uint8_t* mask,
-    DIFFWTD_MASK_TYPE mask_type,
-    const uint8_t* src0,
-    int src0_stride,
-    const uint8_t* src1,
-    int src1_stride,
-    int h,
-    int w,
-    int bd);
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -831,6 +793,15 @@
                             int upsample_above,
                             int dx,
                             int dy);
+void av1_dr_prediction_z1_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z1_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -860,6 +831,16 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z2_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z2_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -890,6 +871,15 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z3_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z3_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -1247,71 +1237,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_sse2
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_c
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_c
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_c
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_sse4_1(const int16_t* input,
                                tran_low_t* output,
@@ -2110,8 +2035,7 @@
                                                   int v,
                                                   int h);
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -2121,8 +2045,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_sse2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_sse2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2132,8 +2055,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-void cdef_filter_block_ssse3(uint8_t* dst8,
-                             uint16_t* dst16,
+void cdef_filter_block_ssse3(void* dst8,
                              int dstride,
                              const uint16_t* in,
                              int pri_strength,
@@ -2143,8 +2065,7 @@
                              int sec_damping,
                              int bsize,
                              int coeff_shift);
-void cdef_filter_block_sse4_1(uint8_t* dst8,
-                              uint16_t* dst16,
+void cdef_filter_block_sse4_1(void* dst8,
                               int dstride,
                               const uint16_t* in,
                               int pri_strength,
@@ -2154,8 +2075,7 @@
                               int sec_damping,
                               int bsize,
                               int coeff_shift);
-void cdef_filter_block_avx2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_avx2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2165,8 +2085,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-RTCD_EXTERN void (*cdef_filter_block)(uint8_t* dst8,
-                                      uint16_t* dst16,
+RTCD_EXTERN void (*cdef_filter_block)(void* dst8,
                                       int dstride,
                                       const uint16_t* in,
                                       int pri_strength,
@@ -2177,6 +2096,67 @@
                                       int bsize,
                                       int coeff_shift);
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_sse2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+void cdef_filter_block_highbd_ssse3(void* dst16,
+                                    int dstride,
+                                    const uint16_t* in,
+                                    int pri_strength,
+                                    int sec_strength,
+                                    int dir,
+                                    int pri_damping,
+                                    int sec_damping,
+                                    int bsize,
+                                    int coeff_shift);
+void cdef_filter_block_highbd_sse4_1(void* dst16,
+                                     int dstride,
+                                     const uint16_t* in,
+                                     int pri_strength,
+                                     int sec_strength,
+                                     int dir,
+                                     int pri_damping,
+                                     int sec_damping,
+                                     int bsize,
+                                     int coeff_shift);
+void cdef_filter_block_highbd_avx2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+RTCD_EXTERN void (*cdef_filter_block_highbd)(void* dst16,
+                                             int dstride,
+                                             const uint16_t* in,
+                                             int pri_strength,
+                                             int sec_strength,
+                                             int dir,
+                                             int pri_damping,
+                                             int sec_damping,
+                                             int bsize,
+                                             int coeff_shift);
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
@@ -2262,14 +2242,6 @@
   if (flags & HAS_AVX2)
     av1_build_compound_diffwtd_mask_d16 =
         av1_build_compound_diffwtd_mask_d16_avx2;
-  av1_build_compound_diffwtd_mask_highbd =
-      av1_build_compound_diffwtd_mask_highbd_c;
-  if (flags & HAS_SSSE3)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_ssse3;
-  if (flags & HAS_AVX2)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_avx2;
   av1_calc_indices_dim1 = av1_calc_indices_dim1_sse2;
   if (flags & HAS_AVX2)
     av1_calc_indices_dim1 = av1_calc_indices_dim1_avx2;
@@ -2311,12 +2283,18 @@
   if (flags & HAS_AVX2)
     av1_dist_wtd_convolve_y = av1_dist_wtd_convolve_y_avx2;
   av1_dr_prediction_z1 = av1_dr_prediction_z1_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z1 = av1_dr_prediction_z1_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z1 = av1_dr_prediction_z1_avx2;
   av1_dr_prediction_z2 = av1_dr_prediction_z2_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z2 = av1_dr_prediction_z2_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z2 = av1_dr_prediction_z2_avx2;
   av1_dr_prediction_z3 = av1_dr_prediction_z3_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z3 = av1_dr_prediction_z3_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z3 = av1_dr_prediction_z3_avx2;
   av1_filter_intra_edge = av1_filter_intra_edge_c;
@@ -2506,6 +2484,13 @@
     cdef_filter_block = cdef_filter_block_sse4_1;
   if (flags & HAS_AVX2)
     cdef_filter_block = cdef_filter_block_avx2;
+  cdef_filter_block_highbd = cdef_filter_block_highbd_sse2;
+  if (flags & HAS_SSSE3)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_ssse3;
+  if (flags & HAS_SSE4_1)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_sse4_1;
+  if (flags & HAS_AVX2)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_avx2;
   cdef_find_dir = cdef_find_dir_sse2;
   if (flags & HAS_SSSE3)
     cdef_find_dir = cdef_find_dir_ssse3;
diff --git a/third_party/libaom/source/config/win/x64/config/aom_config.asm b/third_party/libaom/source/config/win/x64/config/aom_config.asm
index 283cfea..cb13a4a 100644
--- a/third_party/libaom/source/config/win/x64/config/aom_config.asm
+++ b/third_party/libaom/source/config/win/x64/config/aom_config.asm
@@ -11,6 +11,7 @@
 %define CONFIG_AV1_TEMPORAL_DENOISING 1
 %define CONFIG_BIG_ENDIAN 0
 %define CONFIG_BITRATE_ACCURACY 0
+%define CONFIG_BITRATE_ACCURACY_BL 0
 %define CONFIG_BITSTREAM_DEBUG 0
 %define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 %define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -51,6 +52,7 @@
 %define CONFIG_SIZE_LIMIT 1
 %define CONFIG_SPATIAL_RESAMPLING 1
 %define CONFIG_SPEED_STATS 0
+%define CONFIG_TFLITE 0
 %define CONFIG_THREE_PASS 0
 %define CONFIG_TUNE_BUTTERAUGLI 0
 %define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/win/x64/config/aom_config.h b/third_party/libaom/source/config/win/x64/config/aom_config.h
index cc67cdbf..1446d9a 100644
--- a/third_party/libaom/source/config/win/x64/config/aom_config.h
+++ b/third_party/libaom/source/config/win/x64/config/aom_config.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021, Alliance for Open Media. All rights reserved
+ * Copyright (c) 2022, Alliance for Open Media. All rights reserved
  *
  * This source code is subject to the terms of the BSD 2 Clause License and
  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
@@ -23,6 +23,7 @@
 #define CONFIG_AV1_TEMPORAL_DENOISING 1
 #define CONFIG_BIG_ENDIAN 0
 #define CONFIG_BITRATE_ACCURACY 0
+#define CONFIG_BITRATE_ACCURACY_BL 0
 #define CONFIG_BITSTREAM_DEBUG 0
 #define CONFIG_COEFFICIENT_RANGE_CHECKING 0
 #define CONFIG_COLLECT_COMPONENT_TIMING 0
@@ -63,6 +64,7 @@
 #define CONFIG_SIZE_LIMIT 1
 #define CONFIG_SPATIAL_RESAMPLING 1
 #define CONFIG_SPEED_STATS 0
+#define CONFIG_TFLITE 0
 #define CONFIG_THREE_PASS 0
 #define CONFIG_TUNE_BUTTERAUGLI 0
 #define CONFIG_TUNE_VMAF 0
diff --git a/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h b/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h
index 0c5e6882..40eb235 100644
--- a/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h
+++ b/third_party/libaom/source/config/win/x64/config/aom_dsp_rtcd.h
@@ -2133,7 +2133,10 @@
 void aom_hadamard_4x4_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
                         tran_low_t* coeff);
-#define aom_hadamard_4x4 aom_hadamard_4x4_c
+void aom_hadamard_4x4_sse2(const int16_t* src_diff,
+                           ptrdiff_t src_stride,
+                           tran_low_t* coeff);
+#define aom_hadamard_4x4 aom_hadamard_4x4_sse2
 
 void aom_hadamard_8x8_c(const int16_t* src_diff,
                         ptrdiff_t src_stride,
@@ -2196,11 +2199,11 @@
 int16_t aom_int_pro_col_sse2(const uint8_t* ref, const int width);
 #define aom_int_pro_col aom_int_pro_col_sse2
 
-void aom_int_pro_row_c(int16_t* hbuf,
+void aom_int_pro_row_c(int16_t hbuf[16],
                        const uint8_t* ref,
                        const int ref_stride,
                        const int height);
-void aom_int_pro_row_sse2(int16_t* hbuf,
+void aom_int_pro_row_sse2(int16_t hbuf[16],
                           const uint8_t* ref,
                           const int ref_stride,
                           const int height);
@@ -2534,31 +2537,31 @@
 
 void aom_masked_sad128x128x4d_c(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 void aom_masked_sad128x128x4d_ssse3(const uint8_t* src,
                                     int src_stride,
-                                    const uint8_t* ref[],
+                                    const uint8_t* ref[4],
                                     int ref_stride,
                                     const uint8_t* second_pred,
                                     const uint8_t* msk,
                                     int msk_stride,
                                     int invert_mask,
-                                    unsigned sads[]);
+                                    unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x128x4d)(const uint8_t* src,
                                              int src_stride,
-                                             const uint8_t* ref[],
+                                             const uint8_t* ref[4],
                                              int ref_stride,
                                              const uint8_t* second_pred,
                                              const uint8_t* msk,
                                              int msk_stride,
                                              int invert_mask,
-                                             unsigned sads[]);
+                                             unsigned sads[4]);
 
 unsigned int aom_masked_sad128x64_c(const uint8_t* src,
                                     int src_stride,
@@ -2595,31 +2598,31 @@
 
 void aom_masked_sad128x64x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad128x64x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad128x64x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad16x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2656,31 +2659,31 @@
 
 void aom_masked_sad16x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2717,31 +2720,31 @@
 
 void aom_masked_sad16x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad16x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad16x8_c(const uint8_t* src,
                                   int src_stride,
@@ -2778,31 +2781,31 @@
 
 void aom_masked_sad16x8x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad16x8x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad16x8x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad32x16_c(const uint8_t* src,
                                    int src_stride,
@@ -2839,31 +2842,31 @@
 
 void aom_masked_sad32x16x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x16x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x16x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x32_c(const uint8_t* src,
                                    int src_stride,
@@ -2900,31 +2903,31 @@
 
 void aom_masked_sad32x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad32x64_c(const uint8_t* src,
                                    int src_stride,
@@ -2961,31 +2964,31 @@
 
 void aom_masked_sad32x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad32x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad32x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad4x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3022,31 +3025,31 @@
 
 void aom_masked_sad4x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad4x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3083,31 +3086,31 @@
 
 void aom_masked_sad4x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad4x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad4x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad64x128_c(const uint8_t* src,
                                     int src_stride,
@@ -3144,31 +3147,31 @@
 
 void aom_masked_sad64x128x4d_c(const uint8_t* src,
                                int src_stride,
-                               const uint8_t* ref[],
+                               const uint8_t* ref[4],
                                int ref_stride,
                                const uint8_t* second_pred,
                                const uint8_t* msk,
                                int msk_stride,
                                int invert_mask,
-                               unsigned sads[]);
+                               unsigned sads[4]);
 void aom_masked_sad64x128x4d_ssse3(const uint8_t* src,
                                    int src_stride,
-                                   const uint8_t* ref[],
+                                   const uint8_t* ref[4],
                                    int ref_stride,
                                    const uint8_t* second_pred,
                                    const uint8_t* msk,
                                    int msk_stride,
                                    int invert_mask,
-                                   unsigned sads[]);
+                                   unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x128x4d)(const uint8_t* src,
                                             int src_stride,
-                                            const uint8_t* ref[],
+                                            const uint8_t* ref[4],
                                             int ref_stride,
                                             const uint8_t* second_pred,
                                             const uint8_t* msk,
                                             int msk_stride,
                                             int invert_mask,
-                                            unsigned sads[]);
+                                            unsigned sads[4]);
 
 unsigned int aom_masked_sad64x32_c(const uint8_t* src,
                                    int src_stride,
@@ -3205,31 +3208,31 @@
 
 void aom_masked_sad64x32x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x32x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x32x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad64x64_c(const uint8_t* src,
                                    int src_stride,
@@ -3266,31 +3269,31 @@
 
 void aom_masked_sad64x64x4d_c(const uint8_t* src,
                               int src_stride,
-                              const uint8_t* ref[],
+                              const uint8_t* ref[4],
                               int ref_stride,
                               const uint8_t* second_pred,
                               const uint8_t* msk,
                               int msk_stride,
                               int invert_mask,
-                              unsigned sads[]);
+                              unsigned sads[4]);
 void aom_masked_sad64x64x4d_ssse3(const uint8_t* src,
                                   int src_stride,
-                                  const uint8_t* ref[],
+                                  const uint8_t* ref[4],
                                   int ref_stride,
                                   const uint8_t* second_pred,
                                   const uint8_t* msk,
                                   int msk_stride,
                                   int invert_mask,
-                                  unsigned sads[]);
+                                  unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad64x64x4d)(const uint8_t* src,
                                            int src_stride,
-                                           const uint8_t* ref[],
+                                           const uint8_t* ref[4],
                                            int ref_stride,
                                            const uint8_t* second_pred,
                                            const uint8_t* msk,
                                            int msk_stride,
                                            int invert_mask,
-                                           unsigned sads[]);
+                                           unsigned sads[4]);
 
 unsigned int aom_masked_sad8x16_c(const uint8_t* src,
                                   int src_stride,
@@ -3327,31 +3330,31 @@
 
 void aom_masked_sad8x16x4d_c(const uint8_t* src,
                              int src_stride,
-                             const uint8_t* ref[],
+                             const uint8_t* ref[4],
                              int ref_stride,
                              const uint8_t* second_pred,
                              const uint8_t* msk,
                              int msk_stride,
                              int invert_mask,
-                             unsigned sads[]);
+                             unsigned sads[4]);
 void aom_masked_sad8x16x4d_ssse3(const uint8_t* src,
                                  int src_stride,
-                                 const uint8_t* ref[],
+                                 const uint8_t* ref[4],
                                  int ref_stride,
                                  const uint8_t* second_pred,
                                  const uint8_t* msk,
                                  int msk_stride,
                                  int invert_mask,
-                                 unsigned sads[]);
+                                 unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x16x4d)(const uint8_t* src,
                                           int src_stride,
-                                          const uint8_t* ref[],
+                                          const uint8_t* ref[4],
                                           int ref_stride,
                                           const uint8_t* second_pred,
                                           const uint8_t* msk,
                                           int msk_stride,
                                           int invert_mask,
-                                          unsigned sads[]);
+                                          unsigned sads[4]);
 
 unsigned int aom_masked_sad8x4_c(const uint8_t* src,
                                  int src_stride,
@@ -3388,31 +3391,31 @@
 
 void aom_masked_sad8x4x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x4x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x4x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sad8x8_c(const uint8_t* src,
                                  int src_stride,
@@ -3449,31 +3452,31 @@
 
 void aom_masked_sad8x8x4d_c(const uint8_t* src,
                             int src_stride,
-                            const uint8_t* ref[],
+                            const uint8_t* ref[4],
                             int ref_stride,
                             const uint8_t* second_pred,
                             const uint8_t* msk,
                             int msk_stride,
                             int invert_mask,
-                            unsigned sads[]);
+                            unsigned sads[4]);
 void aom_masked_sad8x8x4d_ssse3(const uint8_t* src,
                                 int src_stride,
-                                const uint8_t* ref[],
+                                const uint8_t* ref[4],
                                 int ref_stride,
                                 const uint8_t* second_pred,
                                 const uint8_t* msk,
                                 int msk_stride,
                                 int invert_mask,
-                                unsigned sads[]);
+                                unsigned sads[4]);
 RTCD_EXTERN void (*aom_masked_sad8x8x4d)(const uint8_t* src,
                                          int src_stride,
-                                         const uint8_t* ref[],
+                                         const uint8_t* ref[4],
                                          int ref_stride,
                                          const uint8_t* second_pred,
                                          const uint8_t* msk,
                                          int msk_stride,
                                          int invert_mask,
-                                         unsigned sads[]);
+                                         unsigned sads[4]);
 
 unsigned int aom_masked_sub_pixel_variance128x128_c(const uint8_t* src,
                                                     int src_stride,
@@ -4636,38 +4639,32 @@
 
 void aom_sad128x128x4d_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 void aom_sad128x128x4d_sse2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad128x128x4d_avx2(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x128x4d)(const uint8_t* src_ptr,
                                       int src_stride,
-                                      const uint8_t* const ref_ptr[],
+                                      const uint8_t* const ref_ptr[4],
                                       int ref_stride,
-                                      uint32_t* sad_array);
+                                      uint32_t sad_array[4]);
 
 void aom_sad128x128x4d_avg_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
                              const uint8_t* second_pred,
-                             uint32_t* sad_array);
-void aom_sad128x128x4d_avg_sse2(const uint8_t* src_ptr,
-                                int src_stride,
-                                const uint8_t* const ref_ptr[],
-                                int ref_stride,
-                                const uint8_t* second_pred,
-                                uint32_t* sad_array);
-#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_sse2
+                             uint32_t sad_array[4]);
+#define aom_sad128x128x4d_avg aom_sad128x128x4d_avg_c
 
 unsigned int aom_sad128x64_c(const uint8_t* src_ptr,
                              int src_stride,
@@ -4709,38 +4706,32 @@
 
 void aom_sad128x64x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad128x64x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad128x64x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad128x64x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad128x64x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad128x64x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad128x64x4d_avg aom_sad128x64x4d_avg_c
 
 unsigned int aom_sad128xh_c(const uint8_t* a,
                             int a_stride,
@@ -4780,29 +4771,23 @@
 
 void aom_sad16x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x16x4d aom_sad16x16x4d_sse2
 
 void aom_sad16x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x16x4d_avg aom_sad16x16x4d_avg_c
 
 unsigned int aom_sad16x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -4828,29 +4813,23 @@
 
 void aom_sad16x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad16x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 #define aom_sad16x32x4d aom_sad16x32x4d_sse2
 
 void aom_sad16x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad16x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad16x32x4d_avg aom_sad16x32x4d_avg_c
 
 unsigned int aom_sad16x8_c(const uint8_t* src_ptr,
                            int src_stride,
@@ -4876,29 +4855,23 @@
 
 void aom_sad16x8x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad16x8x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad16x8x4d aom_sad16x8x4d_sse2
 
 void aom_sad16x8x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad16x8x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad16x8x4d_avg aom_sad16x8x4d_avg_c
 
 unsigned int aom_sad16xh_c(const uint8_t* a,
                            int a_stride,
@@ -4954,38 +4927,32 @@
 
 void aom_sad32x16x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x16x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x16x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x16x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x16x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x16x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x16x4d_avg aom_sad32x16x4d_avg_c
 
 unsigned int aom_sad32x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5027,38 +4994,32 @@
 
 void aom_sad32x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x32x4d_avg aom_sad32x32x4d_avg_c
 
 unsigned int aom_sad32x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5100,38 +5061,32 @@
 
 void aom_sad32x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad32x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad32x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad32x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad32x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad32x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad32x64x4d_avg aom_sad32x64x4d_avg_c
 
 unsigned int aom_sad32xh_c(const uint8_t* a,
                            int a_stride,
@@ -5171,29 +5126,23 @@
 
 void aom_sad4x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x4x4d aom_sad4x4x4d_sse2
 
 void aom_sad4x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x4x4d_avg aom_sad4x4x4d_avg_c
 
 unsigned int aom_sad4x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5219,29 +5168,23 @@
 
 void aom_sad4x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad4x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad4x8x4d aom_sad4x8x4d_sse2
 
 void aom_sad4x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad4x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad4x8x4d_avg aom_sad4x8x4d_avg_c
 
 unsigned int aom_sad4xh_c(const uint8_t* a,
                           int a_stride,
@@ -5297,38 +5240,32 @@
 
 void aom_sad64x128x4d_c(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 void aom_sad64x128x4d_sse2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad64x128x4d_avx2(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x128x4d)(const uint8_t* src_ptr,
                                      int src_stride,
-                                     const uint8_t* const ref_ptr[],
+                                     const uint8_t* const ref_ptr[4],
                                      int ref_stride,
-                                     uint32_t* sad_array);
+                                     uint32_t sad_array[4]);
 
 void aom_sad64x128x4d_avg_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
                             const uint8_t* second_pred,
-                            uint32_t* sad_array);
-void aom_sad64x128x4d_avg_sse2(const uint8_t* src_ptr,
-                               int src_stride,
-                               const uint8_t* const ref_ptr[],
-                               int ref_stride,
-                               const uint8_t* second_pred,
-                               uint32_t* sad_array);
-#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_sse2
+                            uint32_t sad_array[4]);
+#define aom_sad64x128x4d_avg aom_sad64x128x4d_avg_c
 
 unsigned int aom_sad64x32_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5370,38 +5307,32 @@
 
 void aom_sad64x32x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x32x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x32x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x32x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x32x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x32x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x32x4d_avg aom_sad64x32x4d_avg_c
 
 unsigned int aom_sad64x64_c(const uint8_t* src_ptr,
                             int src_stride,
@@ -5443,38 +5374,32 @@
 
 void aom_sad64x64x4d_c(const uint8_t* src_ptr,
                        int src_stride,
-                       const uint8_t* const ref_ptr[],
+                       const uint8_t* const ref_ptr[4],
                        int ref_stride,
-                       uint32_t* sad_array);
+                       uint32_t sad_array[4]);
 void aom_sad64x64x4d_sse2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 void aom_sad64x64x4d_avx2(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
-                          uint32_t* sad_array);
+                          uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad64x64x4d)(const uint8_t* src_ptr,
                                     int src_stride,
-                                    const uint8_t* const ref_ptr[],
+                                    const uint8_t* const ref_ptr[4],
                                     int ref_stride,
-                                    uint32_t* sad_array);
+                                    uint32_t sad_array[4]);
 
 void aom_sad64x64x4d_avg_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
                            const uint8_t* second_pred,
-                           uint32_t* sad_array);
-void aom_sad64x64x4d_avg_sse2(const uint8_t* src_ptr,
-                              int src_stride,
-                              const uint8_t* const ref_ptr[],
-                              int ref_stride,
-                              const uint8_t* second_pred,
-                              uint32_t* sad_array);
-#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_sse2
+                           uint32_t sad_array[4]);
+#define aom_sad64x64x4d_avg aom_sad64x64x4d_avg_c
 
 unsigned int aom_sad64xh_c(const uint8_t* a,
                            int a_stride,
@@ -5514,29 +5439,23 @@
 
 void aom_sad8x16x4d_c(const uint8_t* src_ptr,
                       int src_stride,
-                      const uint8_t* const ref_ptr[],
+                      const uint8_t* const ref_ptr[4],
                       int ref_stride,
-                      uint32_t* sad_array);
+                      uint32_t sad_array[4]);
 void aom_sad8x16x4d_sse2(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
-                         uint32_t* sad_array);
+                         uint32_t sad_array[4]);
 #define aom_sad8x16x4d aom_sad8x16x4d_sse2
 
 void aom_sad8x16x4d_avg_c(const uint8_t* src_ptr,
                           int src_stride,
-                          const uint8_t* const ref_ptr[],
+                          const uint8_t* const ref_ptr[4],
                           int ref_stride,
                           const uint8_t* second_pred,
-                          uint32_t* sad_array);
-void aom_sad8x16x4d_avg_sse2(const uint8_t* src_ptr,
-                             int src_stride,
-                             const uint8_t* const ref_ptr[],
-                             int ref_stride,
-                             const uint8_t* second_pred,
-                             uint32_t* sad_array);
-#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_sse2
+                          uint32_t sad_array[4]);
+#define aom_sad8x16x4d_avg aom_sad8x16x4d_avg_c
 
 unsigned int aom_sad8x4_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5562,29 +5481,23 @@
 
 void aom_sad8x4x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x4x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x4x4d aom_sad8x4x4d_sse2
 
 void aom_sad8x4x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x4x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x4x4d_avg aom_sad8x4x4d_avg_c
 
 unsigned int aom_sad8x8_c(const uint8_t* src_ptr,
                           int src_stride,
@@ -5610,29 +5523,23 @@
 
 void aom_sad8x8x4d_c(const uint8_t* src_ptr,
                      int src_stride,
-                     const uint8_t* const ref_ptr[],
+                     const uint8_t* const ref_ptr[4],
                      int ref_stride,
-                     uint32_t* sad_array);
+                     uint32_t sad_array[4]);
 void aom_sad8x8x4d_sse2(const uint8_t* src_ptr,
                         int src_stride,
-                        const uint8_t* const ref_ptr[],
+                        const uint8_t* const ref_ptr[4],
                         int ref_stride,
-                        uint32_t* sad_array);
+                        uint32_t sad_array[4]);
 #define aom_sad8x8x4d aom_sad8x8x4d_sse2
 
 void aom_sad8x8x4d_avg_c(const uint8_t* src_ptr,
                          int src_stride,
-                         const uint8_t* const ref_ptr[],
+                         const uint8_t* const ref_ptr[4],
                          int ref_stride,
                          const uint8_t* second_pred,
-                         uint32_t* sad_array);
-void aom_sad8x8x4d_avg_sse2(const uint8_t* src_ptr,
-                            int src_stride,
-                            const uint8_t* const ref_ptr[],
-                            int ref_stride,
-                            const uint8_t* second_pred,
-                            uint32_t* sad_array);
-#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_sse2
+                         uint32_t sad_array[4]);
+#define aom_sad8x8x4d_avg aom_sad8x8x4d_avg_c
 
 unsigned int aom_sad8xh_c(const uint8_t* a,
                           int a_stride,
@@ -5667,24 +5574,24 @@
 
 void aom_sad_skip_128x128x4d_c(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_sse2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 void aom_sad_skip_128x128x4d_avx2(const uint8_t* src_ptr,
                                   int src_stride,
-                                  const uint8_t* const ref_ptr[],
+                                  const uint8_t* const ref_ptr[4],
                                   int ref_stride,
-                                  uint32_t* sad_array);
+                                  uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x128x4d)(const uint8_t* src_ptr,
                                             int src_stride,
-                                            const uint8_t* const ref_ptr[],
+                                            const uint8_t* const ref_ptr[4],
                                             int ref_stride,
-                                            uint32_t* sad_array);
+                                            uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_128x64_c(const uint8_t* src_ptr,
                                    int src_stride,
@@ -5705,24 +5612,24 @@
 
 void aom_sad_skip_128x64x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_128x64x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_128x64x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_16x16_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5736,14 +5643,14 @@
 
 void aom_sad_skip_16x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x16x4d aom_sad_skip_16x16x4d_sse2
 
 unsigned int aom_sad_skip_16x32_c(const uint8_t* src_ptr,
@@ -5758,14 +5665,14 @@
 
 void aom_sad_skip_16x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_16x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 #define aom_sad_skip_16x32x4d aom_sad_skip_16x32x4d_sse2
 
 unsigned int aom_sad_skip_16x8_c(const uint8_t* src_ptr,
@@ -5780,14 +5687,14 @@
 
 void aom_sad_skip_16x8x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_16x8x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_16x8x4d aom_sad_skip_16x8x4d_sse2
 
 unsigned int aom_sad_skip_32x16_c(const uint8_t* src_ptr,
@@ -5809,24 +5716,24 @@
 
 void aom_sad_skip_32x16x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x16x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x16x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5847,24 +5754,24 @@
 
 void aom_sad_skip_32x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_32x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5885,24 +5792,24 @@
 
 void aom_sad_skip_32x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_32x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_32x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_4x4_c(const uint8_t* src_ptr,
                                 int src_stride,
@@ -5912,9 +5819,9 @@
 
 void aom_sad_skip_4x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_4x4x4d aom_sad_skip_4x4x4d_c
 
 unsigned int aom_sad_skip_4x8_c(const uint8_t* src_ptr,
@@ -5929,14 +5836,14 @@
 
 void aom_sad_skip_4x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_4x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_4x8x4d aom_sad_skip_4x8x4d_sse2
 
 unsigned int aom_sad_skip_64x128_c(const uint8_t* src_ptr,
@@ -5958,24 +5865,24 @@
 
 void aom_sad_skip_64x128x4d_c(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_sse2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 void aom_sad_skip_64x128x4d_avx2(const uint8_t* src_ptr,
                                  int src_stride,
-                                 const uint8_t* const ref_ptr[],
+                                 const uint8_t* const ref_ptr[4],
                                  int ref_stride,
-                                 uint32_t* sad_array);
+                                 uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x128x4d)(const uint8_t* src_ptr,
                                            int src_stride,
-                                           const uint8_t* const ref_ptr[],
+                                           const uint8_t* const ref_ptr[4],
                                            int ref_stride,
-                                           uint32_t* sad_array);
+                                           uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x32_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -5996,24 +5903,24 @@
 
 void aom_sad_skip_64x32x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x32x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x32x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_64x64_c(const uint8_t* src_ptr,
                                   int src_stride,
@@ -6034,24 +5941,24 @@
 
 void aom_sad_skip_64x64x4d_c(const uint8_t* src_ptr,
                              int src_stride,
-                             const uint8_t* const ref_ptr[],
+                             const uint8_t* const ref_ptr[4],
                              int ref_stride,
-                             uint32_t* sad_array);
+                             uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_sse2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 void aom_sad_skip_64x64x4d_avx2(const uint8_t* src_ptr,
                                 int src_stride,
-                                const uint8_t* const ref_ptr[],
+                                const uint8_t* const ref_ptr[4],
                                 int ref_stride,
-                                uint32_t* sad_array);
+                                uint32_t sad_array[4]);
 RTCD_EXTERN void (*aom_sad_skip_64x64x4d)(const uint8_t* src_ptr,
                                           int src_stride,
-                                          const uint8_t* const ref_ptr[],
+                                          const uint8_t* const ref_ptr[4],
                                           int ref_stride,
-                                          uint32_t* sad_array);
+                                          uint32_t sad_array[4]);
 
 unsigned int aom_sad_skip_8x16_c(const uint8_t* src_ptr,
                                  int src_stride,
@@ -6065,14 +5972,14 @@
 
 void aom_sad_skip_8x16x4d_c(const uint8_t* src_ptr,
                             int src_stride,
-                            const uint8_t* const ref_ptr[],
+                            const uint8_t* const ref_ptr[4],
                             int ref_stride,
-                            uint32_t* sad_array);
+                            uint32_t sad_array[4]);
 void aom_sad_skip_8x16x4d_sse2(const uint8_t* src_ptr,
                                int src_stride,
-                               const uint8_t* const ref_ptr[],
+                               const uint8_t* const ref_ptr[4],
                                int ref_stride,
-                               uint32_t* sad_array);
+                               uint32_t sad_array[4]);
 #define aom_sad_skip_8x16x4d aom_sad_skip_8x16x4d_sse2
 
 unsigned int aom_sad_skip_8x4_c(const uint8_t* src_ptr,
@@ -6083,9 +5990,9 @@
 
 void aom_sad_skip_8x4x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 #define aom_sad_skip_8x4x4d aom_sad_skip_8x4x4d_c
 
 unsigned int aom_sad_skip_8x8_c(const uint8_t* src_ptr,
@@ -6100,14 +6007,14 @@
 
 void aom_sad_skip_8x8x4d_c(const uint8_t* src_ptr,
                            int src_stride,
-                           const uint8_t* const ref_ptr[],
+                           const uint8_t* const ref_ptr[4],
                            int ref_stride,
-                           uint32_t* sad_array);
+                           uint32_t sad_array[4]);
 void aom_sad_skip_8x8x4d_sse2(const uint8_t* src_ptr,
                               int src_stride,
-                              const uint8_t* const ref_ptr[],
+                              const uint8_t* const ref_ptr[4],
                               int ref_stride,
-                              uint32_t* sad_array);
+                              uint32_t sad_array[4]);
 #define aom_sad_skip_8x8x4d aom_sad_skip_8x8x4d_sse2
 
 int aom_satd_c(const tran_low_t* coeff, int length);
diff --git a/third_party/libaom/source/config/win/x64/config/av1_rtcd.h b/third_party/libaom/source/config/win/x64/config/av1_rtcd.h
index 8ce1650..e366d77b 100644
--- a/third_party/libaom/source/config/win/x64/config/av1_rtcd.h
+++ b/third_party/libaom/source/config/win/x64/config/av1_rtcd.h
@@ -347,44 +347,6 @@
     ConvolveParams* conv_params,
     int bd);
 
-void av1_build_compound_diffwtd_mask_highbd_c(uint8_t* mask,
-                                              DIFFWTD_MASK_TYPE mask_type,
-                                              const uint8_t* src0,
-                                              int src0_stride,
-                                              const uint8_t* src1,
-                                              int src1_stride,
-                                              int h,
-                                              int w,
-                                              int bd);
-void av1_build_compound_diffwtd_mask_highbd_ssse3(uint8_t* mask,
-                                                  DIFFWTD_MASK_TYPE mask_type,
-                                                  const uint8_t* src0,
-                                                  int src0_stride,
-                                                  const uint8_t* src1,
-                                                  int src1_stride,
-                                                  int h,
-                                                  int w,
-                                                  int bd);
-void av1_build_compound_diffwtd_mask_highbd_avx2(uint8_t* mask,
-                                                 DIFFWTD_MASK_TYPE mask_type,
-                                                 const uint8_t* src0,
-                                                 int src0_stride,
-                                                 const uint8_t* src1,
-                                                 int src1_stride,
-                                                 int h,
-                                                 int w,
-                                                 int bd);
-RTCD_EXTERN void (*av1_build_compound_diffwtd_mask_highbd)(
-    uint8_t* mask,
-    DIFFWTD_MASK_TYPE mask_type,
-    const uint8_t* src0,
-    int src0_stride,
-    const uint8_t* src1,
-    int src1_stride,
-    int h,
-    int w,
-    int bd);
-
 void av1_calc_indices_dim1_c(const int* data,
                              const int* centroids,
                              uint8_t* indices,
@@ -831,6 +793,15 @@
                             int upsample_above,
                             int dx,
                             int dy);
+void av1_dr_prediction_z1_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z1_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -860,6 +831,16 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z2_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_above,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z2_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -890,6 +871,15 @@
                             int upsample_left,
                             int dx,
                             int dy);
+void av1_dr_prediction_z3_sse4_1(uint8_t* dst,
+                                 ptrdiff_t stride,
+                                 int bw,
+                                 int bh,
+                                 const uint8_t* above,
+                                 const uint8_t* left,
+                                 int upsample_left,
+                                 int dx,
+                                 int dy);
 void av1_dr_prediction_z3_avx2(uint8_t* dst,
                                ptrdiff_t stride,
                                int bw,
@@ -1247,104 +1237,6 @@
                                   int8_t* const coeff_contexts);
 #define av1_get_nz_map_contexts av1_get_nz_map_contexts_sse2
 
-void av1_highbd_convolve8_c(const uint8_t* src,
-                            ptrdiff_t src_stride,
-                            uint8_t* dst,
-                            ptrdiff_t dst_stride,
-                            const int16_t* filter_x,
-                            int x_step_q4,
-                            const int16_t* filter_y,
-                            int y_step_q4,
-                            int w,
-                            int h,
-                            int bps);
-void av1_highbd_convolve8_sse2(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve8 av1_highbd_convolve8_sse2
-
-void av1_highbd_convolve8_horiz_c(const uint8_t* src,
-                                  ptrdiff_t src_stride,
-                                  uint8_t* dst,
-                                  ptrdiff_t dst_stride,
-                                  const int16_t* filter_x,
-                                  int x_step_q4,
-                                  const int16_t* filter_y,
-                                  int y_step_q4,
-                                  int w,
-                                  int h,
-                                  int bps);
-void av1_highbd_convolve8_horiz_sse2(const uint8_t* src,
-                                     ptrdiff_t src_stride,
-                                     uint8_t* dst,
-                                     ptrdiff_t dst_stride,
-                                     const int16_t* filter_x,
-                                     int x_step_q4,
-                                     const int16_t* filter_y,
-                                     int y_step_q4,
-                                     int w,
-                                     int h,
-                                     int bps);
-#define av1_highbd_convolve8_horiz av1_highbd_convolve8_horiz_sse2
-
-void av1_highbd_convolve8_vert_c(const uint8_t* src,
-                                 ptrdiff_t src_stride,
-                                 uint8_t* dst,
-                                 ptrdiff_t dst_stride,
-                                 const int16_t* filter_x,
-                                 int x_step_q4,
-                                 const int16_t* filter_y,
-                                 int y_step_q4,
-                                 int w,
-                                 int h,
-                                 int bps);
-void av1_highbd_convolve8_vert_sse2(const uint8_t* src,
-                                    ptrdiff_t src_stride,
-                                    uint8_t* dst,
-                                    ptrdiff_t dst_stride,
-                                    const int16_t* filter_x,
-                                    int x_step_q4,
-                                    const int16_t* filter_y,
-                                    int y_step_q4,
-                                    int w,
-                                    int h,
-                                    int bps);
-#define av1_highbd_convolve8_vert av1_highbd_convolve8_vert_sse2
-
-void av1_highbd_convolve_avg_c(const uint8_t* src,
-                               ptrdiff_t src_stride,
-                               uint8_t* dst,
-                               ptrdiff_t dst_stride,
-                               const int16_t* filter_x,
-                               int x_step_q4,
-                               const int16_t* filter_y,
-                               int y_step_q4,
-                               int w,
-                               int h,
-                               int bps);
-#define av1_highbd_convolve_avg av1_highbd_convolve_avg_c
-
-void av1_highbd_convolve_copy_c(const uint8_t* src,
-                                ptrdiff_t src_stride,
-                                uint8_t* dst,
-                                ptrdiff_t dst_stride,
-                                const int16_t* filter_x,
-                                int x_step_q4,
-                                const int16_t* filter_y,
-                                int y_step_q4,
-                                int w,
-                                int h,
-                                int bps);
-#define av1_highbd_convolve_copy av1_highbd_convolve_copy_c
-
 void av1_highbd_fwht4x4_c(const int16_t* input, tran_low_t* output, int stride);
 void av1_highbd_fwht4x4_sse4_1(const int16_t* input,
                                tran_low_t* output,
@@ -2143,8 +2035,7 @@
                                                   int v,
                                                   int h);
 
-void cdef_filter_block_c(uint8_t* dst8,
-                         uint16_t* dst16,
+void cdef_filter_block_c(void* dst8,
                          int dstride,
                          const uint16_t* in,
                          int pri_strength,
@@ -2154,8 +2045,7 @@
                          int sec_damping,
                          int bsize,
                          int coeff_shift);
-void cdef_filter_block_sse2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_sse2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2165,8 +2055,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-void cdef_filter_block_ssse3(uint8_t* dst8,
-                             uint16_t* dst16,
+void cdef_filter_block_ssse3(void* dst8,
                              int dstride,
                              const uint16_t* in,
                              int pri_strength,
@@ -2176,8 +2065,7 @@
                              int sec_damping,
                              int bsize,
                              int coeff_shift);
-void cdef_filter_block_sse4_1(uint8_t* dst8,
-                              uint16_t* dst16,
+void cdef_filter_block_sse4_1(void* dst8,
                               int dstride,
                               const uint16_t* in,
                               int pri_strength,
@@ -2187,8 +2075,7 @@
                               int sec_damping,
                               int bsize,
                               int coeff_shift);
-void cdef_filter_block_avx2(uint8_t* dst8,
-                            uint16_t* dst16,
+void cdef_filter_block_avx2(void* dst8,
                             int dstride,
                             const uint16_t* in,
                             int pri_strength,
@@ -2198,8 +2085,7 @@
                             int sec_damping,
                             int bsize,
                             int coeff_shift);
-RTCD_EXTERN void (*cdef_filter_block)(uint8_t* dst8,
-                                      uint16_t* dst16,
+RTCD_EXTERN void (*cdef_filter_block)(void* dst8,
                                       int dstride,
                                       const uint16_t* in,
                                       int pri_strength,
@@ -2210,6 +2096,67 @@
                                       int bsize,
                                       int coeff_shift);
 
+void cdef_filter_block_highbd_c(void* dst16,
+                                int dstride,
+                                const uint16_t* in,
+                                int pri_strength,
+                                int sec_strength,
+                                int dir,
+                                int pri_damping,
+                                int sec_damping,
+                                int bsize,
+                                int coeff_shift);
+void cdef_filter_block_highbd_sse2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+void cdef_filter_block_highbd_ssse3(void* dst16,
+                                    int dstride,
+                                    const uint16_t* in,
+                                    int pri_strength,
+                                    int sec_strength,
+                                    int dir,
+                                    int pri_damping,
+                                    int sec_damping,
+                                    int bsize,
+                                    int coeff_shift);
+void cdef_filter_block_highbd_sse4_1(void* dst16,
+                                     int dstride,
+                                     const uint16_t* in,
+                                     int pri_strength,
+                                     int sec_strength,
+                                     int dir,
+                                     int pri_damping,
+                                     int sec_damping,
+                                     int bsize,
+                                     int coeff_shift);
+void cdef_filter_block_highbd_avx2(void* dst16,
+                                   int dstride,
+                                   const uint16_t* in,
+                                   int pri_strength,
+                                   int sec_strength,
+                                   int dir,
+                                   int pri_damping,
+                                   int sec_damping,
+                                   int bsize,
+                                   int coeff_shift);
+RTCD_EXTERN void (*cdef_filter_block_highbd)(void* dst16,
+                                             int dstride,
+                                             const uint16_t* in,
+                                             int pri_strength,
+                                             int sec_strength,
+                                             int dir,
+                                             int pri_damping,
+                                             int sec_damping,
+                                             int bsize,
+                                             int coeff_shift);
+
 int cdef_find_dir_c(const uint16_t* img,
                     int stride,
                     int32_t* var,
@@ -2295,14 +2242,6 @@
   if (flags & HAS_AVX2)
     av1_build_compound_diffwtd_mask_d16 =
         av1_build_compound_diffwtd_mask_d16_avx2;
-  av1_build_compound_diffwtd_mask_highbd =
-      av1_build_compound_diffwtd_mask_highbd_c;
-  if (flags & HAS_SSSE3)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_ssse3;
-  if (flags & HAS_AVX2)
-    av1_build_compound_diffwtd_mask_highbd =
-        av1_build_compound_diffwtd_mask_highbd_avx2;
   av1_calc_indices_dim1 = av1_calc_indices_dim1_sse2;
   if (flags & HAS_AVX2)
     av1_calc_indices_dim1 = av1_calc_indices_dim1_avx2;
@@ -2344,12 +2283,18 @@
   if (flags & HAS_AVX2)
     av1_dist_wtd_convolve_y = av1_dist_wtd_convolve_y_avx2;
   av1_dr_prediction_z1 = av1_dr_prediction_z1_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z1 = av1_dr_prediction_z1_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z1 = av1_dr_prediction_z1_avx2;
   av1_dr_prediction_z2 = av1_dr_prediction_z2_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z2 = av1_dr_prediction_z2_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z2 = av1_dr_prediction_z2_avx2;
   av1_dr_prediction_z3 = av1_dr_prediction_z3_c;
+  if (flags & HAS_SSE4_1)
+    av1_dr_prediction_z3 = av1_dr_prediction_z3_sse4_1;
   if (flags & HAS_AVX2)
     av1_dr_prediction_z3 = av1_dr_prediction_z3_avx2;
   av1_filter_intra_edge = av1_filter_intra_edge_c;
@@ -2539,6 +2484,13 @@
     cdef_filter_block = cdef_filter_block_sse4_1;
   if (flags & HAS_AVX2)
     cdef_filter_block = cdef_filter_block_avx2;
+  cdef_filter_block_highbd = cdef_filter_block_highbd_sse2;
+  if (flags & HAS_SSSE3)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_ssse3;
+  if (flags & HAS_SSE4_1)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_sse4_1;
+  if (flags & HAS_AVX2)
+    cdef_filter_block_highbd = cdef_filter_block_highbd_avx2;
   cdef_find_dir = cdef_find_dir_sse2;
   if (flags & HAS_SSSE3)
     cdef_find_dir = cdef_find_dir_ssse3;
diff --git a/third_party/rust/ansi_term/v0_11/BUILD.gn b/third_party/rust/ansi_term/v0_11/BUILD.gn
index 182e80e..0583cb41 100644
--- a/third_party/rust/ansi_term/v0_11/BUILD.gn
+++ b/third_party/rust/ansi_term/v0_11/BUILD.gn
@@ -15,7 +15,7 @@
     visibility = [ "//third_party/rust/*" ]
     crate_root = "crate/src/lib.rs"
 
-    # Unit tests skipped. Generate with --with-tests to include them
+    # Unit tests skipped. Generate with --with-tests to include them.
     skip_unit_tests = true
     sources = [ "crate/src/lib.rs" ]
     edition = "2015"
diff --git a/third_party/rust/atty/v0_2/BUILD.gn b/third_party/rust/atty/v0_2/BUILD.gn
index 3ddb938..df5e9b4 100644
--- a/third_party/rust/atty/v0_2/BUILD.gn
+++ b/third_party/rust/atty/v0_2/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/bitflags/v1/BUILD.gn b/third_party/rust/bitflags/v1/BUILD.gn
index dd2791f..b85298b 100644
--- a/third_party/rust/bitflags/v1/BUILD.gn
+++ b/third_party/rust/bitflags/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/clap/v2/BUILD.gn b/third_party/rust/clap/v2/BUILD.gn
index d12f8c8..6ef43fa 100644
--- a/third_party/rust/clap/v2/BUILD.gn
+++ b/third_party/rust/clap/v2/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/codespan_reporting/v0_11/BUILD.gn b/third_party/rust/codespan_reporting/v0_11/BUILD.gn
index 64968816..85135ef 100644
--- a/third_party/rust/codespan_reporting/v0_11/BUILD.gn
+++ b/third_party/rust/codespan_reporting/v0_11/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/cxx/v1/BUILD.gn b/third_party/rust/cxx/v1/BUILD.gn
index b59b14c..433b10d 100644
--- a/third_party/rust/cxx/v1/BUILD.gn
+++ b/third_party/rust/cxx/v1/BUILD.gn
@@ -10,7 +10,7 @@
   crate_type = "rlib"
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/cxxbridge_cmd/v1/BUILD.gn b/third_party/rust/cxxbridge_cmd/v1/BUILD.gn
index 5766a50..321333d3 100644
--- a/third_party/rust/cxxbridge_cmd/v1/BUILD.gn
+++ b/third_party/rust/cxxbridge_cmd/v1/BUILD.gn
@@ -23,7 +23,7 @@
   crate_type = "rlib"
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/cxxbridge_macro/v1/BUILD.gn b/third_party/rust/cxxbridge_macro/v1/BUILD.gn
index 878026e..eb95f9f 100644
--- a/third_party/rust/cxxbridge_macro/v1/BUILD.gn
+++ b/third_party/rust/cxxbridge_macro/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/itoa/v0_4/BUILD.gn b/third_party/rust/itoa/v0_4/BUILD.gn
index f357040..da4b6c6 100644
--- a/third_party/rust/itoa/v0_4/BUILD.gn
+++ b/third_party/rust/itoa/v0_4/BUILD.gn
@@ -14,9 +14,8 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
-  features = [ "std" ]
 }
diff --git a/third_party/rust/libc/v0_2/BUILD.gn b/third_party/rust/libc/v0_2/BUILD.gn
index 801300f5..1a8598a 100644
--- a/third_party/rust/libc/v0_2/BUILD.gn
+++ b/third_party/rust/libc/v0_2/BUILD.gn
@@ -15,7 +15,7 @@
     visibility = [ "//third_party/rust/*" ]
     crate_root = "crate/src/lib.rs"
 
-    # Unit tests skipped. Generate with --with-tests to include them
+    # Unit tests skipped. Generate with --with-tests to include them.
     skip_unit_tests = true
     sources = [ "crate/src/lib.rs" ]
     edition = "2015"
diff --git a/third_party/rust/link_cplusplus/v1/BUILD.gn b/third_party/rust/link_cplusplus/v1/BUILD.gn
index 0b3da6d..da71954 100644
--- a/third_party/rust/link_cplusplus/v1/BUILD.gn
+++ b/third_party/rust/link_cplusplus/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/proc_macro2/v1/BUILD.gn b/third_party/rust/proc_macro2/v1/BUILD.gn
index 3ffef7a..dab1a59 100644
--- a/third_party/rust/proc_macro2/v1/BUILD.gn
+++ b/third_party/rust/proc_macro2/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/quote/v1/BUILD.gn b/third_party/rust/quote/v1/BUILD.gn
index 74e341f..f795cf6 100644
--- a/third_party/rust/quote/v1/BUILD.gn
+++ b/third_party/rust/quote/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/ryu/v1/BUILD.gn b/third_party/rust/ryu/v1/BUILD.gn
index c8ec4dc..809fb75a 100644
--- a/third_party/rust/ryu/v1/BUILD.gn
+++ b/third_party/rust/ryu/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/serde/v1/BUILD.gn b/third_party/rust/serde/v1/BUILD.gn
index b918bc0..e1be82c12 100644
--- a/third_party/rust/serde/v1/BUILD.gn
+++ b/third_party/rust/serde/v1/BUILD.gn
@@ -10,7 +10,7 @@
   crate_type = "rlib"
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/serde_derive/v1/BUILD.gn b/third_party/rust/serde_derive/v1/BUILD.gn
index 74d3d03a..f80dec5 100644
--- a/third_party/rust/serde_derive/v1/BUILD.gn
+++ b/third_party/rust/serde_derive/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/serde_jsonrc/v0_1/BUILD.gn b/third_party/rust/serde_jsonrc/v0_1/BUILD.gn
index d80596e..a6b8144 100644
--- a/third_party/rust/serde_jsonrc/v0_1/BUILD.gn
+++ b/third_party/rust/serde_jsonrc/v0_1/BUILD.gn
@@ -10,7 +10,7 @@
   crate_type = "rlib"
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/strsim/v0_8/BUILD.gn b/third_party/rust/strsim/v0_8/BUILD.gn
index e9c9b6a..8b16a292 100644
--- a/third_party/rust/strsim/v0_8/BUILD.gn
+++ b/third_party/rust/strsim/v0_8/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/syn/v1/BUILD.gn b/third_party/rust/syn/v1/BUILD.gn
index 7953d56..b4fa2fa6 100644
--- a/third_party/rust/syn/v1/BUILD.gn
+++ b/third_party/rust/syn/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/termcolor/v1/BUILD.gn b/third_party/rust/termcolor/v1/BUILD.gn
index a51ac14..b284fa5 100644
--- a/third_party/rust/termcolor/v1/BUILD.gn
+++ b/third_party/rust/termcolor/v1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2018"
diff --git a/third_party/rust/textwrap/v0_11/BUILD.gn b/third_party/rust/textwrap/v0_11/BUILD.gn
index 9c8e9ef5..0526abe 100644
--- a/third_party/rust/textwrap/v0_11/BUILD.gn
+++ b/third_party/rust/textwrap/v0_11/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/third_party.toml b/third_party/rust/third_party.toml
index 05c80df..230a64a8 100644
--- a/third_party/rust/third_party.toml
+++ b/third_party/rust/third_party.toml
@@ -29,8 +29,18 @@
 #   file is located, of files generated by the crate's build script.
 #   e.g. build-script-outputs = [ "crate/src/gen/gen_stuff.rs" ]
 
+# Crates listed in dependencies will have a :lib GN target built for them in
+# their BUILD.gn file. The :lib target can be depended on from Chromium
+# production and test code. Third-party crates that are not listed in this
+# file are not visible to Chromium code.
 [dependencies]
 cxxbridge-cmd = "1"
 cxx = "1"
 serde = "1"
 serde_jsonrc = { version="0.1", features=["unbounded_depth"] }
+
+# Crates listed in dev-dependencies will have a :test_support GN target
+# built for them in their BUILD.gn file, which is marked testonly=true.
+# This allows them built in a configuration that can be used from Chromium
+# tests, but not used from production.
+[dev-dependencies]
diff --git a/third_party/rust/unicode_width/v0_1/BUILD.gn b/third_party/rust/unicode_width/v0_1/BUILD.gn
index 5dfeed7..88d01829 100644
--- a/third_party/rust/unicode_width/v0_1/BUILD.gn
+++ b/third_party/rust/unicode_width/v0_1/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/unicode_xid/v0_2/BUILD.gn b/third_party/rust/unicode_xid/v0_2/BUILD.gn
index 60197f5..6ec31e97 100644
--- a/third_party/rust/unicode_xid/v0_2/BUILD.gn
+++ b/third_party/rust/unicode_xid/v0_2/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/vec_map/v0_8/BUILD.gn b/third_party/rust/vec_map/v0_8/BUILD.gn
index 942cc6ea..4075db7 100644
--- a/third_party/rust/vec_map/v0_8/BUILD.gn
+++ b/third_party/rust/vec_map/v0_8/BUILD.gn
@@ -14,7 +14,7 @@
   visibility = [ "//third_party/rust/*" ]
   crate_root = "crate/src/lib.rs"
 
-  # Unit tests skipped. Generate with --with-tests to include them
+  # Unit tests skipped. Generate with --with-tests to include them.
   skip_unit_tests = true
   sources = [ "crate/src/lib.rs" ]
   edition = "2015"
diff --git a/third_party/rust/winapi/v0_3/BUILD.gn b/third_party/rust/winapi/v0_3/BUILD.gn
index 69b65ed..0c12a92 100644
--- a/third_party/rust/winapi/v0_3/BUILD.gn
+++ b/third_party/rust/winapi/v0_3/BUILD.gn
@@ -15,7 +15,7 @@
     visibility = [ "//third_party/rust/*" ]
     crate_root = "crate/src/lib.rs"
 
-    # Unit tests skipped. Generate with --with-tests to include them
+    # Unit tests skipped. Generate with --with-tests to include them.
     skip_unit_tests = true
     sources = [ "crate/src/lib.rs" ]
     edition = "2015"
diff --git a/third_party/rust/winapi_util/v0_1/BUILD.gn b/third_party/rust/winapi_util/v0_1/BUILD.gn
index 2ea9bca..7ee50582 100644
--- a/third_party/rust/winapi_util/v0_1/BUILD.gn
+++ b/third_party/rust/winapi_util/v0_1/BUILD.gn
@@ -15,7 +15,7 @@
     visibility = [ "//third_party/rust/*" ]
     crate_root = "crate/src/lib.rs"
 
-    # Unit tests skipped. Generate with --with-tests to include them
+    # Unit tests skipped. Generate with --with-tests to include them.
     skip_unit_tests = true
     sources = [ "crate/src/lib.rs" ]
     edition = "2018"
diff --git a/third_party/widevine/cdm/BUILD.gn b/third_party/widevine/cdm/BUILD.gn
index 9f47da42..be63a99 100644
--- a/third_party/widevine/cdm/BUILD.gn
+++ b/third_party/widevine/cdm/BUILD.gn
@@ -49,11 +49,6 @@
   }
 }
 
-# For ChromeOS Ash build, the CDM is not component updated hence no manifest.
-if (is_chromeos_ash) {
-  widevine_cdm_manifest_and_license_files = []
-}
-
 copy("version_h") {
   visibility = [ ":*" ]  # Depend on ":headers" instead.
   sources = [ widevine_cdm_version_h_file ]
diff --git a/third_party/wpt_tools/README.chromium b/third_party/wpt_tools/README.chromium
index 512d35c..8a41e1b 100644
--- a/third_party/wpt_tools/README.chromium
+++ b/third_party/wpt_tools/README.chromium
@@ -1,7 +1,7 @@
 Name: web-platform-tests - Test Suites for Web Platform specifications
 Short Name: wpt
 URL: https://github.com/web-platform-tests/wpt/
-Version: ee6da9d71d0268d7fdb04e8e5b26858f46ee0cc4
+Version: 34b9a716f5dd5a2ad4d3302d786a106792bfdee2
 License: LICENSES FOR W3C TEST SUITES (https://www.w3.org/Consortium/Legal/2008/03-bsd-license.html)
 License File: NOT_SHIPPED
 Security Critical: no
diff --git a/third_party/wpt_tools/wpt/tools/wpt/browser.py b/third_party/wpt_tools/wpt/tools/wpt/browser.py
index c0bcf5e4..4f2b383 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/browser.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/browser.py
@@ -523,7 +523,7 @@
     """
 
     product = "chrome"
-    requirements = "requirements_chrome.txt"
+    requirements = "requirements_chromium.txt"
     platforms = {
         "Linux": "Linux",
         "Windows": "Win",
@@ -871,7 +871,7 @@
     """
 
     product = "chrome_android"
-    requirements = "requirements_chrome_android.txt"
+    requirements = "requirements_chromium.txt"
 
     def find_binary(self, venv_path=None, channel=None):
         if channel in ("beta", "dev", "canary"):
@@ -887,7 +887,7 @@
 
     product = "android_weblayer"
     # TODO(aluo): replace this with weblayer version after tests are working.
-    requirements = "requirements_android_webview.txt"
+    requirements = "requirements_chromium.txt"
 
     def find_binary(self, venv_path=None, channel=None):
         return "org.chromium.weblayer.shell"
@@ -901,7 +901,7 @@
     """
 
     product = "android_webview"
-    requirements = "requirements_android_webview.txt"
+    requirements = "requirements_chromium.txt"
 
     def find_binary(self, venv_path=None, channel=None):
         # Just get the current package name of the WebView provider.
@@ -931,7 +931,7 @@
     """
 
     product = "chrome_ios"
-    requirements = "requirements_chrome_ios.txt"
+    requirements = None
 
     def download(self, dest=None, channel=None, rename=None):
         raise NotImplementedError
@@ -1039,7 +1039,7 @@
     }.get(uname[0])
     product = "edgechromium"
     edgedriver_name = "msedgedriver"
-    requirements = "requirements_edge_chromium.txt"
+    requirements = "requirements_chromium.txt"
 
     def download(self, dest=None, channel=None, rename=None):
         raise NotImplementedError
@@ -1316,7 +1316,7 @@
     """Servo-specific interface."""
 
     product = "servo"
-    requirements = "requirements_servo.txt"
+    requirements = None
 
     def platform_components(self):
         platform = {
@@ -1422,7 +1422,7 @@
     """WebKit-specific interface."""
 
     product = "webkit"
-    requirements = "requirements_webkit.txt"
+    requirements = None
 
     def download(self, dest=None, channel=None, rename=None):
         raise NotImplementedError
@@ -1580,7 +1580,7 @@
     """Epiphany-specific interface."""
 
     product = "epiphany"
-    requirements = "requirements_epiphany.txt"
+    requirements = None
 
     def download(self, dest=None, channel=None, rename=None):
         raise NotImplementedError
diff --git a/third_party/wpt_tools/wpt/tools/wpt/run.py b/third_party/wpt_tools/wpt/tools/wpt/run.py
index af9f5634..01c29ea 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/run.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/run.py
@@ -177,10 +177,11 @@
             return self.browser.install(self.venv.path, channel)
 
     def install_requirements(self):
-        if not self.venv.skip_virtualenv_setup:
+        if not self.venv.skip_virtualenv_setup and self.browser.requirements:
             self.venv.install_requirements(os.path.join(
                 wpt_root, "tools", "wptrunner", self.browser.requirements))
 
+
     def setup(self, kwargs):
         self.setup_kwargs(kwargs)
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements.txt
index 35069656..aa8fa7f 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements.txt
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/requirements.txt
@@ -1,8 +1,9 @@
 html5lib==1.1
+mozdebug==0.3.0
 mozinfo==1.2.2  # https://bugzilla.mozilla.org/show_bug.cgi?id=1621226
 mozlog==7.1.0
-mozdebug==0.3.0
+mozprocess==1.3.0
 pillow==8.4.0
-urllib3[secure]==1.26.8
 requests==2.27.1
 six==1.16.0
+urllib3[secure]==1.26.8
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_android_webview.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_android_webview.txt
deleted file mode 100644
index 79619558..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_android_webview.txt
+++ /dev/null
@@ -1 +0,0 @@
-mozprocess==1.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome.txt
deleted file mode 100644
index def71e9a..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-aioquic==0.9.15
-mozprocess==1.3.0
\ No newline at end of file
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome_android.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome_android.txt
deleted file mode 100644
index 79619558..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome_android.txt
+++ /dev/null
@@ -1 +0,0 @@
-mozprocess==1.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome_ios.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome_ios.txt
deleted file mode 100644
index 79619558..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_chrome_ios.txt
+++ /dev/null
@@ -1 +0,0 @@
-mozprocess==1.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_edge.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_edge.txt
index 7ad0180..600b6eb 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_edge.txt
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_edge.txt
@@ -1,2 +1 @@
-mozprocess==1.3.0
 selenium==3.141.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_edge_chromium.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_edge_chromium.txt
deleted file mode 100644
index 79619558..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_edge_chromium.txt
+++ /dev/null
@@ -1 +0,0 @@
-mozprocess==1.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_epiphany.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_epiphany.txt
deleted file mode 100644
index 79619558..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_epiphany.txt
+++ /dev/null
@@ -1 +0,0 @@
-mozprocess==1.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_firefox.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_firefox.txt
index 6bf280c..c8ac33a7b 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_firefox.txt
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_firefox.txt
@@ -1,9 +1,9 @@
 marionette_driver==3.1.0
 mozcrash==2.1.0
+mozdevice==4.0.3
 mozinstall==2.0.1
 mozleak==0.2
 moznetwork==1.1.0
-mozprocess==1.3.0
 mozprofile==2.5.0
 mozrunner==8.2.1
 mozversion==2.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_safari.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_safari.txt
index 65b76aa85..e2d08e7 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_safari.txt
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_safari.txt
@@ -1,2 +1 @@
-mozprocess==1.3.0
 psutil==5.8.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_sauce.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_sauce.txt
index 192d1f3..7d4ff9c 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_sauce.txt
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_sauce.txt
@@ -1,3 +1,2 @@
-mozprocess==1.3.0
 selenium==3.141.0
 requests==2.27.1
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_servo.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_servo.txt
deleted file mode 100644
index 79619558..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_servo.txt
+++ /dev/null
@@ -1 +0,0 @@
-mozprocess==1.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_webkit.txt b/third_party/wpt_tools/wpt/tools/wptrunner/requirements_webkit.txt
deleted file mode 100644
index 79619558..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/requirements_webkit.txt
+++ /dev/null
@@ -1 +0,0 @@
-mozprocess==1.3.0
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/tox.ini b/third_party/wpt_tools/wpt/tools/wptrunner/tox.ini
index c49e759..f2fcf84 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/tox.ini
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/tox.ini
@@ -9,17 +9,13 @@
 deps =
      -r{toxinidir}/../requirements_pytest.txt
      -r{toxinidir}/requirements.txt
-     chrome: -r{toxinidir}/requirements_chrome.txt
+     chrome: -r{toxinidir}/requirements_chromium.txt
      edge: -r{toxinidir}/requirements_edge.txt
      firefox: -r{toxinidir}/requirements_firefox.txt
      ie: -r{toxinidir}/requirements_ie.txt
      opera: -r{toxinidir}/requirements_opera.txt
      safari: -r{toxinidir}/requirements_safari.txt
      sauce: -r{toxinidir}/requirements_sauce.txt
-     servo: -r{toxinidir}/requirements_servo.txt
-     webkit: -r{toxinidir}/requirements_webkit.txt
-     webkitgtk_minibrowser: -r{toxinidir}/requirements_webkit.txt
-     epiphany: -r{toxinidir}/requirements_epiphany.txt
 
 commands = pytest {posargs}
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py
index 36f014a..4f0ac7f2 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py
@@ -3,9 +3,9 @@
 from .base import get_timeout_multiplier  # noqa: F401
 from .chrome import executor_kwargs as chrome_executor_kwargs
 from .chrome_android import ChromeAndroidBrowserBase
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor)  # noqa: F401
-from ..executors.executorchrome import ChromeDriverWdspecExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "android_weblayer",
@@ -14,7 +14,7 @@
                              "wdspec": "NullBrowser"},
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "ChromeDriverWdspecExecutor"},
+                              "wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -89,8 +89,8 @@
                  symbols_path=None):
         """Creates a new representation of Chrome.  The `binary` argument gives
         the browser binary to use for testing."""
-        super(WeblayerShell, self).__init__(logger,
-                webdriver_binary, remote_queue, device_serial,
-                webdriver_args, stackwalk_binary, symbols_path)
+        super().__init__(logger,
+                         webdriver_binary, remote_queue, device_serial,
+                         webdriver_args, stackwalk_binary, symbols_path)
         self.binary = binary
         self.wptserver_ports = _wptserve_ports
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py
index a0d49a2..c713539 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py
@@ -3,18 +3,17 @@
 from .base import get_timeout_multiplier   # noqa: F401
 from .chrome import executor_kwargs as chrome_executor_kwargs
 from .chrome_android import ChromeAndroidBrowserBase
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor)  # noqa: F401
-from ..executors.executorchrome import ChromeDriverWdspecExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "android_webview",
                  "check_args": "check_args",
-                 "browser": {None: "SystemWebViewShell",
-                             "wdspec": "NullBrowser"},
+                 "browser": "SystemWebViewShell",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "ChromeDriverWdspecExecutor"},
+                              "wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -88,8 +87,8 @@
                  symbols_path=None):
         """Creates a new representation of Chrome.  The `binary` argument gives
         the browser binary to use for testing."""
-        super(SystemWebViewShell, self).__init__(logger,
-                webdriver_binary, remote_queue, device_serial,
-                webdriver_args, stackwalk_binary, symbols_path)
+        super().__init__(logger,
+                         webdriver_binary, remote_queue, device_serial,
+                         webdriver_args, stackwalk_binary, symbols_path)
         self.binary = binary
         self.wptserver_ports = _wptserve_ports
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py
index 282e2d7a..618cdc2b 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py
@@ -1,9 +1,14 @@
 import enum
+import errno
 import os
 import platform
 import socket
+import traceback
 from abc import ABCMeta, abstractmethod
 
+import mozprocess
+
+from ..environment import wait_for_service
 from ..wptcommandline import require_arg  # noqa: F401
 
 here = os.path.dirname(__file__)
@@ -275,3 +280,119 @@
         self.logger.process_output(self.pid,
                                    line.decode("utf8", "replace"),
                                    command=" ".join(self.command) if self.command else "")
+
+
+class WebDriverBrowser(Browser):
+    __metaclass__ = ABCMeta
+
+    def __init__(self, logger, binary=None, webdriver_binary=None,
+                 webdriver_args=None, host="127.0.0.1", port=None, base_path="/",
+                 env=None, **kwargs):
+        super().__init__(logger)
+
+        if webdriver_binary is None:
+            raise ValueError("WebDriver server binary must be given "
+                             "to --webdriver-binary argument")
+
+        self.logger = logger
+        self.binary = binary
+        self.webdriver_binary = webdriver_binary
+
+        self.host = host
+        self._port = port
+
+        self.base_path = base_path
+        self.env = os.environ.copy() if env is None else env
+        self.webdriver_args = webdriver_args if webdriver_args is not None else []
+
+        self.url = f"http://{self.host}:{self.port}{self.base_path}"
+
+        self._output_handler = None
+        self._cmd = None
+        self._proc = None
+
+    def make_command(self):
+        """Returns the full command for starting the server process as a list."""
+        return [self.webdriver_binary] + self.webdriver_args
+
+    def start(self, group_metadata, **kwargs):
+        try:
+            self._run_server(group_metadata, **kwargs)
+        except KeyboardInterrupt:
+            self.stop()
+
+    def create_output_handler(self, cmd):
+        """Return an instance of the class used to handle application output.
+
+        This can be overridden by subclasses which have particular requirements
+        for parsing, or otherwise using, the output."""
+        return OutputHandler(self.logger, cmd)
+
+    def _run_server(self, group_metadata, **kwargs):
+        cmd = self.make_command()
+        self._output_handler = self.create_output_handler(cmd)
+
+        self._proc = mozprocess.ProcessHandler(
+            cmd,
+            processOutputLine=self._output_handler,
+            env=self.env,
+            storeOutput=False)
+
+        self.logger.debug("Starting WebDriver: %s" % ' '.join(cmd))
+        try:
+            self._proc.run()
+        except OSError as e:
+            if e.errno == errno.ENOENT:
+                raise IOError(
+                    "WebDriver executable not found: %s" % self.webdriver_binary)
+            raise
+        self._output_handler.after_process_start(self._proc.pid)
+
+        try:
+            wait_for_service(self.logger, self.host, self.port)
+        except Exception:
+            self.logger.error(
+                "WebDriver was not accessible "
+                f"within the timeout:\n{traceback.format_exc()}")
+            raise
+        self._output_handler.start(group_metadata=group_metadata, **kwargs)
+        self.logger.debug("_run complete")
+
+    def stop(self, force=False):
+        self.logger.debug("Stopping WebDriver")
+        clean = True
+        if self.is_alive():
+            kill_result = self._proc.kill()
+            if force and kill_result != 0:
+                clean = False
+                self._proc.kill(9)
+        success = not self.is_alive()
+        if success and self._output_handler is not None:
+            # Only try to do output post-processing if we managed to shut down
+            self._output_handler.after_process_stop(clean)
+            self._output_handler = None
+        return success
+
+    def is_alive(self):
+        return hasattr(self._proc, "proc") and self._proc.poll() is None
+
+    @property
+    def pid(self):
+        if self._proc is not None:
+            return self._proc.pid
+
+    @property
+    def port(self):
+        # If no port is supplied, we'll get a free port right before we use it.
+        # Nothing guarantees an absence of race conditions here.
+        if self._port is None:
+            self._port = get_free_port()
+        return self._port
+
+    def cleanup(self):
+        self.stop()
+
+    def executor_browser(self):
+        return ExecutorBrowser, {"webdriver_url": self.url,
+                                 "host": self.host,
+                                 "port": self.port}
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
index e1a8990c3..8eab89b9 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -1,24 +1,23 @@
 from . import chrome_spki_certs
-from .base import Browser, ExecutorBrowser, require_arg
+from .base import WebDriverBrowser, require_arg
 from .base import NullBrowser  # noqa: F401
 from .base import get_timeout_multiplier   # noqa: F401
-from ..webdriver_server import ChromeDriverServer
+from .base import cmd_arg
 from ..executors import executor_kwargs as base_executor_kwargs
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor,  # noqa: F401
                                            WebDriverCrashtestExecutor)  # noqa: F401
-from ..executors.executorchrome import (ChromeDriverWdspecExecutor,  # noqa: F401
-                                        ChromeDriverPrintRefTestExecutor)  # noqa: F401
+from ..executors.base import WdspecExecutor  # noqa: F401
+from ..executors.executorchrome import ChromeDriverPrintRefTestExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "chrome",
                  "check_args": "check_args",
-                 "browser": {None: "ChromeBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "ChromeBrowser",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
                               "print-reftest": "ChromeDriverPrintRefTestExecutor",
-                              "wdspec": "ChromeDriverWdspecExecutor",
+                              "wdspec": "WdspecExecutor",
                               "crashtest": "WebDriverCrashtestExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
@@ -139,41 +138,14 @@
 def env_options():
     return {"server_host": "127.0.0.1"}
 
+
 def update_properties():
     return (["debug", "os", "processor"], {"os": ["version"], "processor": ["bits"]})
 
-class ChromeBrowser(Browser):
-    """Chrome is backed by chromedriver, which is supplied through
-    ``wptrunner.webdriver.ChromeDriverServer``.
-    """
 
-    def __init__(self, logger, binary, webdriver_binary="chromedriver",
-                 webdriver_args=None, **kwargs):
-        """Creates a new representation of Chrome.  The `binary` argument gives
-        the browser binary to use for testing."""
-        Browser.__init__(self, logger)
-        self.binary = binary
-        self.server = ChromeDriverServer(self.logger,
-                                         binary=webdriver_binary,
-                                         args=webdriver_args)
-
-    def start(self, **kwargs):
-        self.server.start(block=False)
-
-    def stop(self, force=False):
-        self.server.stop(force=force)
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
+class ChromeBrowser(WebDriverBrowser):
+    def make_command(self):
+        return [self.webdriver_binary,
+                cmd_arg("port", str(self.port)),
+                cmd_arg("url-base", self.base_path),
+                cmd_arg("enable-chrome-logs")] + self.webdriver_args
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
index 05be769..1e926bf 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -1,23 +1,21 @@
 import mozprocess
 import subprocess
 
-from .base import Browser, ExecutorBrowser, require_arg
+from .base import cmd_arg, require_arg
 from .base import get_timeout_multiplier   # noqa: F401
-from .base import NullBrowser  # noqa: F401
+from .base import WebDriverBrowser  # noqa: F401
 from .chrome import executor_kwargs as chrome_executor_kwargs
-from ..webdriver_server import ChromeDriverServer
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor)  # noqa: F401
-from ..executors.executorchrome import ChromeDriverWdspecExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "chrome_android",
                  "check_args": "check_args",
-                 "browser": {None: "ChromeAndroidBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "ChromeAndroidBrowser",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "ChromeDriverWdspecExecutor"},
+                              "wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -125,25 +123,26 @@
         self._send_message("log", data)
 
 
-class ChromeAndroidBrowserBase(Browser):
-    def __init__(self, logger,
+class ChromeAndroidBrowserBase(WebDriverBrowser):
+    def __init__(self,
+                 logger,
                  webdriver_binary="chromedriver",
-                 remote_queue = None,
+                 remote_queue=None,
                  device_serial=None,
                  webdriver_args=None,
                  stackwalk_binary=None,
                  symbols_path=None):
-        super(ChromeAndroidBrowserBase, self).__init__(logger)
+        super().__init__(logger,
+                         binary=None,
+                         webdriver_binary=webdriver_binary,
+                         webdriver_args=webdriver_args,)
         self.device_serial = device_serial
         self.stackwalk_binary = stackwalk_binary
         self.symbols_path = symbols_path
         self.remote_queue = remote_queue
-        self.server = ChromeDriverServer(self.logger,
-                                         binary=webdriver_binary,
-                                         args=webdriver_args)
+
         if self.remote_queue is not None:
-            self.logcat_runner = LogcatRunner(self.logger,
-                                          self, self.remote_queue)
+            self.logcat_runner = LogcatRunner(self.logger, self, self.remote_queue)
 
     def setup(self):
         self.setup_adb_reverse()
@@ -158,37 +157,27 @@
         self.logger.info(' '.join(cmd))
         subprocess.check_call(cmd)
 
-    def start(self, **kwargs):
-        self.server.start(block=False)
-
-    def stop(self, force=False):
-        self.server.stop(force=force)
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
+    def make_command(self):
+        return [self.webdriver_binary,
+                cmd_arg("port", str(self.port)),
+                cmd_arg("url-base", self.base_path),
+                cmd_arg("enable-chrome-logs")] + self.webdriver_args
 
     def cleanup(self):
-        self.stop()
+        super().cleanup()
         self._adb_run(['forward', '--remove-all'])
         self._adb_run(['reverse', '--remove-all'])
         if self.remote_queue is not None:
             self.logcat_runner.stop(force=True)
 
     def executor_browser(self):
-        return ExecutorBrowser, {
-            "webdriver_url": self.server.url,
-            "capabilities": {
-                "goog:chromeOptions": {
-                    "androidDeviceSerial": self.device_serial
-                }
+        cls, kwargs = super().executor_browser()
+        kwargs["capabilities"] = {
+            "goog:chromeOptions": {
+                "androidDeviceSerial": self.device_serial
             }
         }
+        return cls, kwargs
 
     def clear_log(self):
         self._adb_run(['logcat', '-c'])
@@ -224,6 +213,7 @@
         for port in self.wptserver_ports:
             self._adb_run(['reverse', 'tcp:%d' % port, 'tcp:%d' % port])
 
+
 class ChromeAndroidBrowser(ChromeAndroidBrowserBase):
     """Chrome is backed by chromedriver, which is supplied through
     ``wptrunner.webdriver.ChromeDriverServer``.
@@ -236,8 +226,8 @@
                  webdriver_args=None,
                  stackwalk_binary=None,
                  symbols_path=None):
-        super(ChromeAndroidBrowser, self).__init__(logger,
-                webdriver_binary, remote_queue, device_serial,
-                webdriver_args, stackwalk_binary, symbols_path)
+        super().__init__(logger,
+                         webdriver_binary, remote_queue, device_serial,
+                         webdriver_args, stackwalk_binary, symbols_path)
         self.package_name = package_name
         self.wptserver_ports = _wptserve_ports
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py
index fe4ac528..b22ecc5 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py
@@ -1,16 +1,14 @@
-from .base import Browser, ExecutorBrowser, require_arg
-from .base import NullBrowser, get_timeout_multiplier   # noqa: F401
-from ..webdriver_server import CWTChromeDriverServer
+from .base import WebDriverBrowser, require_arg
+from .base import get_timeout_multiplier   # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor)  # noqa: F401
-from ..executors.executorchrome import ChromeDriverWdspecExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "chrome_ios",
                  "check_args": "check_args",
-                 "browser": {None: "ChromeiOSBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "ChromeiOSBrowser",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor"},
                  "browser_kwargs": "browser_kwargs",
@@ -45,37 +43,12 @@
     return {}
 
 
-class ChromeiOSBrowser(Browser):
+class ChromeiOSBrowser(WebDriverBrowser):
     """ChromeiOS is backed by CWTChromeDriver, which is supplied through
     ``wptrunner.webdriver.CWTChromeDriverServer``.
     """
 
     init_timeout = 120
 
-    def __init__(self, logger, webdriver_binary, webdriver_args=None, **kwargs):
-        """Creates a new representation of Chrome."""
-        Browser.__init__(self, logger)
-        self.server = CWTChromeDriverServer(self.logger,
-                                            binary=webdriver_binary,
-                                            args=webdriver_args)
-
-    def start(self, **kwargs):
-        self.server.start(block=False)
-
-    def stop(self, force=False):
-        self.server.stop(force=force)
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
+    def make_command(self):
+        return [self.binary, f"--port={self.port}"] + self.webdriver_args
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py
index 3101e9c..053342e 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py
@@ -1,20 +1,18 @@
 import time
 import subprocess
-from .base import Browser, ExecutorBrowser, require_arg
-from .base import NullBrowser  # noqa: F401
-from ..webdriver_server import EdgeDriverServer
+from .base import require_arg
+from .base import WebDriverBrowser
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorselenium import (SeleniumTestharnessExecutor,  # noqa: F401
                                           SeleniumRefTestExecutor)  # noqa: F401
-from ..executors.executoredge import EdgeDriverWdspecExecutor  # noqa: F401
 
 __wptrunner__ = {"product": "edge",
                  "check_args": "check_args",
-                 "browser": {None: "EdgeBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "EdgeBrowser",
                  "executor": {"testharness": "SeleniumTestharnessExecutor",
                               "reftest": "SeleniumRefTestExecutor",
-                              "wdspec": "EdgeDriverWdspecExecutor"},
+                              "wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -64,30 +62,20 @@
     return {"supports_debugger": False}
 
 
-class EdgeBrowser(Browser):
+class EdgeBrowser(WebDriverBrowser):
     init_timeout = 60
 
-    def __init__(self, logger, webdriver_binary,
-            timeout_multiplier=None, webdriver_args=None, **kwargs):
-        Browser.__init__(self, logger)
-        self.server = EdgeDriverServer(self.logger,
-                                       binary=webdriver_binary,
-                                       args=webdriver_args)
-        self.webdriver_host = "localhost"
-        self.webdriver_port = self.server.port
-        if timeout_multiplier:
-            self.init_timeout = self.init_timeout * timeout_multiplier
-
-
-    def start(self, **kwargs):
-        print(self.server.url)
-        self.server.start()
+    def __init__(self, logger, binary, webdriver_binary, webdriver_args=None,
+                 host="localhost", port=None, base_path="/", env=None, **kwargs):
+        super().__init__(logger, binary, webdriver_binary, webdriver_args=webdriver_args,
+                         host=host, port=port, base_path=base_path, env=env, **kwargs)
+        self.host = "localhost"
 
     def stop(self, force=False):
-        self.server.stop(force=force)
+        super(self).stop(force)
         # Wait for Edge browser process to exit if driver process is found
         edge_proc_name = 'MicrosoftEdge.exe'
-        for i in range(0,5):
+        for i in range(0, 5):
             procs = subprocess.check_output(['tasklist', '/fi', 'ImageName eq ' + edge_proc_name])
             if b'MicrosoftWebDriver.exe' not in procs:
                 # Edge driver process already exited, don't wait for browser process to exit
@@ -101,20 +89,8 @@
             # close Edge process if it is still running
             subprocess.call(['taskkill.exe', '/f', '/im', 'microsoftedge*'])
 
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the server is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
+    def make_command(self):
+        return [self.webdriver_binary, f"--port={self.port}"] + self.webdriver_args
 
 
 def run_info_extras(**kwargs):
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge_webdriver.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge_webdriver.py
index e5949fe3..e985361e 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge_webdriver.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge_webdriver.py
@@ -1,6 +1,5 @@
 from .base import NullBrowser  # noqa: F401
 from .edge import (EdgeBrowser,  # noqa: F401
-                   EdgeDriverWdspecExecutor,  # noqa: F401
                    check_args,  # noqa: F401
                    browser_kwargs,  # noqa: F401
                    executor_kwargs,  # noqa: F401
@@ -9,17 +8,17 @@
                    run_info_extras,  # noqa: F401
                    get_timeout_multiplier)  # noqa: F401
 
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor)  # noqa: F401
 
 
 __wptrunner__ = {"product": "edge_webdriver",
                  "check_args": "check_args",
-                 "browser": {None: "EdgeBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "EdgeBrowser",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "EdgeDriverWdspecExecutor"},
+                              "wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py
index d47119e..f863a2f 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py
@@ -1,20 +1,18 @@
-from .base import Browser, ExecutorBrowser, require_arg
-from .base import NullBrowser  # noqa: F401
+from .base import cmd_arg, require_arg
+from .base import WebDriverBrowser
 from .base import get_timeout_multiplier   # noqa: F401
-from ..webdriver_server import EdgeChromiumDriverServer
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor)  # noqa: F401
-from ..executors.executoredgechromium import EdgeChromiumDriverWdspecExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "edgechromium",
                  "check_args": "check_args",
-                 "browser": {None: "EdgeChromiumBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "EdgeChromiumBrowser",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "EdgeChromiumDriverWdspecExecutor"},
+                              "wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -83,38 +81,12 @@
     return {}
 
 
-class EdgeChromiumBrowser(Browser):
+class EdgeChromiumBrowser(WebDriverBrowser):
     """MicrosoftEdge is backed by MSEdgeDriver, which is supplied through
     ``wptrunner.webdriver.EdgeChromiumDriverServer``.
     """
 
-    def __init__(self, logger, binary, webdriver_binary="msedgedriver",
-                 webdriver_args=None, **kwargs):
-        """Creates a new representation of MicrosoftEdge.  The `binary` argument gives
-        the browser binary to use for testing."""
-        Browser.__init__(self, logger)
-        self.binary = binary
-        self.server = EdgeChromiumDriverServer(self.logger,
-                                         binary=webdriver_binary,
-                                         args=webdriver_args)
-
-    def start(self, **kwargs):
-        self.server.start(block=False)
-
-    def stop(self, force=False):
-        self.server.stop(force=force)
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
+    def make_command(self):
+        return [self.webdriver_binary,
+                cmd_arg("port", str(self.port)),
+                cmd_arg("url-base", self.base_path)] + self.webdriver_args
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py
index d61f74e..a40f765 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py
@@ -2,21 +2,21 @@
                    certificate_domain_list,
                    get_timeout_multiplier,  # noqa: F401
                    maybe_add_args)
-from .webkit import WebKitBrowser
+from .webkit import WebKitBrowser  # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor,  # noqa: F401
                                            WebDriverCrashtestExecutor)  # noqa: F401
-from ..executors.executorwebkit import WebKitDriverWdspecExecutor  # noqa: F401
 
 __wptrunner__ = {"product": "epiphany",
                  "check_args": "check_args",
-                 "browser": {None: "EpiphanyBrowser",
+                 "browser": {None: "WebKitBrowser",
                              "wdspec": "NullBrowser"},
                  "browser_kwargs": "browser_kwargs",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "WebKitDriverWdspecExecutor",
+                              "wdspec": "WdspecExecutor",
                               "crashtest": "WebDriverCrashtestExecutor"},
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -71,10 +71,3 @@
 
 def run_info_extras(**kwargs):
     return {"webkit_port": "gtk"}
-
-
-class EpiphanyBrowser(WebKitBrowser):
-    def __init__(self, logger, binary=None, webdriver_binary=None,
-                 webdriver_args=None, **kwargs):
-        WebKitBrowser.__init__(self, logger, binary, webdriver_binary,
-                               webdriver_args)
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
index 49345aca..e533bf07 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -1,13 +1,12 @@
-import base64
-import io
 import json
 import os
 import platform
 import signal
 import subprocess
 import tempfile
-import zipfile
+import time
 from abc import ABCMeta, abstractmethod
+from http.client import HTTPConnection
 
 import mozinfo
 import mozleak
@@ -20,7 +19,7 @@
 
 from .base import (Browser,
                    ExecutorBrowser,
-                   NullBrowser,
+                   WebDriverBrowser,
                    OutputHandler,
                    OutputHandlerState,
                    browser_command,
@@ -33,10 +32,8 @@
                                             MarionettePrintRefTestExecutor,  # noqa: F401
                                             MarionetteWdspecExecutor,  # noqa: F401
                                             MarionetteCrashtestExecutor)  # noqa: F401
-from ..webdriver_server import WebDriverServer
 
 
-here = os.path.dirname(__file__)
 
 __wptrunner__ = {"product": "firefox",
                  "check_args": "check_args",
@@ -85,6 +82,8 @@
 
 def browser_kwargs(logger, test_type, run_info_data, config, **kwargs):
     return {"binary": kwargs["binary"],
+            "webdriver_binary": kwargs["webdriver_binary"],
+            "webdriver_args": kwargs["webdriver_args"],
             "prefs_root": kwargs["prefs_root"],
             "extra_prefs": kwargs["extra_prefs"],
             "test_type": test_type,
@@ -112,17 +111,6 @@
             "specialpowers_path": kwargs["specialpowers_path"]}
 
 
-class WdSpecProfile(object):
-    def __init__(self, profile):
-        self.profile = profile
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, *args, **kwargs):
-        self.profile.cleanup()
-
-
 def executor_kwargs(logger, test_type, test_environment, run_info_data,
                     **kwargs):
     executor_kwargs = base_executor_kwargs(test_type, test_environment, run_info_data,
@@ -145,57 +133,11 @@
         if kwargs["binary_args"]:
             options["args"] = kwargs["binary_args"]
 
-        profile_creator = ProfileCreator(logger,
-                                         kwargs["prefs_root"],
-                                         test_environment.config,
-                                         test_type,
-                                         kwargs["extra_prefs"],
-                                         kwargs["gecko_e10s"],
-                                         kwargs["enable_fission"],
-                                         kwargs["browser_channel"],
-                                         kwargs["binary"],
-                                         kwargs["certutil_binary"],
-                                         test_environment.config.ssl_config["ca_cert_path"])
-        if kwargs["processes"] > 1:
-            # With multiple processes, we would need a profile directory per process, but we
-            # don't have an easy way to do that, so include the profile in the capabilties
-            # directly instead. This means recreating it per session, which is slow
-            options["profile"] = profile_creator.create_base64()
-            profile = None
-        else:
-            profile = profile_creator.create()
-            options["args"].extend(["--profile", profile.profile])
-            test_environment.env_extras_cms.append(WdSpecProfile(profile))
+        if not kwargs["binary"] and kwargs["headless"] and "--headless" not in options["args"]:
+            options["args"].append("--headless")
 
         capabilities["moz:firefoxOptions"] = options
 
-        # This gets reused for firefox_android, but the environment setup
-        # isn't required in that case
-        if kwargs["binary"]:
-            environ = get_environ(logger,
-                                  kwargs["binary"],
-                                  kwargs["debug_info"],
-                                  kwargs["stylo_threads"],
-                                  kwargs["headless"],
-                                  kwargs["enable_webrender"],
-                                  kwargs["chaos_mode_flags"])
-            leak_report_file = setup_leak_report(kwargs["leak_check"], profile, environ)
-
-            # This doesn't work with wdspec tests
-            # In particular tests can create a session without passing in the capabilites
-            # and in those cases we get the default geckodriver profile which doesn't
-            # guarantee zero network access
-            del environ["MOZ_DISABLE_NONLOCAL_CONNECTIONS"]
-            executor_kwargs["environ"] = environ
-        else:
-            if kwargs["headless"] and "--headless" not in options["args"]:
-                options["args"].append("--headless")
-            leak_report_file = None
-
-        executor_kwargs["stackfix_dir"] = kwargs["stackfix_dir"],
-        executor_kwargs["leak_report_file"] = leak_report_file
-        executor_kwargs["asan"] = run_info_data.get("asan")
-
     if kwargs["certutil_binary"] is None:
         capabilities["acceptInsecureCerts"] = True
     if capabilities:
@@ -610,7 +552,8 @@
 
 class ProfileCreator:
     def __init__(self, logger, prefs_root, config, test_type, extra_prefs, e10s,
-                 enable_fission, browser_channel, binary, certutil_binary, ca_certificate_path):
+                 enable_fission, browser_channel, binary, certutil_binary,
+                 ca_certificate_path):
         self.logger = logger
         self.prefs_root = prefs_root
         self.config = config
@@ -641,21 +584,6 @@
 
         return profile
 
-    def create_base64(self, **kwargs):
-        profile = self.create(**kwargs)
-        try:
-            with io.BytesIO() as buf:
-                with zipfile.ZipFile(buf, "w", compression=zipfile.ZIP_DEFLATED) as zipf:
-                    for dirpath, _, filenames in os.walk(profile.profile):
-                        for filename in filenames:
-                            src_path = os.path.join(dirpath, filename)
-                            dest_path = os.path.relpath(src_path, profile.profile)
-                            with open(src_path, "rb") as f:
-                                zipf.writestr(dest_path, f.read())
-                return base64.b64encode(buf.getvalue()).decode("ascii").strip()
-        finally:
-            profile.cleanup()
-
     def _load_prefs(self):
         prefs = Preferences()
 
@@ -883,10 +811,112 @@
             return False
 
 
-class FirefoxWdSpecBrowser(NullBrowser):
-    def __init__(self, logger, leak_check=False, **kwargs):
-        super().__init__(logger, **kwargs)
+class FirefoxWdSpecBrowser(WebDriverBrowser):
+    def __init__(self, logger, binary, prefs_root, webdriver_binary, webdriver_args,
+                 extra_prefs=None, debug_info=None, symbols_path=None, stackwalk_binary=None,
+                 certutil_binary=None, ca_certificate_path=None, e10s=False,
+                 enable_fission=False, stackfix_dir=None, leak_check=False,
+                 asan=False, stylo_threads=1, chaos_mode_flags=None, config=None,
+                 browser_channel="nightly", headless=None, **kwargs):
+
+        super().__init__(logger, binary, webdriver_binary, webdriver_args)
+        self.binary = binary
+        self.webdriver_binary = webdriver_binary
+
+        self.stackfix_dir = stackfix_dir
+        self.symbols_path = symbols_path
+        self.stackwalk_binary = stackwalk_binary
+
+        self.asan = asan
         self.leak_check = leak_check
+        self.leak_report_file = None
+
+        self.env = self.get_env(binary, debug_info, stylo_threads, headless, chaos_mode_flags)
+
+        profile_creator = ProfileCreator(logger,
+                                         prefs_root,
+                                         config,
+                                         "wdspec",
+                                         extra_prefs,
+                                         e10s,
+                                         enable_fission,
+                                         browser_channel,
+                                         binary,
+                                         certutil_binary,
+                                         ca_certificate_path)
+
+        self.profile = profile_creator.create()
+        self.marionette_port = None
+
+    def get_env(self, binary, debug_info, stylo_threads, headless, chaos_mode_flags):
+        env = get_environ(self.logger,
+                          binary,
+                          debug_info,
+                          stylo_threads,
+                          headless,
+                          chaos_mode_flags)
+        env["RUST_BACKTRACE"] = "1"
+        # This doesn't work with wdspec tests
+        # In particular tests can create a session without passing in the capabilites
+        # and in those cases we get the default geckodriver profile which doesn't
+        # guarantee zero network access
+        del env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"]
+        return env
+
+    def create_output_handler(self, cmd):
+        return FirefoxOutputHandler(self.logger,
+                                    cmd,
+                                    stackfix_dir=self.stackfix_dir,
+                                    symbols_path=self.symbols_path,
+                                    asan=self.asan,
+                                    leak_report_file=self.leak_report_file)
+
+    def start(self, group_metadata, **kwargs):
+        self.leak_report_file = setup_leak_report(self.leak_check, self.profile, self.env)
+        super().start(group_metadata, **kwargs)
+
+    def stop(self, force=False):
+        # Initially wait for any WebDriver session to cleanly shutdown
+        # When this is called the executor is usually sending a end session
+        # command to the browser. We don't have a synchronisation mechanism
+        # that allows us to know that process is ongoing, so poll the status
+        # endpoint until there isn't a session, before killing the driver.
+        if self.is_alive():
+            end_time = time.time() + BrowserInstance.shutdown_timeout
+            while time.time() < end_time:
+                self.logger.debug("Waiting for WebDriver session to end")
+                try:
+                    self.logger.debug(f"Connecting to http://{self.host}:{self.port}/status")
+                    conn = HTTPConnection(self.host, self.port)
+                    conn.request("GET", "/status")
+                    res = conn.getresponse()
+                    self.logger.debug(f"Got response from http://{self.host}:{self.port}/status")
+                except Exception:
+                    self.logger.debug(
+                        f"Connecting to http://{self.host}:{self.port}/status failed")
+                    break
+                if res.status != 200:
+                    self.logger.debug(f"Connecting to http://{self.host}:{self.port}/status "
+                                      f"gave status {res.status}")
+                    break
+                data = res.read()
+                try:
+                    msg = json.loads(data)
+                except ValueError:
+                    self.logger.debug("/status response was not valid JSON")
+                    break
+                if msg.get("value", {}).get("ready") is True:
+                    self.logger.debug("Got ready status")
+                    break
+                self.logger.debug(f"Got status response {data}")
+                time.sleep(1)
+            else:
+                self.logger.debug("WebDriver session didn't end")
+        super().stop(force=force)
+
+    def cleanup(self):
+        super().cleanup()
+        self.profile.cleanup()
 
     def settings(self, test):
         return {"check_leaks": self.leak_check and not test.leaks,
@@ -896,24 +926,12 @@
                 "mozleak_allowed": self.leak_check and test.mozleak_allowed,
                 "mozleak_thresholds": self.leak_check and test.mozleak_threshold}
 
-
-class GeckoDriverServer(WebDriverServer):
-    output_handler_cls = FirefoxOutputHandler
-
-    def __init__(self, logger, marionette_port=2828, binary="geckodriver",
-                 host="127.0.0.1", port=None, env=None, args=None):
-        if env is None:
-            env = os.environ.copy()
-        env["RUST_BACKTRACE"] = "1"
-        WebDriverServer.__init__(self, logger, binary,
-                                 host=host,
-                                 port=port,
-                                 env=env,
-                                 args=args)
-        self.marionette_port = marionette_port
-
     def make_command(self):
-        return [self.binary,
-                "--marionette-port", str(self.marionette_port),
+        return [self.webdriver_binary,
                 "--host", self.host,
-                "--port", str(self.port)] + self._args
+                "--port", str(self.port)] + self.webdriver_args
+
+    def executor_browser(self):
+        cls, args = super().executor_browser()
+        args["profile"] = self.profile.profile
+        return cls, args
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
index 9b57db0..66821b8 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -1,7 +1,7 @@
 import os
 
 import moznetwork
-from mozrunner import FennecEmulatorRunner
+from mozrunner import FennecEmulatorRunner, get_app_context
 
 from .base import (get_free_port,
                    cmd_arg,
@@ -16,12 +16,14 @@
                       run_info_extras as fx_run_info_extras,
                       update_properties,  # noqa: F401
                       executor_kwargs as fx_executor_kwargs,  # noqa: F401
+                      FirefoxWdSpecBrowser,
                       ProfileCreator as FirefoxProfileCreator)
 
 
 __wptrunner__ = {"product": "firefox_android",
                  "check_args": "check_args",
-                 "browser": "FirefoxAndroidBrowser",
+                 "browser": {None: "FirefoxAndroidBrowser",
+                             "wdspec": "FirefoxAndroidWdSpecBrowser"},
                  "executor": {"testharness": "MarionetteTestharnessExecutor",
                               "reftest": "MarionetteRefTestExecutor",
                               "crashtest": "MarionetteCrashtestExecutor",
@@ -41,6 +43,8 @@
 
 def browser_kwargs(logger, test_type, run_info_data, config, **kwargs):
     return {"adb_binary": kwargs["adb_binary"],
+            "webdriver_binary": kwargs["webdriver_binary"],
+            "webdriver_args": kwargs["webdriver_args"],
             "package_name": kwargs["package_name"],
             "device_serial": kwargs["device_serial"],
             "prefs_root": kwargs["prefs_root"],
@@ -97,6 +101,17 @@
             "supports_debugger": True}
 
 
+def get_environ(stylo_threads, chaos_mode_flags):
+    env = {}
+    env["MOZ_CRASHREPORTER"] = "1"
+    env["MOZ_CRASHREPORTER_SHUTDOWN"] = "1"
+    env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1"
+    env["STYLO_THREADS"] = str(stylo_threads)
+    if chaos_mode_flags is not None:
+        env["MOZ_CHAOSMODE"] = str(chaos_mode_flags)
+    return env
+
+
 class ProfileCreator(FirefoxProfileCreator):
     def __init__(self, logger, prefs_root, config, test_type, extra_prefs,
                  enable_fission, browser_channel, certutil_binary, ca_certificate_path):
@@ -216,17 +231,7 @@
                                           [cmd_arg("marionette"), "about:blank"],
                                           self.debug_info)
 
-        env = {}
-        env["MOZ_CRASHREPORTER"] = "1"
-        env["MOZ_CRASHREPORTER_SHUTDOWN"] = "1"
-        env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"] = "1"
-        env["STYLO_THREADS"] = str(self.stylo_threads)
-        if self.chaos_mode_flags is not None:
-            env["MOZ_CHAOSMODE"] = str(self.chaos_mode_flags)
-        if self.enable_webrender:
-            env["MOZ_WEBRENDER"] = "1"
-        else:
-            env["MOZ_WEBRENDER"] = "0"
+        env = get_environ(self.stylo_threads, self.chaos_mode_flags)
 
         self.runner = FennecEmulatorRunner(app=self.package_name,
                                            profile=self.profile,
@@ -299,3 +304,58 @@
         if not os.environ.get("MINIDUMP_STACKWALK", "") and self.stackwalk_binary:
             os.environ["MINIDUMP_STACKWALK"] = self.stackwalk_binary
         return bool(self.runner.check_for_crashes(test_name=test))
+
+
+class FirefoxAndroidWdSpecBrowser(FirefoxWdSpecBrowser):
+    def __init__(self, logger, prefs_root, webdriver_binary, webdriver_args,
+                 extra_prefs=None, debug_info=None, symbols_path=None, stackwalk_binary=None,
+                 certutil_binary=None, ca_certificate_path=None, e10s=False,
+                 enable_fission=False, stackfix_dir=None, leak_check=False,
+                 asan=False, stylo_threads=1, chaos_mode_flags=None, config=None,
+                 browser_channel="nightly", headless=None,
+                 package_name="org.mozilla.geckoview.test_runner", device_serial=None,
+                 adb_binary=None, **kwargs):
+
+        super().__init__(logger, None, prefs_root, webdriver_binary, webdriver_args,
+                         extra_prefs=extra_prefs, debug_info=debug_info, symbols_path=symbols_path,
+                         stackwalk_binary=stackwalk_binary, certutil_binary=certutil_binary,
+                         ca_certificate_path=ca_certificate_path, e10s=e10s,
+                         enable_fission=enable_fission, stackfix_dir=stackfix_dir,
+                         leak_check=leak_check, asan=asan, stylo_threads=stylo_threads,
+                         chaos_mode_flags=chaos_mode_flags, config=config,
+                         browser_channel=browser_channel, headless=headless, **kwargs)
+
+        self.config = config
+        self.package_name = package_name
+        self.device_serial = device_serial
+        # This is just to support the same adb lookup as for other test types
+        context = get_app_context("fennec")(adb_path=adb_binary, device_serial=device_serial)
+        self.device = context.get_device(context.adb, self.device_serial)
+
+    def start(self, group_metadata, **kwargs):
+        for ports in self.config.ports.values():
+            for port in ports:
+                self.device.reverse(
+                    local="tcp:{}".format(port),
+                    remote="tcp:{}".format(port))
+        super().start(group_metadata, **kwargs)
+
+    def stop(self, force=False):
+        try:
+            self.device.remove_reverses()
+        except Exception as e:
+            self.logger.warning("Failed to remove forwarded or reversed ports: %s" % e)
+        super().stop(force=force)
+
+    def get_env(self, binary, debug_info, stylo_threads, headless, chaos_mode_flags):
+        env = get_environ(stylo_threads, chaos_mode_flags)
+        env["RUST_BACKTRACE"] = "1"
+        del env["MOZ_DISABLE_NONLOCAL_CONNECTIONS"]
+        return env
+
+    def executor_browser(self):
+        cls, args = super().executor_browser()
+        args["androidPackage"] = self.package_name
+        args["androidDeviceSerial"] = self.device_serial
+        args["env"] = self.env
+        return cls, args
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py
index c851daf..de577e06 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py
@@ -1,12 +1,12 @@
-from .base import require_arg
-from .base import NullBrowser, get_timeout_multiplier  # noqa: F401
+from .base import require_arg, WebDriverBrowser
+from .base import get_timeout_multiplier  # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
-from ..executors.executorinternetexplorer import InternetExplorerDriverWdspecExecutor  # noqa: F401
+from ..executors.base import WdspecExecutor  # noqa: F401
 
 __wptrunner__ = {"product": "ie",
                  "check_args": "check_args",
-                 "browser": "NullBrowser",
-                 "executor": {"wdspec": "InternetExplorerDriverWdspecExecutor"},
+                 "browser": "WebDriverBrowser",
+                 "executor": {"wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -17,10 +17,12 @@
 def check_args(**kwargs):
     require_arg(kwargs, "webdriver_binary")
 
+
 def browser_kwargs(logger, test_type, run_info_data, config, **kwargs):
     return {"webdriver_binary": kwargs["webdriver_binary"],
             "webdriver_args": kwargs.get("webdriver_args")}
 
+
 def executor_kwargs(logger, test_type, test_environment, run_info_data,
                     **kwargs):
     options = {}
@@ -32,8 +34,15 @@
     executor_kwargs["capabilities"] = capabilities
     return executor_kwargs
 
+
 def env_extras(**kwargs):
     return []
 
+
 def env_options():
     return {"supports_debugger": False}
+
+
+class InternetExplorerBrowser(WebDriverBrowser):
+    def make_command(self):
+        return [self.binary, f"--port={self.port}"] + self.webdriver_args
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py
index f3a2929..b7f2a40 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py
@@ -1,20 +1,18 @@
-from .base import Browser, ExecutorBrowser, require_arg
-from .base import NullBrowser  # noqa: F401
+from .base import require_arg
 from .base import get_timeout_multiplier   # noqa: F401
-from ..webdriver_server import OperaDriverServer
+from .chrome import ChromeBrowser
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorselenium import (SeleniumTestharnessExecutor,  # noqa: F401
                                           SeleniumRefTestExecutor)  # noqa: F401
-from ..executors.executoropera import OperaDriverWdspecExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "opera",
                  "check_args": "check_args",
-                 "browser": {None: "OperaBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "OperaBrowser",
                  "executor": {"testharness": "SeleniumTestharnessExecutor",
                               "reftest": "SeleniumRefTestExecutor",
-                              "wdspec": "OperaDriverWdspecExecutor"},
+                              "wdspec": "WdspecExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -66,38 +64,5 @@
     return {}
 
 
-class OperaBrowser(Browser):
-    """Opera is backed by operadriver, which is supplied through
-    ``wptrunner.webdriver.OperaDriverServer``.
-    """
-
-    def __init__(self, logger, binary, webdriver_binary="operadriver",
-                 webdriver_args=None, **kwargs):
-        """Creates a new representation of Opera.  The `binary` argument gives
-        the browser binary to use for testing."""
-        Browser.__init__(self, logger)
-        self.binary = binary
-        self.server = OperaDriverServer(self.logger,
-                                        binary=webdriver_binary,
-                                        args=webdriver_args)
-
-    def start(self, **kwargs):
-        self.server.start(block=False)
-
-    def stop(self, force=False):
-        self.server.stop(force=force)
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
+class OperaBrowser(ChromeBrowser):
+    pass
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py
index fb3f473..3f910b5 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py
@@ -5,24 +5,21 @@
 
 import psutil
 
-from .base import Browser, ExecutorBrowser, require_arg
-from .base import NullBrowser  # noqa: F401
+from .base import WebDriverBrowser, require_arg
 from .base import get_timeout_multiplier   # noqa: F401
-from ..webdriver_server import SafariDriverServer
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor,  # noqa: F401
                                            WebDriverCrashtestExecutor)  # noqa: F401
-from ..executors.executorsafari import SafariDriverWdspecExecutor  # noqa: F401
 
 
 __wptrunner__ = {"product": "safari",
                  "check_args": "check_args",
-                 "browser": {None: "SafariBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "SafariBrowser",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "SafariDriverWdspecExecutor",
+                              "wdspec": "WdspecExecutor",
                               "crashtest": "WebDriverCrashtestExecutor"},
                  "browser_kwargs": "browser_kwargs",
                  "executor_kwargs": "executor_kwargs",
@@ -143,20 +140,23 @@
     return (None, None)
 
 
-class SafariBrowser(Browser):
+class SafariBrowser(WebDriverBrowser):
     """Safari is backed by safaridriver, which is supplied through
     ``wptrunner.webdriver.SafariDriverServer``.
     """
-
-    def __init__(self, logger, webdriver_binary, webdriver_args=None, kill_safari=False, **kwargs):
+    def __init__(self, logger, binary=None, webdriver_binary=None, webdriver_args=None,
+                 port=None, env=None, kill_safari=False, **kwargs):
         """Creates a new representation of Safari.  The `webdriver_binary`
         argument gives the WebDriver binary to use for testing. (The browser
         binary location cannot be specified, as Safari and SafariDriver are
         coupled.) If `kill_safari` is True, then `Browser.stop` will stop Safari."""
-        Browser.__init__(self, logger)
-        self.server = SafariDriverServer(self.logger,
-                                         binary=webdriver_binary,
-                                         args=webdriver_args)
+        super().__init__(logger,
+                         binary,
+                         webdriver_binary,
+                         webdriver_args=webdriver_args,
+                         port=None,
+                         env=env)
+
         if "/" not in webdriver_binary:
             wd_path = find_executable(webdriver_binary)
         else:
@@ -181,16 +181,17 @@
 
         return exe_path
 
-    def start(self, **kwargs):
-        self.server.start(block=False)
+    def make_command(self):
+        return [self.webdriver_binary, f"--port={self.port}"] + self.webdriver_args
 
     def stop(self, force=False):
-        self.server.stop(force=force)
+        super().stop(force)
 
         if self.kill_safari:
             self.logger.debug("Going to stop Safari")
             for proc in psutil.process_iter(attrs=["exe"]):
-                if proc.info["exe"] is not None and os.path.samefile(proc.info["exe"], self.safari_path):
+                if (proc.info["exe"] is not None and
+                    os.path.samefile(proc.info["exe"], self.safari_path)):
                     self.logger.debug("Stopping Safari %s" % proc.pid)
                     try:
                         proc.terminate()
@@ -200,18 +201,3 @@
                             proc.kill()
                     except psutil.NoSuchProcess:
                         pass
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py
index 1791c1d..1e32c7c0 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py
@@ -1,24 +1,26 @@
 import os
 
-from .base import NullBrowser, ExecutorBrowser, require_arg
+from .base import ExecutorBrowser, NullBrowser, WebDriverBrowser, require_arg
 from .base import get_timeout_multiplier   # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorservo import (ServoCrashtestExecutor,  # noqa: F401
                                        ServoTestharnessExecutor,  # noqa: F401
-                                       ServoRefTestExecutor,  # noqa: F401
-                                       ServoWdspecExecutor)  # noqa: F401
+                                       ServoRefTestExecutor)  # noqa: F401
+
 
 here = os.path.dirname(__file__)
 
 __wptrunner__ = {
     "product": "servo",
     "check_args": "check_args",
-    "browser": "ServoBrowser",
+    "browser": {None: "ServoBrowser",
+                "wdspec": "ServoWdspecBrowser"},
     "executor": {
         "crashtest": "ServoCrashtestExecutor",
         "testharness": "ServoTestharnessExecutor",
         "reftest": "ServoRefTestExecutor",
-        "wdspec": "ServoWdspecExecutor",
+        "wdspec": "WdspecExecutor",
     },
     "browser_kwargs": "browser_kwargs",
     "executor_kwargs": "executor_kwargs",
@@ -49,7 +51,6 @@
     rv["pause_after_test"] = kwargs["pause_after_test"]
     if test_type == "wdspec":
         rv["capabilities"] = {}
-        rv["webdriver_binary"] = kwargs["binary"]
     return rv
 
 
@@ -86,3 +87,30 @@
             "user_stylesheets": self.user_stylesheets,
             "ca_certificate_path": self.ca_certificate_path,
         }
+
+
+class ServoWdspecBrowser(WebDriverBrowser):
+    # TODO: could share an implemenation with servodriver.py, perhaps
+    def __init__(self, logger, binary="servo", webdriver_args=None,
+                 binary_args=None, host="127.0.0.1", env=None, port=None):
+
+        env = os.environ.copy() if env is None else env
+        env["RUST_BACKTRACE"] = "1"
+
+        super().__init__(logger,
+                         binary,
+                         None,
+                         webdriver_args=webdriver_args,
+                         host=host,
+                         port=port,
+                         env=env)
+        self.binary_args = binary_args
+
+    def make_command(self):
+        command = [self.binary,
+                   f"--webdriver={self.port}",
+                   "--hard-fail",
+                   "--headless"] + self.webdriver_args
+        if self.binary_args:
+            command += self.binary_args
+        return command
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py
index 9a6a1a4..32d7543b 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py
@@ -76,6 +76,7 @@
         f.write(make_hosts_file(config, "127.0.0.1"))
     return hosts_path
 
+
 class ServoWebDriverBrowser(Browser):
     init_timeout = 300  # Large timeout for cases where we're booting an Android emulator
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py
index ad24771..aa691f0 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py
@@ -1,21 +1,19 @@
-from .base import Browser, ExecutorBrowser, require_arg
-from .base import NullBrowser, get_timeout_multiplier, certificate_domain_list  # noqa: F401
+from .base import WebDriverBrowser, require_arg
+from .base import get_timeout_multiplier, certificate_domain_list  # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor,  # noqa: F401
                                            WebDriverCrashtestExecutor)  # noqa: F401
-from ..executors.executorwebkit import WebKitDriverWdspecExecutor  # noqa: F401
-from ..webdriver_server import WebKitDriverServer
 
 
 __wptrunner__ = {"product": "webkit",
                  "check_args": "check_args",
-                 "browser": {None: "WebKitBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "WebKitBrowser",
                  "browser_kwargs": "browser_kwargs",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "WebKitDriverWdspecExecutor",
+                              "wdspec": "WdspecExecutor",
                               "crashtest": "WebDriverCrashtestExecutor"},
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -76,35 +74,8 @@
     return {"webkit_port": kwargs["webkit_port"]}
 
 
-class WebKitBrowser(Browser):
-    """Generic WebKit browser is backed by WebKit's WebDriver implementation,
-    which is supplied through ``wptrunner.webdriver.WebKitDriverServer``.
-    """
+class WebKitBrowser(WebDriverBrowser):
+    """Generic WebKit browser is backed by WebKit's WebDriver implementation"""
 
-    def __init__(self, logger, binary, webdriver_binary=None,
-                 webdriver_args=None, **kwargs):
-        Browser.__init__(self, logger)
-        self.binary = binary
-        self.server = WebKitDriverServer(self.logger, binary=webdriver_binary,
-                                         args=webdriver_args)
-
-    def start(self, **kwargs):
-        self.server.start(block=False)
-
-    def stop(self, force=False):
-        self.server.stop(force=force)
-
-    def pid(self):
-        return self.server.pid
-
-    def is_alive(self):
-        # TODO(ato): This only indicates the driver is alive,
-        # and doesn't say anything about whether a browser session
-        # is active.
-        return self.server.is_alive()
-
-    def cleanup(self):
-        self.stop()
-
-    def executor_browser(self):
-        return ExecutorBrowser, {"webdriver_url": self.server.url}
+    def make_command(self):
+        return [self.webdriver_binary, f"--port={self.port}"] + self.webdriver_args
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
index 7a02ad14..2c69997 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
@@ -4,19 +4,18 @@
                    maybe_add_args)
 from .webkit import WebKitBrowser
 from ..executors import executor_kwargs as base_executor_kwargs
+from ..executors.base import WdspecExecutor  # noqa: F401
 from ..executors.executorwebdriver import (WebDriverTestharnessExecutor,  # noqa: F401
                                            WebDriverRefTestExecutor,  # noqa: F401
                                            WebDriverCrashtestExecutor)  # noqa: F401
-from ..executors.executorwebkit import WebKitDriverWdspecExecutor  # noqa: F401
 
 __wptrunner__ = {"product": "webkitgtk_minibrowser",
                  "check_args": "check_args",
-                 "browser": {None: "WebKitGTKMiniBrowser",
-                             "wdspec": "NullBrowser"},
+                 "browser": "WebKitGTKMiniBrowser",
                  "browser_kwargs": "browser_kwargs",
                  "executor": {"testharness": "WebDriverTestharnessExecutor",
                               "reftest": "WebDriverRefTestExecutor",
-                              "wdspec": "WebKitDriverWdspecExecutor",
+                              "wdspec": "WdspecExecutor",
                               "crashtest": "WebDriverCrashtestExecutor"},
                  "executor_kwargs": "executor_kwargs",
                  "env_extras": "env_extras",
@@ -40,13 +39,13 @@
 
 def capabilities(server_config, **kwargs):
     browser_required_args = ["--automation",
-                            "--javascript-can-open-windows-automatically=true",
-                            "--enable-xss-auditor=false",
-                            "--enable-media-capabilities=true",
-                            "--enable-encrypted-media=true",
-                            "--enable-media-stream=true",
-                            "--enable-mock-capture-devices=true",
-                            "--enable-webaudio=true"]
+                             "--javascript-can-open-windows-automatically=true",
+                             "--enable-xss-auditor=false",
+                             "--enable-media-capabilities=true",
+                             "--enable-encrypted-media=true",
+                             "--enable-media-stream=true",
+                             "--enable-mock-capture-devices=true",
+                             "--enable-webaudio=true"]
     args = kwargs.get("binary_args", [])
     args = maybe_add_args(browser_required_args, args)
     return {
@@ -78,7 +77,4 @@
 
 
 class WebKitGTKMiniBrowser(WebKitBrowser):
-    def __init__(self, logger, binary=None, webdriver_binary=None,
-                 webdriver_args=None, **kwargs):
-        WebKitBrowser.__init__(self, logger, binary, webdriver_binary,
-                               webdriver_args)
+    pass
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py
index 978ed9f..53dff149 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py
@@ -1,3 +1,4 @@
+import errno
 import json
 import os
 import signal
@@ -294,3 +295,28 @@
                         s.close()
 
         return failed, pending
+
+
+def wait_for_service(logger, host, port, timeout=60):
+    """Waits until network service given as a tuple of (host, port) becomes
+    available or the `timeout` duration is reached, at which point
+    ``socket.error`` is raised."""
+    addr = (host, port)
+    logger.debug(f"Trying to connect to {host}:{port}")
+    end = time.time() + timeout
+    while end > time.time():
+        so = socket.socket()
+        try:
+            so.connect(addr)
+        except socket.timeout:
+            pass
+        except socket.error as e:
+            if e.errno != errno.ECONNREFUSED:
+                raise
+        else:
+            logger.debug(f"Connected to {host}:{port}")
+            return True
+        finally:
+            so.close()
+        time.sleep(0.5)
+    raise socket.error("Service is unavailable: %s:%i" % addr)
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py
index 6e8d14b..02760b1 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py
@@ -8,15 +8,13 @@
 import socket
 import sys
 from abc import ABCMeta, abstractmethod
-from http.client import HTTPConnection
-from typing import Any, Callable, ClassVar, Optional, Tuple, Type, TYPE_CHECKING
+from typing import Any, Callable, ClassVar, Tuple, Type
 from urllib.parse import urljoin, urlsplit, urlunsplit
 
+from . import pytestrunner
 from .actions import actions
-from .protocol import Protocol, BaseProtocolPart
+from .protocol import Protocol, WdspecProtocol
 
-if TYPE_CHECKING:
-    from ..webdriver_server import WebDriverServer
 
 here = os.path.dirname(__file__)
 
@@ -598,22 +596,18 @@
 
 class WdspecExecutor(TestExecutor):
     convert_result = pytest_result_converter
-    protocol_cls = None  # type: ClassVar[Type[Protocol]]
+    protocol_cls = WdspecProtocol  # type: ClassVar[Type[Protocol]]
 
     def __init__(self, logger, browser, server_config, webdriver_binary,
                  webdriver_args, timeout_multiplier=1, capabilities=None,
-                 debug_info=None, environ=None, **kwargs):
-        self.do_delayed_imports()
-        TestExecutor.__init__(self, logger, browser, server_config,
-                              timeout_multiplier=timeout_multiplier,
-                              debug_info=debug_info)
+                 debug_info=None, **kwargs):
+        super().__init__(logger, browser, server_config,
+                         timeout_multiplier=timeout_multiplier,
+                         debug_info=debug_info)
         self.webdriver_binary = webdriver_binary
         self.webdriver_args = webdriver_args
         self.timeout_multiplier = timeout_multiplier
         self.capabilities = capabilities
-        self.environ = environ if environ is not None else {}
-        self.output_handler_kwargs = None
-        self.output_handler_start_kwargs = None
 
     def setup(self, runner):
         self.protocol = self.protocol_cls(self, self.browser)
@@ -629,7 +623,6 @@
         timeout = test.timeout * self.timeout_multiplier + self.extra_timeout
 
         success, data = WdspecRun(self.do_wdspec,
-                                  self.protocol.session_config,
                                   test.abs_path,
                                   timeout).run()
 
@@ -638,22 +631,25 @@
 
         return (test.result_cls(*data), [])
 
-    def do_wdspec(self, session_config, path, timeout):
+    def do_wdspec(self, path, timeout):
+        session_config = {"host": self.browser.host,
+                          "port": self.browser.port,
+                          "capabilities": self.capabilities,
+                          "webdriver": {
+                              "binary": self.webdriver_binary,
+                              "args": self.webdriver_args
+                          }}
+
         return pytestrunner.run(path,
                                 self.server_config,
                                 session_config,
                                 timeout=timeout)
 
-    def do_delayed_imports(self):
-        global pytestrunner
-        from . import pytestrunner
-
 
 class WdspecRun(object):
-    def __init__(self, func, session, path, timeout):
+    def __init__(self, func, path, timeout):
         self.func = func
         self.result = (None, None)
-        self.session = session
         self.path = path
         self.timeout = timeout
         self.result_flag = threading.Event()
@@ -676,7 +672,7 @@
 
     def _run(self):
         try:
-            self.result = True, self.func(self.session, self.path, self.timeout)
+            self.result = True, self.func(self.path, self.timeout)
         except (socket.timeout, IOError):
             self.result = False, ("CRASH", None)
         except Exception as e:
@@ -689,99 +685,6 @@
             self.result_flag.set()
 
 
-class ConnectionlessBaseProtocolPart(BaseProtocolPart):
-    def load(self, url):
-        pass
-
-    def execute_script(self, script, asynchronous=False):
-        pass
-
-    def set_timeout(self, timeout):
-        pass
-
-    def wait(self):
-        return False
-
-    def set_window(self, handle):
-        pass
-
-    def window_handles(self):
-        return []
-
-
-class ConnectionlessProtocol(Protocol):
-    implements = [ConnectionlessBaseProtocolPart]
-
-    def connect(self):
-        pass
-
-    def after_connect(self):
-        pass
-
-
-class WdspecProtocol(Protocol):
-    server_cls = None  # type: ClassVar[Optional[Type[WebDriverServer]]]
-
-    implements = [ConnectionlessBaseProtocolPart]
-
-    def __init__(self, executor, browser):
-        Protocol.__init__(self, executor, browser)
-        self.webdriver_binary = executor.webdriver_binary
-        self.webdriver_args = executor.webdriver_args
-        self.capabilities = self.executor.capabilities
-        self.session_config = None
-        self.server = None
-        self.environ = os.environ.copy()
-        self.environ.update(executor.environ)
-        self.output_handler_kwargs = executor.output_handler_kwargs
-        self.output_handler_start_kwargs = executor.output_handler_start_kwargs
-
-    def connect(self):
-        """Connect to browser via the HTTP server."""
-        self.server = self.server_cls(
-            self.logger,
-            binary=self.webdriver_binary,
-            args=self.webdriver_args,
-            env=self.environ)
-        self.server.start(block=False,
-                          output_handler_kwargs=self.output_handler_kwargs,
-                          output_handler_start_kwargs=self.output_handler_start_kwargs)
-        self.logger.info(
-            "WebDriver HTTP server listening at %s" % self.server.url)
-        self.session_config = {
-            "webdriver": {
-                "binary": self.webdriver_binary,
-                "args": self.webdriver_args
-            },
-            "host": self.server.host,
-            "port": self.server.port,
-            "capabilities": self.capabilities
-        }
-
-    def after_connect(self):
-        pass
-
-    def teardown(self):
-        if self.server is not None and self.server.is_alive():
-            self.server.stop()
-
-    def is_alive(self):
-        """Test that the connection is still alive.
-
-        Because the remote communication happens over HTTP we need to
-        make an explicit request to the remote.  It is allowed for
-        WebDriver spec tests to not have a WebDriver session, since this
-        may be what is tested.
-
-        An HTTP request to an invalid path that results in a 404 is
-        proof enough to us that the server is alive and kicking.
-        """
-        conn = HTTPConnection(self.server.host, self.server.port)
-        conn.request("HEAD", self.server.base_path + "invalid")
-        res = conn.getresponse()
-        return res.status == 404
-
-
 class CallbackHandler(object):
     """Handle callbacks from testdriver-using tests.
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py
index 431d398..524c86e 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py
@@ -3,10 +3,9 @@
 
 from urllib.parse import urljoin
 
-from .base import WdspecProtocol, WdspecExecutor, get_pages
+from .base import get_pages
 from .executorwebdriver import WebDriverProtocol, WebDriverRefTestExecutor, WebDriverRun
 from .protocol import PrintProtocolPart
-from ..webdriver_server import ChromeDriverServer
 
 here = os.path.dirname(__file__)
 
@@ -111,11 +110,3 @@
                 screenshots[i] = screenshot.split(",", 1)[1]
 
         return screenshots
-
-
-class ChromeDriverWdspecProtocol(WdspecProtocol):
-    server_cls = ChromeDriverServer
-
-
-class ChromeDriverWdspecExecutor(WdspecExecutor):
-    protocol_cls = ChromeDriverWdspecProtocol
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoredge.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoredge.py
deleted file mode 100644
index a43d9cf..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoredge.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from ..webdriver_server import EdgeDriverServer
-from .base import WdspecExecutor, WdspecProtocol
-
-
-class EdgeDriverProtocol(WdspecProtocol):
-    server_cls = EdgeDriverServer
-
-
-class EdgeDriverWdspecExecutor(WdspecExecutor):
-    protocol_cls = EdgeDriverProtocol
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoredgechromium.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoredgechromium.py
deleted file mode 100644
index ebba06a..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoredgechromium.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from ..webdriver_server import EdgeChromiumDriverServer
-from .base import WdspecExecutor, WdspecProtocol
-
-
-class EdgeChromiumDriverProtocol(WdspecProtocol):
-    server_cls = EdgeChromiumDriverServer
-
-
-class EdgeChromiumDriverWdspecExecutor(WdspecExecutor):
-    protocol_cls = EdgeChromiumDriverProtocol
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorinternetexplorer.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorinternetexplorer.py
deleted file mode 100644
index 9f6a16e..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorinternetexplorer.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from ..webdriver_server import InternetExplorerDriverServer
-from .base import WdspecExecutor, WdspecProtocol
-
-
-class InternetExplorerDriverProtocol(WdspecProtocol):
-    server_cls = InternetExplorerDriverServer
-
-
-class InternetExplorerDriverWdspecExecutor(WdspecExecutor):
-    protocol_cls = InternetExplorerDriverProtocol
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py
index 02410dfac..b1ee026 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -20,7 +20,6 @@
                    TestharnessExecutor,
                    TimedRunner,
                    WdspecExecutor,
-                   WdspecProtocol,
                    get_pages,
                    strip_server)
 from .protocol import (ActionSequenceProtocolPart,
@@ -1132,34 +1131,6 @@
             self.logger.warning(traceback.format_exc())
 
 
-class GeckoDriverProtocol(WdspecProtocol):
-    server_cls = None  # To avoid circular imports we set this at runtime
-
-
-class MarionetteWdspecExecutor(WdspecExecutor):
-    protocol_cls = GeckoDriverProtocol
-
-    def __init__(self, logger, browser, server_config, webdriver_binary,
-                 webdriver_args, timeout_multiplier=1, capabilities=None,
-                 debug_info=None, environ=None, stackfix_dir=None,
-                 symbols_path=None, leak_report_file=None, asan=False,
-                 group_metadata=None, browser_settings=None, **kwargs):
-
-        from ..browsers.firefox import GeckoDriverServer
-        super().__init__(logger, browser, server_config, webdriver_binary,
-                         webdriver_args, timeout_multiplier=timeout_multiplier,
-                         capabilities=capabilities, debug_info=debug_info,
-                         environ=environ, **kwargs)
-        self.protocol_cls.server_cls = GeckoDriverServer
-        self.output_handler_kwargs = {"stackfix_dir": stackfix_dir,
-                                      "symbols_path": symbols_path,
-                                      "asan": asan,
-                                      "leak_report_file": leak_report_file}
-        self.output_handler_start_kwargs = {"group_metadata": group_metadata}
-        self.output_handler_start_kwargs.update(browser_settings)
-
-
-
 class MarionetteCrashtestExecutor(CrashtestExecutor):
     def __init__(self, logger, browser, server_config, timeout_multiplier=1,
                  debug_info=None, capabilities=None, debug=False,
@@ -1293,3 +1264,15 @@
                 screenshots[i] = screenshot.split(",", 1)[1]
 
         return screenshots
+
+
+class MarionetteWdspecExecutor(WdspecExecutor):
+    def __init__(self, logger, browser, *args, **kwargs):
+        super().__init__(logger, browser, *args, **kwargs)
+
+        args = self.capabilities["moz:firefoxOptions"].setdefault("args", [])
+        args.extend(["--profile", self.browser.profile])
+
+        for option in ["androidPackage", "androidDeviceSerial", "env"]:
+            if hasattr(browser, option):
+                self.capabilities["moz:firefoxOptions"][option] = getattr(browser, option)
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoropera.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoropera.py
deleted file mode 100644
index 3a945a1..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executoropera.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from ..webdriver_server import OperaDriverServer
-from .base import WdspecExecutor, WdspecProtocol
-
-
-class OperaDriverProtocol(WdspecProtocol):
-    server_cls = OperaDriverServer
-
-
-class OperaDriverWdspecExecutor(WdspecExecutor):
-    protocol_cls = OperaDriverProtocol
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorsafari.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorsafari.py
deleted file mode 100644
index 86d7fcd..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorsafari.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from ..webdriver_server import SafariDriverServer
-from .base import WdspecExecutor, WdspecProtocol
-
-
-class SafariDriverProtocol(WdspecProtocol):
-    server_cls = SafariDriverServer
-
-
-class SafariDriverWdspecExecutor(WdspecExecutor):
-    protocol_cls = SafariDriverProtocol
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py
index f322421..d345cf7e 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py
@@ -11,17 +11,14 @@
 
 from tools.serve.serve import make_hosts_file
 
-from .base import (ConnectionlessProtocol,
-                   RefTestImplementation,
+from .base import (RefTestImplementation,
                    crashtest_result_converter,
                    testharness_result_converter,
                    reftest_result_converter,
-                   TimedRunner,
-                   WdspecExecutor,
-                   WdspecProtocol)
+                   TimedRunner)
 from .process import ProcessTestExecutor
+from .protocol import ConnectionlessProtocol
 from ..browsers.base import browser_command
-from ..webdriver_server import ServoDriverServer
 
 
 pytestrunner = None
@@ -280,14 +277,6 @@
                                        " ".join(self.command))
 
 
-class ServoDriverProtocol(WdspecProtocol):
-    server_cls = ServoDriverServer
-
-
-class ServoWdspecExecutor(WdspecExecutor):
-    protocol_cls = ServoDriverProtocol
-
-
 class ServoTimedRunner(TimedRunner):
     def run_func(self):
         try:
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py
index a065e3c..89428b53 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py
@@ -4,13 +4,13 @@
 import traceback
 
 from .base import (Protocol,
-                   BaseProtocolPart,
                    RefTestExecutor,
                    RefTestImplementation,
                    TestharnessExecutor,
                    TimedRunner,
                    strip_server)
-from ..webdriver_server import wait_for_service
+from .protocol import BaseProtocolPart
+from ..environment import wait_for_service
 
 webdriver = None
 ServoCommandExtensions = None
@@ -96,7 +96,7 @@
 
     def connect(self):
         """Connect to browser via WebDriver."""
-        wait_for_service((self.host, self.port), timeout=self.init_timeout)
+        wait_for_service(self.logger, self.host, self.port, timeout=self.init_timeout)
 
         self.session = webdriver.Session(self.host, self.port, extension=ServoCommandExtensions)
         self.session.start()
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorwebkit.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorwebkit.py
deleted file mode 100644
index 1a4b4fa..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorwebkit.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from ..webdriver_server import WebKitDriverServer
-from .base import WdspecExecutor, WdspecProtocol
-
-
-class WebKitDriverProtocol(WdspecProtocol):
-    server_cls = WebKitDriverServer
-
-
-class WebKitDriverWdspecExecutor(WdspecExecutor):
-    protocol_cls = WebKitDriverProtocol
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py
index 8dc54310..0eeebfc 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py
@@ -1,4 +1,5 @@
 import traceback
+from http.client import HTTPConnection
 
 from abc import ABCMeta, abstractmethod
 from typing import ClassVar, List, Type
@@ -617,3 +618,56 @@
         self.parent.base.load(urljoin(self.parent.executor.server_url("https"),
                               "/common/third_party/reftest-analyzer.xhtml#log=%s" %
                                quote(output.getvalue())))
+
+
+class ConnectionlessBaseProtocolPart(BaseProtocolPart):
+    def load(self, url):
+        pass
+
+    def execute_script(self, script, asynchronous=False):
+        pass
+
+    def set_timeout(self, timeout):
+        pass
+
+    def wait(self):
+        return False
+
+    def set_window(self, handle):
+        pass
+
+    def window_handles(self):
+        return []
+
+
+class ConnectionlessProtocol(Protocol):
+    implements = [ConnectionlessBaseProtocolPart]
+
+    def connect(self):
+        pass
+
+    def after_connect(self):
+        pass
+
+
+class WdspecProtocol(ConnectionlessProtocol):
+    implements = [ConnectionlessBaseProtocolPart]
+
+    def __init__(self, executor, browser):
+        super().__init__(executor, browser)
+
+    def is_alive(self):
+        """Test that the connection is still alive.
+
+        Because the remote communication happens over HTTP we need to
+        make an explicit request to the remote.  It is allowed for
+        WebDriver spec tests to not have a WebDriver session, since this
+        may be what is tested.
+
+        An HTTP request to an invalid path that results in a 404 is
+        proof enough to us that the server is alive and kicking.
+        """
+        conn = HTTPConnection(self.browser.host, self.browser.port)
+        conn.request("HEAD", "/invalid")
+        res = conn.getresponse()
+        return res.status == 404
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
index 74478fa..0dac77c4 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
@@ -198,7 +198,7 @@
                 self.init_timer.start()
             self.logger.debug("Starting browser with settings %r" % self.browser_settings)
             self.browser.start(group_metadata=group_metadata, **self.browser_settings)
-            self.browser_pid = self.browser.pid()
+            self.browser_pid = self.browser.pid
         except Exception:
             self.logger.warning("Failure during init %s" % traceback.format_exc())
             if self.init_timer is not None:
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/webdriver_server.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/webdriver_server.py
deleted file mode 100644
index 565e3d4..0000000
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/webdriver_server.py
+++ /dev/null
@@ -1,251 +0,0 @@
-import abc
-import errno
-import os
-import platform
-import socket
-import time
-import traceback
-from typing import ClassVar, Type
-
-import mozprocess
-
-from .browsers.base import OutputHandler
-
-
-__all__ = ["SeleniumServer", "ChromeDriverServer", "CWTChromeDriverServer",
-           "EdgeChromiumDriverServer", "OperaDriverServer",
-           "InternetExplorerDriverServer", "EdgeDriverServer",
-           "ServoDriverServer", "WebKitDriverServer", "WebDriverServer"]
-
-
-class WebDriverServer(object):
-    __metaclass__ = abc.ABCMeta
-
-    default_base_path = "/"
-    output_handler_cls = OutputHandler  # type: ClassVar[Type[OutputHandler]]
-
-    def __init__(self, logger, binary, host="127.0.0.1", port=None,
-                 base_path="", env=None, args=None):
-        if binary is None:
-            raise ValueError("WebDriver server binary must be given "
-                             "to --webdriver-binary argument")
-
-        self.logger = logger
-        self.binary = binary
-        self.host = host
-
-        if base_path == "":
-            self.base_path = self.default_base_path
-        else:
-            self.base_path = base_path
-        self.env = os.environ.copy() if env is None else env
-
-        self._output_handler = None
-        self._port = port
-        self._cmd = None
-        self._args = args if args is not None else []
-        self._proc = None
-
-    @abc.abstractmethod
-    def make_command(self):
-        """Returns the full command for starting the server process as a list."""
-
-    def start(self,
-              block=False,
-              output_handler_kwargs=None,
-              output_handler_start_kwargs=None):
-        try:
-            self._run(block, output_handler_kwargs, output_handler_start_kwargs)
-        except KeyboardInterrupt:
-            self.stop()
-
-    def _run(self, block, output_handler_kwargs, output_handler_start_kwargs):
-        if output_handler_kwargs is None:
-            output_handler_kwargs = {}
-        if output_handler_start_kwargs is None:
-            output_handler_start_kwargs = {}
-        self._cmd = self.make_command()
-        self._output_handler = self.output_handler_cls(self.logger,
-                                                       self._cmd,
-                                                       **output_handler_kwargs)
-        self._proc = mozprocess.ProcessHandler(
-            self._cmd,
-            processOutputLine=self._output_handler,
-            env=self.env,
-            storeOutput=False)
-
-        self.logger.debug("Starting WebDriver: %s" % ' '.join(self._cmd))
-        try:
-            self._proc.run()
-        except OSError as e:
-            if e.errno == errno.ENOENT:
-                raise IOError(
-                    "WebDriver executable not found: %s" % self.binary)
-            raise
-        self._output_handler.after_process_start(self._proc.pid)
-
-        self.logger.debug(
-            "Waiting for WebDriver to become accessible: %s" % self.url)
-        try:
-            wait_for_service((self.host, self.port))
-        except Exception:
-            self.logger.error(
-                "WebDriver was not accessible "
-                "within the timeout:\n%s" % traceback.format_exc())
-            raise
-        self._output_handler.start(**output_handler_start_kwargs)
-        if block:
-            self._proc.wait()
-
-    def stop(self, force=False):
-        self.logger.debug("Stopping WebDriver")
-        clean = True
-        if self.is_alive():
-            kill_result = self._proc.kill()
-            if force and kill_result != 0:
-                clean = False
-                self._proc.kill(9)
-        success = not self.is_alive()
-        if success and self._output_handler is not None:
-            # Only try to do output post-processing if we managed to shut down
-            self._output_handler.after_process_stop(clean)
-            self._output_handler = None
-        return success
-
-    def is_alive(self):
-        return hasattr(self._proc, "proc") and self._proc.poll() is None
-
-    @property
-    def pid(self):
-        if self._proc is not None:
-            return self._proc.pid
-
-    @property
-    def url(self):
-        return "http://%s:%i%s" % (self.host, self.port, self.base_path)
-
-    @property
-    def port(self):
-        if self._port is None:
-            self._port = get_free_port()
-        return self._port
-
-
-class SeleniumServer(WebDriverServer):
-    default_base_path = "/wd/hub"
-
-    def make_command(self):
-        return ["java", "-jar", self.binary, "-port", str(self.port)] + self._args
-
-
-class ChromeDriverServer(WebDriverServer):
-    def make_command(self):
-        return [self.binary,
-                cmd_arg("port", str(self.port)),
-                cmd_arg("url-base", self.base_path) if self.base_path else "",
-                cmd_arg("enable-chrome-logs")] + self._args
-
-
-class CWTChromeDriverServer(WebDriverServer):
-    def make_command(self):
-        return [self.binary,
-                "--port=%s" % str(self.port)] + self._args
-
-
-class EdgeChromiumDriverServer(WebDriverServer):
-    def make_command(self):
-        return [self.binary,
-                cmd_arg("port", str(self.port)),
-                cmd_arg("url-base", self.base_path) if self.base_path else ""] + self._args
-
-
-class EdgeDriverServer(WebDriverServer):
-    def make_command(self):
-        return [self.binary,
-                "--port=%s" % str(self.port)] + self._args
-
-
-class OperaDriverServer(ChromeDriverServer):
-    pass
-
-class InternetExplorerDriverServer(WebDriverServer):
-    def make_command(self):
-        return [self.binary,
-                "--port=%s" % str(self.port)] + self._args
-
-
-class SafariDriverServer(WebDriverServer):
-    def make_command(self):
-        return [self.binary,
-                "--port=%s" % str(self.port)] + self._args
-
-
-class ServoDriverServer(WebDriverServer):
-    def __init__(self, logger, binary="servo", binary_args=None, host="127.0.0.1",
-                 port=None, env=None, args=None):
-        env = env if env is not None else os.environ.copy()
-        env["RUST_BACKTRACE"] = "1"
-        WebDriverServer.__init__(self, logger, binary,
-                                 host=host,
-                                 port=port,
-                                 env=env,
-                                 args=args)
-        self.binary_args = binary_args
-
-    def make_command(self):
-        command = [self.binary,
-                   "--webdriver=%s" % self.port,
-                   "--hard-fail",
-                   "--headless"] + self._args
-        if self.binary_args:
-            command += self.binary_args
-        return command
-
-
-class WebKitDriverServer(WebDriverServer):
-    def make_command(self):
-        return [self.binary, "--port=%s" % str(self.port)] + self._args
-
-
-def cmd_arg(name, value=None):
-    prefix = "-" if platform.system() == "Windows" else "--"
-    rv = prefix + name
-    if value is not None:
-        rv += "=" + value
-    return rv
-
-
-def get_free_port():
-    """Get a random unbound port"""
-    while True:
-        s = socket.socket()
-        try:
-            s.bind(("127.0.0.1", 0))
-        except OSError:
-            continue
-        else:
-            return s.getsockname()[1]
-        finally:
-            s.close()
-
-
-def wait_for_service(addr, timeout=60):
-    """Waits until network service given as a tuple of (host, port) becomes
-    available or the `timeout` duration is reached, at which point
-    ``socket.timeout`` is raised."""
-    end = time.time() + timeout
-    while end > time.time():
-        so = socket.socket()
-        try:
-            so.connect(addr)
-        except socket.timeout:
-            pass
-        except OSError as e:
-            if e.errno != errno.ECONNREFUSED:
-                raise
-        else:
-            return True
-        finally:
-            so.close()
-        time.sleep(0.5)
-    raise socket.timeout("Service is unavailable: %s:%i" % addr)
diff --git a/tools/crates/lib/build_rule.py b/tools/crates/lib/build_rule.py
index 629363f..2460c5c783 100644
--- a/tools/crates/lib/build_rule.py
+++ b/tools/crates/lib/build_rule.py
@@ -213,18 +213,22 @@
         # Add these if, in the future, we want to explicitly mark each
         # third-party crate instead of doing so from the GN template.
         #
-        #self._write(indent,
+        # self._write(indent,
         #  "configs -= [ \"//build/config/compiler:chromium_code\" ]")
-        #self._write(indent,
+        # self._write(indent,
         #  "configs += [ \"//build/config/compiler:no_chromium_code\" ]")
 
         build_rule_usage = build_rule.get_usage(usage)
 
-        if build_rule_usage.deps:
+        for (deps, gn_name) in [(build_rule_usage.deps, "deps"),
+                                (build_rule_usage.build_deps, "build_deps"),
+                                (build_rule_usage.dev_deps, "test_deps")]:
+            if not deps:
+                continue
             global_deps = []
             specific_deps = []
 
-            for d in build_rule_usage.deps:
+            for d in deps:
                 compile_modes = d["compile_modes"]
                 if compile_modes.is_always_true(
                 ) or compile_modes == build_rule_usage.used_on_archs:
@@ -233,7 +237,7 @@
                     specific_deps += [d]
 
             if global_deps or specific_deps:
-                self._write(indent, "deps = [")
+                self._write(indent, "{} = [".format(gn_name))
             for d in global_deps:
                 self._write(indent + 2, "\"{}\",".format(d["deppath"]))
             if global_deps or specific_deps:
@@ -281,14 +285,18 @@
                     self._write(indent + 2, "\"{}\",".format(o))
                 self._write(indent, "]")
 
-    def generate_gn(self, args: argparse.Namespace) -> str:
+    def generate_gn(self, args: argparse.Namespace, copyright_year: str) -> str:
         """Generate a BUILD.gn file contents.
 
         The BuildRule has all data needed to construct a BUILD file. This
         generates a BUILD.gn file.
+
+        Args:
+            args: The command-line arguments.
+            copyright_year: The year as a string.
         """
         self.out = []
-        self._write(0, consts.GN_HEADER)
+        self._write(0, consts.GN_HEADER.format(year=copyright_year))
 
         for bin in self.bins:
             self._write(0, "cargo_crate(\"{}\") {{".format(bin["name"]))
@@ -317,9 +325,9 @@
                     indent,
                     "cargo_crate(\"{}\") {{".format(usage.gn_target_name()))
                 self._write(indent + 2,
-                  "crate_name = \"{}\"".format(
-                      common.crate_name_normalized(
-                          self.crate_name)))  # yapf: disable
+                            "crate_name = \"{}\"".format(
+                                common.crate_name_normalized(
+                                    self.crate_name)))  # yapf: disable
                 self._write(indent + 2, "epoch = \"{}\"".format(self.epoch))
                 self._write(indent + 2,
                             "crate_type = \"{}\"".format(self.lib_type))
@@ -327,9 +335,9 @@
                     for c in consts.GN_VISIBILITY_COMMENT.split("\n"):
                         self._write(indent + 2, c)
                     self._write(indent + 2,
-                      "visibility = [ \"{}\" ]".format(
-                          common.gn_third_party_path(
-                              rel_path=["*"])))  # yapf: disable
+                                "visibility = [ \"{}\" ]".format(
+                                    common.gn_third_party_path(
+                                        rel_path=["*"])))  # yapf: disable
                 if usage == cargo.CrateUsage.FOR_TESTS:
                     self._write(indent + 2, "testonly = \"true\"")
                 self._write(indent + 2,
diff --git a/tools/crates/lib/consts.py b/tools/crates/lib/consts.py
index 986829c..e26e74f 100644
--- a/tools/crates/lib/consts.py
+++ b/tools/crates/lib/consts.py
@@ -5,7 +5,6 @@
 
 import os
 import re
-from datetime import datetime
 
 CRATES_IO_VIEW = "https://crates.io/crates/{crate}"
 CRATES_IO_DOWNLOAD = "https://static.crates.io/crates/{crate}/{crate}-{version}.crate"
@@ -68,7 +67,7 @@
 version = "0.0.0"
 """
 
-# Header at the top of BUILD.gn files. The %YEAR% is substituted with the
+# Header at the top of BUILD.gn files. The {year} is substituted with the
 # appropriate year.
 GN_HEADER = \
 """# Copyright {year} The Chromium Authors. All rights reserved.
@@ -77,11 +76,14 @@
 
 import("//build/rust/cargo_crate.gni")
 
-""".format(year=str(datetime.now().year))
+"""
+_GN_HEADER_YEAR = r"^# Copyright( \(c\))? (?P<year>[0-9]+) " \
+    r"The Chromium Authors\. All rights reserved\."
+GN_HEADER_YEAR_REGEX = re.compile(_GN_HEADER_YEAR)
 
 # Comment on the skip_unit_tests field in BUILD.gn file output.
 GN_TESTS_COMMENT = \
-"""# Unit tests skipped. Generate with --with-tests to include them"""
+"""# Unit tests skipped. Generate with --with-tests to include them."""
 
 # Comment on the visibility field in BUILD.gn file output.
 GN_VISIBILITY_COMMENT = \
diff --git a/tools/crates/lib/gen.py b/tools/crates/lib/gen.py
index 2e4fb9a..2e22c830 100644
--- a/tools/crates/lib/gen.py
+++ b/tools/crates/lib/gen.py
@@ -13,6 +13,7 @@
 
 from typing import Iterator
 from contextlib import contextmanager
+from datetime import datetime
 from pprint import pprint
 import argparse
 import tempfile
@@ -264,12 +265,17 @@
             build_rule.buildrs_usage.used_on_archs or \
             build_rule.test_usage.used_on_archs
 
+        copyright_year = _get_copyright_year(
+            common.os_crate_version_dir(crate_key.name,
+                                        crate_key.epoch,
+                                        rel_path=["BUILD.gn"]))
         with open(
                 common.os_crate_version_dir(crate_key.name,
                                             crate_key.epoch,
                                             rel_path=["BUILD.gn"]),
                 "w") as build_file:
-            build_file.write(_run_gn_format(build_rule.generate_gn(args)))
+            build_file.write(
+                _run_gn_format(build_rule.generate_gn(args, copyright_year)))
         num_done += 1
     common.print_same_line("Generating BUILD.gn for crates {}/{} ".format(
         num_done, num_total),
@@ -277,6 +283,18 @@
                            done=True)
 
 
+def _get_copyright_year(path: str) -> str:
+    try:
+        with open(path, "r") as file:
+            top_line = file.readline()
+            m = consts.GN_HEADER_YEAR_REGEX.search(top_line)
+            if m:
+                return m.group("year")
+    except FileNotFoundError:
+        pass
+    return str(datetime.now().year)
+
+
 def _construct_build_data_from_3p_crates(args: argparse.Namespace) -> BuildData:
     """Read the `third_party.toml` data and populate a BuildData from it.
 
@@ -306,6 +324,15 @@
                 " '{}', " "found '{}', did you mean '{}'?".format(
                     dep, version, epoch)
 
+            # Verify that a crate is only listed once.
+            for other_toml_key in [k for k in TOML_DEPS_KEYS if k != toml_key]:
+                if other_toml_key not in toml_3p:
+                    continue
+                assert not dep in toml_3p[other_toml_key], \
+                    "A crate may only appear in one section of " \
+                    "third_party.toml, but '{}' appears more than " \
+                    "once.".format(dep)
+
     # For every crate in third_party, we will generate a patch to redirect
     # crates.io to that directory, so that if we have local changes to the
     # Cargo.toml files, running `cargo tree` will see them. To do this we
@@ -366,15 +393,15 @@
                                 cargo.CrateUsage.FOR_BUILDRS,
                                 True,
                                 depth=1)
-        if args.with_tests:
-            last_printed = common.print_same_line(
-                "Collecting top-level dev-dependencies.", last_printed)
-            _collect_deps_for_crate(args,
-                                    cargo_toml_path,
-                                    build_data_set,
-                                    cargo.CrateUsage.FOR_TESTS,
-                                    True,
-                                    depth=1)
+
+        last_printed = common.print_same_line(
+            "Collecting top-level dev-dependencies.", last_printed)
+        _collect_deps_for_crate(args,
+                                cargo_toml_path,
+                                build_data_set,
+                                cargo.CrateUsage.FOR_TESTS,
+                                True,
+                                depth=1)
 
     # Now we have enough to build our first-party code, from prebuilts of the
     # dependencies. But we don't have enough to build each dependency. We have
@@ -392,11 +419,6 @@
         crate_name = crate_key.name
         crate_epoch = crate_key.epoch
 
-        last_printed = common.print_same_line(
-            "Collecting build and dev dependencies: {}/{} {} v{}".format(
-                1 + num_done, 1 + num_done + len(crate_keys_left), crate_name,
-                crate_epoch), last_printed)
-
         orig_cargo_toml_path = common.os_crate_cargo_dir(
             crate_name, crate_epoch, rel_path=["Cargo.toml"])
 
@@ -411,6 +433,10 @@
                 list_of_3p_cargo_toml,
                 orig_toml_path=orig_cargo_toml_path)
 
+            last_printed = common.print_same_line(
+                "Collecting normal dependencies: {}/{} {} v{}".format(
+                    1 + num_done, 1 + num_done + len(crate_keys_left),
+                    crate_name, crate_epoch), last_printed)
             new_keys = _collect_deps_for_crate(args,
                                                tmp_cargo_toml_path,
                                                build_data_set,
@@ -419,6 +445,11 @@
                                                crate_key=crate_key,
                                                depth=1)
             crate_keys_left.update(new_keys)
+
+            last_printed = common.print_same_line(
+                "Collecting build dependencies: {}/{} {} v{}".format(
+                    1 + num_done, 1 + num_done + len(crate_keys_left),
+                    crate_name, crate_epoch), last_printed)
             new_keys = _collect_deps_for_crate(args,
                                                tmp_cargo_toml_path,
                                                build_data_set,
@@ -427,7 +458,15 @@
                                                crate_key=crate_key,
                                                depth=1)
             crate_keys_left.update(new_keys)
-            if args.with_tests:
+            find_test_deps = args.with_tests
+            with build_data_set.for_tests.per_crate(crate_key) as per_crate:
+                if per_crate.for_first_party:
+                    find_test_deps = True
+            if find_test_deps:
+                last_printed = common.print_same_line(
+                    "Collecting test dependencies: {}/{} {} v{}".format(
+                        1 + num_done, 1 + num_done + len(crate_keys_left),
+                        crate_name, crate_epoch), last_printed)
                 new_keys = _collect_deps_for_crate(args,
                                                    tmp_cargo_toml_path,
                                                    build_data_set,
@@ -438,11 +477,10 @@
                 crate_keys_left.update(new_keys)
 
         num_done += 1
-    common.print_same_line(
-        "Collecting build and dev dependencies: {}/{} ".format(
-            num_done, num_done),
-        last_printed,
-        done=True)
+    common.print_same_line("Collecting dependencies: {}/{} ".format(
+        num_done, num_done),
+                           last_printed,
+                           done=True)
 
     if args.verbose:
         pprint(build_data_set)
@@ -658,6 +696,7 @@
             targetted_deps += list(target_data["dependencies"].items())
         # Convert the list of (crate name, dependency data) into a more useful
         # list of `cargo.CrateKey`s.
+
         def version_from_maybe_dict(maybe_dict: dict | str) -> str:
             if type(maybe_dict) is dict:
                 return maybe_dict["version"]
@@ -741,9 +780,14 @@
     dep_features = m.group("features").split(",") if m.group("features") else []
     dep_isprocmacro = bool(m.group("isprocmacro"))
 
-    parse_ext = is_third_party_toml and dep_name in cargo_toml["dependencies"]
+    parse_ext_key = None
+    if is_third_party_toml:
+        parse_ext_key = "dependencies" if dep_name in cargo_toml.get(
+            "dependencies",
+            {}) else "dev-dependencies" if dep_name in cargo_toml.get(
+                "dev-dependencies", {}) else None
 
-    if not parse_ext:
+    if not parse_ext_key:
         # Extensions from third_party.toml that aren't in normal Cargo.toml,
         # these are the defaults for stuff outside of third_party.toml.
         for_first_party_code = False
@@ -753,13 +797,12 @@
         build_script_outputs = set()
         # Usually the dependency value is just a version number, but if it
         # is a dict, then it can declare values for extensions.
-        extensions = cargo_toml["dependencies"][dep_name]
+        extensions = cargo_toml[parse_ext_key][dep_name]
         if type(extensions) is dict:
             build_script_outputs = set(
                 extensions.get("build-script-outputs", build_script_outputs))
             for_first_party_code = extensions.get("allow-first-party-usage",
                                                   for_first_party_code)
-
     return CargoTreeDependency(dep_key,
                                full_version=dep_version,
                                crate_path=dep_path,
@@ -855,8 +898,8 @@
         new_keys.add(dep.key)
 
     # Add outgoing edges from the parent crate to the dependency crate. If the
-    # parent is third_party.toml, then the crate key will not exist, as it's not
-    # actually a crate, and we don't need to set up any edges.
+    # parent is the virtual third_party.toml crate, then the crate key will not
+    # exist, and we don't need to set up any edges.
     if not parent_crate_key:
         return
 
@@ -878,7 +921,7 @@
                             build_data_set: BuildData,
                             usage: cargo.CrateUsage,
                             is_third_party_toml: bool,
-                            crate_key: str = None,
+                            crate_key: cargo.CrateKey = None,
                             depth: int = None) -> set[cargo.CrateKey]:
     """Runs `cargo tree` and collects all dependency data for a specific crate.
 
@@ -918,8 +961,9 @@
     # the dependency graph for each.
     first = True
     for output_type in cargo.CrateBuildOutput:
-        if output_type == cargo.CrateBuildOutput.TESTS and not args.with_tests:
-            continue
+        if output_type == cargo.CrateBuildOutput.TESTS:
+            if not args.with_tests and not is_third_party_toml:
+                continue
         for target_arch in arch_specific.archs_to_test():
             if is_third_party_toml:
                 # For the root third_party.toml crate, nothing can depend on it,
diff --git a/tools/crates/lib/gen_test.py b/tools/crates/lib/gen_test.py
index 41eb5a2c..bf6625c 100644
--- a/tools/crates/lib/gen_test.py
+++ b/tools/crates/lib/gen_test.py
@@ -3,6 +3,10 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+from datetime import datetime
+import io
+import re
+import tempfile
 import toml
 import unittest
 
@@ -57,7 +61,16 @@
     def all_archs(self):
         return set(compiler._RUSTC_ARCH_TO_BUILD_CONDITION.keys())
 
+    def make_args(self):
+        class Args:
+            pass
+
+        args = Args
+        args.verbose = False
+        return args
+
     def test_parse_cargo_tree_dependency_line(self):
+        args = self.make_args()
         lines = CARGO_TREE.split("\n")
 
         # Here we are simulating `cargo tree` on a third-party Cargo.toml file,
@@ -65,47 +78,55 @@
         # is_third_party_toml, and we can give an empty parsed toml file as it
         # won't be used then.
 
-        #cxx v1.0.56 (/path/to/chromium/src/third_party/rust/cxx/v1/crate)
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[0])
+        # cxx v1.0.56 (/path/to/chromium/src/third_party/rust/cxx/v1/crate)
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[0])
         self.assertEqual(r, None)  # not a dependency
 
-        #├── cxxbridge-macro v1.0.56 (proc-macro)
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[1])
+        # ├── cxxbridge-macro v1.0.56 (proc-macro)
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[1])
         expected = gen.CargoTreeDependency(cargo.CrateKey(
             "cxxbridge-macro", "1.0.56"),
+                                           full_version="1.0.56",
                                            is_proc_macro=True)
         self.assertEqual(r, expected)
 
-        #│   ├── proc-macro2 v1.0.32 default,proc-macro,span-locations
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[2])
+        # │   ├── proc-macro2 v1.0.32 default,proc-macro,span-locations
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[2])
         expected = gen.CargoTreeDependency(
             cargo.CrateKey("proc-macro2", "1.0.32"),
+            full_version="1.0.32",
             features=["default", "proc-macro", "span-locations"])
         self.assertEqual(r, expected)
 
-        #│   │   └── unicode-xid v0.2.2 default
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[3])
+        # │   │   └── unicode-xid v0.2.2 default
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[3])
         expected = gen.CargoTreeDependency(cargo.CrateKey(
             "unicode-xid", "0.2.2"),
+                                           full_version="0.2.2",
                                            features=["default"])
         self.assertEqual(r, expected)
 
-        #│   ├── quote v1.0.10 (/path/to/chromium/src/third_party/rust/quote/v1/crate) default,proc-macro
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[4])
-        expected = gen.CargoTreeDependency(cargo.CrateKey("quote", "1.0.10"),
-                                           features=["default", "proc-macro"])
+        # │   ├── quote v1.0.10 (/path/to/chromium/src/third_party/rust/quote/v1/crate) default,proc-macro
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[4])
+        expected = gen.CargoTreeDependency(
+            cargo.CrateKey("quote", "1.0.10"),
+            full_version="1.0.10",
+            crate_path="/path/to/chromium/src/third_party/rust/quote/v1/crate",
+            features=["default", "proc-macro"])
         self.assertEqual(r, expected)
 
-        #│   │   └── proc-macro2 v1.0.32 default,proc-macro,span-locations (*)
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[5])
+        # │   │   └── proc-macro2 v1.0.32 default,proc-macro,span-locations (*)
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[5])
         expected = gen.CargoTreeDependency(
             cargo.CrateKey("proc-macro2", "1.0.32"),
+            full_version="1.0.32",
             features=["default", "proc-macro", "span-locations"])
         self.assertEqual(r, expected)
 
-        #│   └── syn v1.0.81 clone-impls,default,derive,full,parsing,printing,proc-macro,quote
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[6])
+        # │   └── syn v1.0.81 clone-impls,default,derive,full,parsing,printing,proc-macro,quote
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[6])
         expected = gen.CargoTreeDependency(cargo.CrateKey("syn", "1.0.81"),
+                                           full_version="1.0.81",
                                            features=[
                                                "clone-impls", "default",
                                                "derive", "full", "parsing",
@@ -113,32 +134,38 @@
                                            ])
         self.assertEqual(r, expected)
 
-        #│       ├── proc-macro2 v1.0.32 default,proc-macro,span-locations (*)
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[7])
+        # │       ├── proc-macro2 v1.0.32 default,proc-macro,span-locations (*)
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[7])
         expected = gen.CargoTreeDependency(
             cargo.CrateKey("proc-macro2", "1.0.32"),
+            full_version="1.0.32",
             features=["default", "proc-macro", "span-locations"])
         self.assertEqual(r, expected)
 
-        #│       ├── quote v1.0.10 default,proc-macro (*)
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[8])
+        # │       ├── quote v1.0.10 default,proc-macro (*)
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[8])
         expected = gen.CargoTreeDependency(cargo.CrateKey("quote", "1.0.10"),
+                                           full_version="1.0.10",
                                            features=["default", "proc-macro"])
         self.assertEqual(r, expected)
 
-        #│       └── unicode-xid v0.2.2
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[9])
-        expected = gen.CargoTreeDependency(
-            cargo.CrateKey("unicode-xid", "0.2.2"))
+        # │       └── unicode-xid v0.2.2
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False, lines[9])
+        expected = gen.CargoTreeDependency(cargo.CrateKey(
+            "unicode-xid", "0.2.2"),
+                                           full_version="0.2.2")
         self.assertEqual(r, expected)
 
-        #└── link-cplusplus v1.0.5 default
-        r = gen._parse_cargo_tree_dependency_line(dict(), False, lines[10])
+        # └── link-cplusplus v1.0.5 default
+        r = gen._parse_cargo_tree_dependency_line(args, dict(), False,
+                                                  lines[10])
         d = gen.CargoTreeDependency(cargo.CrateKey("link-cplusplus", "1.0.5"),
+                                    full_version="1.0.5",
                                     features=["default"])
         self.assertEqual(r, d)
 
     def test_third_party_toml(self):
+        args = self.make_args()
         THIRD_PARTY_TOML = """
 # This dependency has no extensions
 [dependencies]
@@ -160,9 +187,11 @@
         toml_content = toml.loads(THIRD_PARTY_TOML)
 
         line = "├── cxxbridge-macro v1.0.56 (proc-macro)"
-        r = gen._parse_cargo_tree_dependency_line(toml_content, True, line)
+        r = gen._parse_cargo_tree_dependency_line(args, toml_content, True,
+                                                  line)
         d = gen.CargoTreeDependency(
             cargo.CrateKey("cxxbridge-macro", "1.0.56"),
+            full_version="1.0.56",
             is_proc_macro=True,
             # Deps from third_party.toml are visible to first-party code by
             # default.
@@ -170,9 +199,11 @@
         self.assertEqual(r, d)
 
         line = "├── link-cplusplus v1.0.5 default"
-        r = gen._parse_cargo_tree_dependency_line(toml_content, True, line)
+        r = gen._parse_cargo_tree_dependency_line(args, toml_content, True,
+                                                  line)
         d = gen.CargoTreeDependency(
             cargo.CrateKey("link-cplusplus", "1.0.5"),
+            full_version="1.0.5",
             features=["default"],
             is_for_first_party_code=True,
             # link-cplusplus has build script outputs listed in our
@@ -181,9 +212,72 @@
         self.assertEqual(r, d)
 
         line = "└── syn v1.0.81 clone-impls,default"
-        r = gen._parse_cargo_tree_dependency_line(toml_content, True, line)
+        r = gen._parse_cargo_tree_dependency_line(args, toml_content, True,
+                                                  line)
         d = gen.CargoTreeDependency(
             cargo.CrateKey("syn", "1.0.81"),
+            full_version="1.0.81",
+            features=["clone-impls", "default"],
+            # Deps from third_party.toml are visible to first-party code unless
+            # they opt out explicitly, which our syn dependency has done.
+            is_for_first_party_code=False)
+        self.assertEqual(r, d)
+
+    def test_third_party_toml_dev_deps(self):
+        args = self.make_args()
+        THIRD_PARTY_TOML = """
+[dependencies]
+# Nothing. We're testing dev-dependencies here.
+
+[dev-dependencies]
+cxxbridge-macro = "1"
+
+# This dependency has an extension, and is default-visible to first-party code.
+[dev-dependencies.link-cplusplus]
+build-script-outputs = [ "src/link.rs", "src/cplusplus.rs" ]
+
+# This dependency is not visible to first-party code thanks to the extension.
+[dev-dependencies.syn]
+allow-first-party-usage = false
+"""
+
+        # Here we are simulating parsing our special third_party.toml file, so
+        # we need to present the contents of that file to the
+        # _parse_cargo_tree_dependency_line() function, in order for it to look
+        # for extensions.
+        toml_content = toml.loads(THIRD_PARTY_TOML)
+
+        line = "├── cxxbridge-macro v1.0.56 (proc-macro)"
+        r = gen._parse_cargo_tree_dependency_line(args, toml_content, True,
+                                                  line)
+        d = gen.CargoTreeDependency(
+            cargo.CrateKey("cxxbridge-macro", "1.0.56"),
+            full_version="1.0.56",
+            is_proc_macro=True,
+            # Deps from third_party.toml are visible to first-party code by
+            # default.
+            is_for_first_party_code=True)
+        self.assertEqual(r, d)
+
+        line = "├── link-cplusplus v1.0.5 default"
+        r = gen._parse_cargo_tree_dependency_line(args, toml_content, True,
+                                                  line)
+        d = gen.CargoTreeDependency(
+            cargo.CrateKey("link-cplusplus", "1.0.5"),
+            full_version="1.0.5",
+            features=["default"],
+            is_for_first_party_code=True,
+            # link-cplusplus has build script outputs listed in our
+            # third_party.toml.
+            build_script_outputs={"src/link.rs", "src/cplusplus.rs"})
+        self.assertEqual(r, d)
+
+        line = "└── syn v1.0.81 clone-impls,default"
+        r = gen._parse_cargo_tree_dependency_line(args, toml_content, True,
+                                                  line)
+        d = gen.CargoTreeDependency(
+            cargo.CrateKey("syn", "1.0.81"),
+            full_version="1.0.81",
             features=["clone-impls", "default"],
             # Deps from third_party.toml are visible to first-party code unless
             # they opt out explicitly, which our syn dependency has done.
@@ -596,3 +690,19 @@
                 self.assertSetEqual(crate.deps[o].all_deps(),
                                     set(),
                                     msg="For output type {}".format(o))
+
+    def test_copyright_year(self):
+        modern = b"# Copyright 2001 The Chromium Authors. All rights reserved."
+        with tempfile.NamedTemporaryFile() as f:
+            f.write(modern)
+            f.flush()
+            self.assertEqual(gen._get_copyright_year(f.name), "2001")
+
+        ancient = b"# Copyright (c) 2001 The Chromium Authors. All rights reserved."
+        with tempfile.NamedTemporaryFile() as f:
+            f.write(ancient)
+            f.flush()
+            self.assertEqual(gen._get_copyright_year(f.name), "2001")
+
+        self.assertEqual(gen._get_copyright_year("/file/does/not/exist"),
+                         str(datetime.now().year))
diff --git a/tools/json_schema_compiler/manifest_parse_util.h b/tools/json_schema_compiler/manifest_parse_util.h
index a4bbcfb..3ded061a 100644
--- a/tools/json_schema_compiler/manifest_parse_util.h
+++ b/tools/json_schema_compiler/manifest_parse_util.h
@@ -105,7 +105,7 @@
     return false;
 
   bool result = json_schema_compiler::util::PopulateArrayFromList(
-      value->GetList(), out_ptr, error);
+      value->GetListDeprecated(), out_ptr, error);
   if (!result) {
     DCHECK(error_path_reversed);
     DCHECK(error_path_reversed->empty());
diff --git a/tools/json_schema_compiler/test/choices_unittest.cc b/tools/json_schema_compiler/test/choices_unittest.cc
index 4f95d23..6a76df44 100644
--- a/tools/json_schema_compiler/test/choices_unittest.cc
+++ b/tools/json_schema_compiler/test/choices_unittest.cc
@@ -26,12 +26,12 @@
 TEST(JsonSchemaCompilerChoicesTest, TakesIntegersParamsCreate) {
   {
     std::unique_ptr<TakesIntegers::Params> params(TakesIntegers::Params::Create(
-        List(std::make_unique<base::Value>(true))->GetList()));
+        List(std::make_unique<base::Value>(true))->GetListDeprecated()));
     EXPECT_FALSE(params);
   }
   {
     std::unique_ptr<TakesIntegers::Params> params(TakesIntegers::Params::Create(
-        List(std::make_unique<base::Value>(6))->GetList()));
+        List(std::make_unique<base::Value>(6))->GetListDeprecated()));
     ASSERT_TRUE(params);
     EXPECT_FALSE(params->nums.as_integers);
     EXPECT_EQ(6, *params->nums.as_integer);
@@ -41,7 +41,7 @@
         List(List(std::make_unique<base::Value>(2),
                   std::make_unique<base::Value>(6),
                   std::make_unique<base::Value>(8)))
-            ->GetList()));
+            ->GetListDeprecated()));
     ASSERT_TRUE(params);
     ASSERT_TRUE(params->nums.as_integers);
     EXPECT_EQ(Vector(2, 6, 8), *params->nums.as_integers);
@@ -53,7 +53,7 @@
     std::unique_ptr<choices::ObjectWithChoices::Params> params(
         choices::ObjectWithChoices::Params::Create(
             List(Dictionary("strings", std::make_unique<base::Value>("asdf")))
-                ->GetList()));
+                ->GetListDeprecated()));
     ASSERT_TRUE(params);
     EXPECT_FALSE(params->string_info.strings.as_strings);
     EXPECT_EQ("asdf", *params->string_info.strings.as_string);
@@ -64,7 +64,7 @@
         choices::ObjectWithChoices::Params::Create(
             List(Dictionary("strings", std::make_unique<base::Value>("asdf"),
                             "integers", std::make_unique<base::Value>(6)))
-                ->GetList()));
+                ->GetListDeprecated()));
     ASSERT_TRUE(params);
     EXPECT_FALSE(params->string_info.strings.as_strings);
     EXPECT_EQ("asdf", *params->string_info.strings.as_string);
@@ -84,7 +84,8 @@
     std::unique_ptr<base::ListValue> params_value(new base::ListValue());
     params_value->Append(std::move(object_param));
     std::unique_ptr<choices::ObjectWithChoices::Params> params(
-        choices::ObjectWithChoices::Params::Create(params_value->GetList()));
+        choices::ObjectWithChoices::Params::Create(
+            params_value->GetListDeprecated()));
     EXPECT_FALSE(params.get());
   }
   {
@@ -94,7 +95,8 @@
     std::unique_ptr<base::ListValue> params_value(new base::ListValue());
     params_value->Append(std::move(object_param));
     std::unique_ptr<choices::ObjectWithChoices::Params> params(
-        choices::ObjectWithChoices::Params::Create(params_value->GetList()));
+        choices::ObjectWithChoices::Params::Create(
+            params_value->GetListDeprecated()));
     EXPECT_FALSE(params.get());
   }
   {
@@ -103,7 +105,8 @@
     std::unique_ptr<base::ListValue> params_value(new base::ListValue());
     params_value->Append(std::move(object_param));
     std::unique_ptr<choices::ObjectWithChoices::Params> params(
-        choices::ObjectWithChoices::Params::Create(params_value->GetList()));
+        choices::ObjectWithChoices::Params::Create(
+            params_value->GetListDeprecated()));
     EXPECT_FALSE(params.get());
   }
 }
diff --git a/tools/json_schema_compiler/test/crossref_unittest.cc b/tools/json_schema_compiler/test/crossref_unittest.cc
index 96aaab4..1964280 100644
--- a/tools/json_schema_compiler/test/crossref_unittest.cc
+++ b/tools/json_schema_compiler/test/crossref_unittest.cc
@@ -57,7 +57,8 @@
   auto params_value = std::make_unique<base::ListValue>();
   params_value->Append(CreateTestTypeValue());
   std::unique_ptr<crossref::TestTypeOptionalParam::Params> params(
-      crossref::TestTypeOptionalParam::Params::Create(params_value->GetList()));
+      crossref::TestTypeOptionalParam::Params::Create(
+          params_value->GetListDeprecated()));
   EXPECT_TRUE(params.get());
   EXPECT_TRUE(params->test_type.get());
   EXPECT_TRUE(
@@ -71,7 +72,8 @@
   test_type_value->RemoveKey("number");
   params_value->Append(std::move(test_type_value));
   std::unique_ptr<crossref::TestTypeOptionalParam::Params> params(
-      crossref::TestTypeOptionalParam::Params::Create(params_value->GetList()));
+      crossref::TestTypeOptionalParam::Params::Create(
+          params_value->GetListDeprecated()));
   EXPECT_FALSE(params.get());
 }
 
@@ -95,7 +97,8 @@
     param_object_value->SetBoolean("boolean", true);
     params_value->Append(std::move(param_object_value));
     std::unique_ptr<crossref::TestTypeInObject::Params> params(
-        crossref::TestTypeInObject::Params::Create(params_value->GetList()));
+        crossref::TestTypeInObject::Params::Create(
+            params_value->GetListDeprecated()));
     EXPECT_TRUE(params.get());
     EXPECT_TRUE(params->param_object.test_type.get());
     EXPECT_TRUE(params->param_object.boolean);
@@ -108,7 +111,8 @@
     param_object_value->SetBoolean("boolean", true);
     params_value->Append(std::move(param_object_value));
     std::unique_ptr<crossref::TestTypeInObject::Params> params(
-        crossref::TestTypeInObject::Params::Create(params_value->GetList()));
+        crossref::TestTypeInObject::Params::Create(
+            params_value->GetListDeprecated()));
     EXPECT_TRUE(params.get());
     EXPECT_FALSE(params->param_object.test_type.get());
     EXPECT_TRUE(params->param_object.boolean);
@@ -120,7 +124,8 @@
     param_object_value->SetBoolean("boolean", true);
     params_value->Append(std::move(param_object_value));
     std::unique_ptr<crossref::TestTypeInObject::Params> params(
-        crossref::TestTypeInObject::Params::Create(params_value->GetList()));
+        crossref::TestTypeInObject::Params::Create(
+            params_value->GetListDeprecated()));
     EXPECT_FALSE(params.get());
   }
   {
@@ -130,7 +135,8 @@
         "testType", base::Value::FromUniquePtrValue(CreateTestTypeValue()));
     params_value->Append(std::move(param_object_value));
     std::unique_ptr<crossref::TestTypeInObject::Params> params(
-        crossref::TestTypeInObject::Params::Create(params_value->GetList()));
+        crossref::TestTypeInObject::Params::Create(
+            params_value->GetListDeprecated()));
     EXPECT_FALSE(params.get());
   }
 }
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 229fe0c..31d0c2cb 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -484,10 +484,8 @@
       'GPU FYI Win x64 DX12 Vulkan Builder (dbg)': 'gpu_fyi_tests_dx12vk_debug_trybot',
       'GPU FYI XR Win x64 Builder': 'gpu_fyi_tests_release_trybot',
       'Linux FYI GPU TSAN Release': 'gpu_fyi_tests_release_trybot_tsan_reclient',
-      'Linux FYI SkiaRenderer Dawn Release (Intel HD 630)': 'gpu_tests_sk_dawn_release_trybot',
       'Optional Android Release (Nexus 5X)': 'gpu_tests_android_release_trybot_arm64',
       'Optional Android Release (Pixel 4)': 'gpu_tests_android_release_trybot',
-      'Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)': 'gpu_tests_sk_dawn_release_trybot',
     },
 
     'chromium.infra.codesearch': {
@@ -856,11 +854,9 @@
       'cast_shell_android': 'android_cast_debug_static_bot_compile_only',
       'gpu-fyi-try-android-l-nexus-5-32': 'gpu_tests_android_release_trybot',
       'gpu-fyi-try-android-m-nexus-5x-64': 'gpu_tests_android_release_trybot_arm64',
-      'gpu-fyi-try-android-m-nexus-5x-skgl-64': 'gpu_tests_android_release_trybot_arm64',
       'gpu-fyi-try-android-m-nexus-9-64': 'gpu_tests_android_release_trybot_arm64',
       'gpu-fyi-try-android-n-nvidia-shield-tv-64': 'gpu_tests_android_release_trybot_arm64',
       'gpu-fyi-try-android-p-pixel-2-32': 'gpu_tests_android_release_trybot',
-      'gpu-fyi-try-android-p-pixel-2-skv-32': 'gpu_tests_android_release_trybot',
       'gpu-fyi-try-android-r-pixel-4-32': 'gpu_tests_android_release_trybot',
       'gpu-fyi-try-android-pixel-6-64': 'gpu_tests_android_release_trybot_arm64',
       'gpu-try-android-m-nexus-5x-64': 'gpu_tests_android_release_trybot_arm64',
@@ -1009,12 +1005,9 @@
       'gpu-fyi-try-linux-amd-rel': 'gpu_fyi_tests_release_trybot',
       'gpu-fyi-try-linux-intel-exp': 'gpu_fyi_tests_release_trybot',
       'gpu-fyi-try-linux-intel-rel': 'gpu_fyi_tests_release_trybot',
-      'gpu-fyi-try-linux-intel-sk-dawn-rel': 'gpu_tests_sk_dawn_release_trybot',
-      'gpu-fyi-try-linux-intel-skv': 'gpu_fyi_tests_release_trybot',
       'gpu-fyi-try-linux-nvidia-dbg': 'gpu_fyi_tests_debug_trybot',
       'gpu-fyi-try-linux-nvidia-exp': 'gpu_fyi_tests_release_trybot',
       'gpu-fyi-try-linux-nvidia-rel': 'gpu_fyi_tests_release_trybot',
-      'gpu-fyi-try-linux-nvidia-skv': 'gpu_fyi_tests_release_trybot',
       'gpu-fyi-try-linux-nvidia-tsn': 'gpu_fyi_tests_release_trybot_tsan',
       'gpu-try-linux-nvidia-dbg': 'gpu_tests_debug_bot',
       'gpu-try-linux-nvidia-rel': 'gpu_tests_release_trybot',
@@ -1198,7 +1191,6 @@
       'gpu-fyi-try-win10-nvidia-exp-64': 'gpu_fyi_tests_release_trybot',
       'gpu-fyi-try-win10-nvidia-rel-32': 'gpu_fyi_tests_release_trybot_x86',
       'gpu-fyi-try-win10-nvidia-rel-64': 'gpu_fyi_tests_release_trybot',
-      'gpu-fyi-try-win10-nvidia-sk-dawn-rel-64': 'gpu_tests_sk_dawn_release_trybot',
       'win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng': 'gpu_tests_release_trybot_resource_allowlisting_invert_fieldtrials',
       'win10_chromium_x64_dbg_ng': 'gpu_tests_debug_bot',
       'win10_chromium_x64_rel_ng': 'gpu_tests_release_trybot_resource_allowlisting_code_coverage',
@@ -2536,10 +2528,6 @@
       'gpu_tests', 'release_trybot', 'x86', 'resource_allowlisting',
     ],
 
-    'gpu_tests_sk_dawn_release_trybot': [
-      'gpu_tests', 'sk_dawn', 'release_trybot_minimal_symbols',
-    ],
-
     'gn_linux_upload': [
       'gn_linux_upload', 'official', 'goma',
     ],
@@ -3993,10 +3981,6 @@
       'mixins': ['shared_release_bot', 'no_symbols', 'dcheck_always_on'],
     },
 
-    'sk_dawn': {
-      'gn_args': 'skia_use_dawn=true enable_skia_dawn_gtests=true',
-    },
-
     'skip_generate_fuzzer_owners': {
       'gn_args': 'generate_fuzzer_owners=false',
     },
diff --git a/tools/mb/mb_config_expectations/chromium.gpu.fyi.json b/tools/mb/mb_config_expectations/chromium.gpu.fyi.json
index 06e871b..bd023b9 100644
--- a/tools/mb/mb_config_expectations/chromium.gpu.fyi.json
+++ b/tools/mb/mb_config_expectations/chromium.gpu.fyi.json
@@ -287,20 +287,6 @@
       "use_remoteexec": true
     }
   },
-  "Linux FYI SkiaRenderer Dawn Release (Intel HD 630)": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "enable_skia_dawn_gtests": true,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "skia_use_dawn": true,
-      "symbol_level": 1,
-      "use_goma": true
-    }
-  },
   "Optional Android Release (Nexus 5X)": {
     "gn_args": {
       "blink_enable_generated_code_formatting": false,
@@ -330,20 +316,6 @@
       "use_static_angle": true
     }
   },
-  "Win10 FYI x64 SkiaRenderer Dawn Release (NVIDIA)": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "enable_skia_dawn_gtests": true,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "skia_use_dawn": true,
-      "symbol_level": 1,
-      "use_goma": true
-    }
-  },
   "gpu-fyi-chromeos-jacuzzi-exp": {
     "args_file": "//build/args/chromeos/jacuzzi.gni",
     "gn_args": {
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
index a9cc0be..b712890 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -1235,21 +1235,6 @@
       "use_static_angle": true
     }
   },
-  "gpu-fyi-try-android-m-nexus-5x-skgl-64": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "symbol_level": 1,
-      "target_cpu": "arm64",
-      "target_os": "android",
-      "use_goma": true,
-      "use_static_angle": true
-    }
-  },
   "gpu-fyi-try-android-m-nexus-9-64": {
     "gn_args": {
       "blink_enable_generated_code_formatting": false,
@@ -1294,20 +1279,6 @@
       "use_static_angle": true
     }
   },
-  "gpu-fyi-try-android-p-pixel-2-skv-32": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "symbol_level": 1,
-      "target_os": "android",
-      "use_goma": true,
-      "use_static_angle": true
-    }
-  },
   "gpu-fyi-try-android-pixel-6-64": {
     "gn_args": {
       "blink_enable_generated_code_formatting": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
index 04377f8..836c00d5 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.linux.json
@@ -274,35 +274,6 @@
       "use_goma": true
     }
   },
-  "gpu-fyi-try-linux-intel-sk-dawn-rel": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "enable_skia_dawn_gtests": true,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "skia_use_dawn": true,
-      "symbol_level": 1,
-      "use_goma": true
-    }
-  },
-  "gpu-fyi-try-linux-intel-skv": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "enable_nacl": false,
-      "ffmpeg_branding": "Chrome",
-      "internal_gles2_conform_tests": true,
-      "is_component_build": false,
-      "is_debug": false,
-      "is_gpu_fyi_bot": true,
-      "proprietary_codecs": true,
-      "symbol_level": 1,
-      "use_goma": true
-    }
-  },
   "gpu-fyi-try-linux-nvidia-dbg": {
     "gn_args": {
       "enable_nacl": false,
@@ -346,21 +317,6 @@
       "use_goma": true
     }
   },
-  "gpu-fyi-try-linux-nvidia-skv": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "enable_nacl": false,
-      "ffmpeg_branding": "Chrome",
-      "internal_gles2_conform_tests": true,
-      "is_component_build": false,
-      "is_debug": false,
-      "is_gpu_fyi_bot": true,
-      "proprietary_codecs": true,
-      "symbol_level": 1,
-      "use_goma": true
-    }
-  },
   "gpu-fyi-try-linux-nvidia-tsn": {
     "gn_args": {
       "blink_enable_generated_code_formatting": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.win.json b/tools/mb/mb_config_expectations/tryserver.chromium.win.json
index 9da6bc4..d21cc57 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.win.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.win.json
@@ -133,20 +133,6 @@
       "use_goma": true
     }
   },
-  "gpu-fyi-try-win10-nvidia-sk-dawn-rel-64": {
-    "gn_args": {
-      "blink_enable_generated_code_formatting": false,
-      "dcheck_always_on": true,
-      "enable_skia_dawn_gtests": true,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "skia_use_dawn": true,
-      "symbol_level": 1,
-      "use_goma": true
-    }
-  },
   "gpu-fyi-try-win7-amd-rel-32": {
     "gn_args": {
       "blink_enable_generated_code_formatting": false,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index e108187..680575e 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -1937,6 +1937,7 @@
   <int value="13" label="DOWNLOAD_PROGRESS_MESSAGE"/>
   <int value="14" label="DUPLICATE_DOWNLOAD_DIALOG"/>
   <int value="15" label="EXTERNAL_APP"/>
+  <int value="16" label="NEW_DOWNLOAD_TAB_OPEN_BUTTON"/>
 </enum>
 
 <enum name="AndroidEnhancedProtectionPromoAction">
@@ -6786,6 +6787,11 @@
              fill but exp. date missing)"/>
   <int value="48"
       label="CreditCardSeamlessFill :-( (all other scenarios = Partial fill)"/>
+  <int value="49"
+      label="Missing shared-autofill feature prevented a cross-origin
+             credit-card field from being filled. Shared-autofill is a
+             policy-controlled feature by which a frame can allow a
+             child-frame to be autofilled across origin."/>
 </enum>
 
 <enum name="AutofillFormSubmittedState">
@@ -28463,6 +28469,7 @@
   <int value="949" label="UserAgentForceMajorVersionToMinorPosition"/>
   <int value="950" label="AllHttpAuthSchemesAllowedForOrigins"/>
   <int value="951" label="WindowPlacementAlwaysAllowed"/>
+  <int value="952" label="ReportDevicePeripherals"/>
 </enum>
 
 <enum name="EnterprisePolicyDeviceIdValidity">
@@ -29762,6 +29769,8 @@
   <int value="485" label="INPUT_METHOD_PRIVATE_ON_TOUCH"/>
   <int value="486" label="WEB_AUTHENTICATION_PROXY_ON_CREATE_REQUEST"/>
   <int value="487" label="WEB_AUTHENTICATION_PROXY_REQUEST_CANCELLED"/>
+  <int value="488" label="WEB_AUTHENTICATION_PROXY_ON_GET_REQUEST"/>
+  <int value="489" label="DEVELOPER_PRIVATE_ON_USER_SITE_SETTINGS_CHANGED"/>
 </enum>
 
 <enum name="ExtensionFileWriteResult">
@@ -31460,6 +31469,7 @@
   <int value="1619" label="AUTOTESTPRIVATE_STARTARC"/>
   <int value="1620" label="AUTOTESTPRIVATE_STOPARC"/>
   <int value="1621" label="PASSWORDSPRIVATE_MUTEINSECURECREDENTIAL"/>
+  <int value="1622" label="WEB_AUTHENTICATION_PROXY_COMPLETE_GET_REQUEST"/>
 </enum>
 
 <enum name="ExtensionIconState">
@@ -36994,6 +37004,7 @@
   <int value="4156" label="V8UDPSocket_RemoteAddress_AttributeGetter"/>
   <int value="4157" label="V8UDPSocket_RemotePort_AttributeGetter"/>
   <int value="4158" label="V8UDPSocket_Writable_AttributeGetter"/>
+  <int value="4159" label="AbortSignalTimeout"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -37462,6 +37473,26 @@
   <int value="0" label="Enum placerholder. See crbug/1179826"/>
 </enum>
 
+<enum name="FeedUserSettingsOnStart">
+  <int value="0" label="The Feed is disabled by enterprise policy"/>
+  <int value="1" label="The user is signed out, and has disabled the Feed."/>
+  <int value="2" label="The user is signed in, and has disabled the Feed."/>
+  <int value="3" label="Feed enabled, user signed out"/>
+  <int value="4"
+      label="Feed enabled, user signed in, WAA on, Discover Personalization
+             on"/>
+  <int value="5"
+      label="Feed enabled, user signed in, WAA on, Discover Personalization
+             off"/>
+  <int value="6"
+      label="Feed enabled, user signed in, WAA off, Discover Personalization
+             on"/>
+  <int value="7"
+      label="Feed enabled, user signed in, WAA off, Discover Personalization
+             off"/>
+  <int value="8" label="Feed enabled, user signed in, no recent Feed data"/>
+</enum>
+
 <enum name="FeedVideoInitializationError">
   <int value="0" label="Client library update required."/>
   <int value="1" label="Developer key invalid."/>
@@ -50953,6 +50984,7 @@
   <int value="-2146979021" label="OmniboxMaxURLMatches:enabled"/>
   <int value="-2146832142" label="SyncPseudoUSSSearchEngines:enabled"/>
   <int value="-2146613579" label="V8Future:disabled"/>
+  <int value="-2146512732" label="FullUserAgent:disabled"/>
   <int value="-2146263880" label="LensRegionSearch:disabled"/>
   <int value="-2145472146" label="OfflinePagesResourceBasedSnapshot:disabled"/>
   <int value="-2144796781" label="TurnOffStreamingMediaCachingAlways:enabled"/>
@@ -51134,6 +51166,7 @@
       label="HappinessTrackingSurveysForDesktopPrivacySandbox:enabled"/>
   <int value="-2033225430" label="NTPMostLikelyFaviconsFromServer:disabled"/>
   <int value="-2033136855" label="MessagesForAndroidPasswords:disabled"/>
+  <int value="-2030255112" label="Bruschetta:disabled"/>
   <int value="-2030217301" label="password-export:disabled"/>
   <int value="-2029912304" label="StaleWhileRevalidate2:enabled"/>
   <int value="-2028336995" label="VirtualKeyboardDarkMode:disabled"/>
@@ -52392,6 +52425,7 @@
   <int value="-1176493523" label="enable-md-extensions"/>
   <int value="-1174292609" label="SystemProxyForSystemServices:disabled"/>
   <int value="-1174267639" label="ClientLoFi:disabled"/>
+  <int value="-1173823468" label="FullUserAgent:enabled"/>
   <int value="-1173361620" label="CCTModulePostMessage:disabled"/>
   <int value="-1172572865" label="NTPShowGoogleGInOmnibox:enabled"/>
   <int value="-1172204005" label="enable-offline-auto-reload-visible-only"/>
@@ -54270,6 +54304,7 @@
   <int value="202966815" label="SettingsAppNotificationSettings:enabled"/>
   <int value="203239167" label="ImprovedGeoLanguageData:enabled"/>
   <int value="203776499" label="enable-virtual-keyboard-overscroll"/>
+  <int value="207326879" label="NearbySharingReceiveWifiCredentials:enabled"/>
   <int value="207907053"
       label="OmniboxUIExperimentBlueSearchLoopAndSearchQuery:enabled"/>
   <int value="208186067" label="ArcCompatSnapFeature:disabled"/>
@@ -54297,6 +54332,7 @@
   <int value="223591010" label="CastMediaRouteProvider:enabled"/>
   <int value="223662457" label="BackgroundLoadingForDownloads:enabled"/>
   <int value="224019823" label="CompositeAfterPaint:enabled"/>
+  <int value="224065816" label="SuppressToolbarCaptures:enabled"/>
   <int value="225610933" label="SystemLatinPhysicalTyping:enabled"/>
   <int value="226590039" label="OverviewButton:disabled"/>
   <int value="228107154"
@@ -54418,6 +54454,7 @@
   <int value="309795366" label="ScrollUnification:disabled"/>
   <int value="310143091"
       label="AutofillImportNonFocusableCreditCardForms:enabled"/>
+  <int value="312112911" label="FilesWebDriveOffice:enabled"/>
   <int value="313112736" label="HandwritingLegacyRecognitionAllLang:enabled"/>
   <int value="313253630" label="AutofillRefreshStyleAndroid:enabled"/>
   <int value="313303258" label="WebPaymentsModifiers:disabled"/>
@@ -54671,6 +54708,7 @@
   <int value="484581911" label="ServiceWorkerSubresourceFilter:disabled"/>
   <int value="484596410" label="EnterpriseRealtimeExtensionRequest:disabled"/>
   <int value="485957747" label="finch-seed-ignore-pending-download"/>
+  <int value="487542146" label="Bruschetta:enabled"/>
   <int value="487605950" label="PerformantSplitViewResizing:disabled"/>
   <int value="487810392" label="EnablePalmOnToolTypePalm:enabled"/>
   <int value="491258649" label="UseFirstPartySet"/>
@@ -56046,6 +56084,7 @@
   <int value="1469407485" label="disable-accelerated-2d-canvas"/>
   <int value="1472938299" label="WellKnownChangePassword:disabled"/>
   <int value="1473157145" label="EcheSWAResizing:enabled"/>
+  <int value="1473379096" label="NearbySharingReceiveWifiCredentials:disabled"/>
   <int value="1473838479" label="EnableVirtualKeyboardMdUi:disabled"/>
   <int value="1473967338" label="OmniboxShortBookmarkSuggestions:enabled"/>
   <int value="1474433736" label="NtpRealboxTailSuggest:enabled"/>
@@ -56289,6 +56328,7 @@
   <int value="1658656322" label="IncognitoDownloadsWarning:enabled"/>
   <int value="1659082220" label="EnableManualSaving:disabled"/>
   <int value="1659372520" label="WebXrRenderPath:disabled"/>
+  <int value="1660002388" label="FilesWebDriveOffice:disabled"/>
   <int value="1660491118" label="AllowAmbientEQ:enabled"/>
   <int value="1660772828" label="NtpModulesDragAndDrop:enabled"/>
   <int value="1661354480" label="BlockInsecurePrivateNetworkRequests:disabled"/>
@@ -56836,6 +56876,7 @@
   <int value="2024172900" label="KidsManagementUrlClassification:disabled"/>
   <int value="2024298022"
       label="AutofillEnableInfoBarAccountIndicationFooterForSyncUsers:disabled"/>
+  <int value="2027492085" label="SuppressToolbarCaptures:disabled"/>
   <int value="2027729007" label="WindowControlMenu:enabled"/>
   <int value="2027793952" label="EditPasswordsInSettings:disabled"/>
   <int value="2032558514"
@@ -69974,6 +70015,11 @@
   <int value="4" label="Alt-mode fallback in guest session"/>
   <int value="5" label="Peripheral blocked"/>
   <int value="6" label="Billboard device"/>
+  <int value="7" label="Invalid DP cable"/>
+  <int value="8" label="USB4 device uses Thunderbolt due to the cable"/>
+  <int value="9" label="USB4 device with incompatible cable"/>
+  <int value="10" label="Thunderbolt device with incompatible cable"/>
+  <int value="11" label="USB device speed limited by the cable"/>
 </enum>
 
 <enum name="PdfCompositionStatus">
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index ea3668e..6956d06e0 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -56,11 +56,6 @@
 </variants>
 
 <variants name="JankMetricsScenarios">
-  <variant name="">
-    <obsolete>
-      Renamed to .Total
-    </obsolete>
-  </variant>
   <variant name=".NewTabPage" summary="while NTP is open"/>
   <variant name=".OmniboxFocus" summary="while Omnibox is focused"/>
   <variant name=".OpenLinkInNewTab"
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 3a1850b1..986a8896 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -2509,20 +2509,6 @@
   </summary>
 </histogram>
 
-<histogram name="Ash.SearchModelUpdateInterval" units="ms"
-    expires_after="2022-12-01">
-  <obsolete>
-    Deprecated 01/2022 to split metrics based on tablet/clamshell mode.
-  </obsolete>
-  <owner>yulunwu@google.com</owner>
-  <owner>tbarzic@google.com</owner>
-  <summary>
-    Records the time interval between user-initiated search model updates after
-    the user starts a search query. Used to record how quickly users update the
-    search model after passing in their first keystroke.
-  </summary>
-</histogram>
-
 <histogram name="Ash.SearchModelUpdateTime.{TabletOrClamshell}" units="ms"
     expires_after="2022-12-01">
   <owner>yulunwu@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index e68b9fd..e0b923c 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -1138,19 +1138,6 @@
   </summary>
 </histogram>
 
-<histogram name="Blink.HTMLParsing.ChunkCount" units="chunks"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    The number of chunks parsed while loading a page. Each chunk represents a
-    piece of the HTML content that can be loaded without blocking or yielding.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
 <histogram name="Blink.HTMLParsing.ChunkCount2" units="chunks"
     expires_after="2022-06-30">
   <owner>schenney@chromium.org</owner>
@@ -1158,7 +1145,6 @@
   <summary>
     The number of chunks parsed while loading a page. Each chunk represents a
     piece of the HTML content that can be loaded without blocking or yielding.
-    This version is for Forced Synchronous HTML Parsing.
 
     This histogram does not record metrics on machines with low-resolution
     clocks.
@@ -1179,39 +1165,12 @@
   </summary>
 </histogram>
 
-<histogram name="Blink.HTMLParsing.ParsingTimeMax" units="microseconds"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the maximum time used to parse a single chunk before
-    being blocked, yielding or completing, in microseconds.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
 <histogram name="Blink.HTMLParsing.ParsingTimeMax2" units="microseconds"
     expires_after="2022-06-30">
   <owner>schenney@chromium.org</owner>
   <owner>dom-dev@chromium.org</owner>
   <summary>
     While parsing a page, the maximum time used to parse a single chunk before
-    being blocked, yielding or completing, in microseconds. This version is for
-    Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.ParsingTimeMin" units="microseconds"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the minimum time used to parse a single chunk before
     being blocked, yielding or completing, in microseconds.
 
     This histogram does not record metrics on machines with low-resolution
@@ -1225,21 +1184,7 @@
   <owner>dom-dev@chromium.org</owner>
   <summary>
     While parsing a page, the minimum time used to parse a single chunk before
-    being blocked, yielding or completing, in microseconds. This version is for
-    Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.ParsingTimeTotal" units="microseconds"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the total amount of time spent in the
-    HTMLDocumentParser performing parsing, in microseconds.
+    being blocked, yielding or completing, in microseconds.
 
     This histogram does not record metrics on machines with low-resolution
     clocks.
@@ -1252,20 +1197,7 @@
   <owner>dom-dev@chromium.org</owner>
   <summary>
     While parsing a page, the total amount of time spent in the
-    HTMLDocumentParser performing parsing, in microseconds. This version is for
-    Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.TokensParsedAverage" units="tokens"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the average number of tokens parsed across all chunks.
+    HTMLDocumentParser performing parsing, in microseconds.
 
     This histogram does not record metrics on machines with low-resolution
     clocks.
@@ -1278,19 +1210,6 @@
   <owner>dom-dev@chromium.org</owner>
   <summary>
     While parsing a page, the average number of tokens parsed across all chunks.
-    This version is for Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.TokensParsedMax" units="tokens"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the maximum number of tokens parsed as a chunk.
 
     This histogram does not record metrics on machines with low-resolution
     clocks.
@@ -1302,20 +1221,7 @@
   <owner>schenney@chromium.org</owner>
   <owner>dom-dev@chromium.org</owner>
   <summary>
-    While parsing a page, the maximum number of tokens parsed as a chunk. This
-    version is for Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.TokensParsedMin" units="tokens"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the minimum number of tokens parsed as a chunk.
+    While parsing a page, the maximum number of tokens parsed as a chunk.
 
     This histogram does not record metrics on machines with low-resolution
     clocks.
@@ -1327,20 +1233,7 @@
   <owner>schenney@chromium.org</owner>
   <owner>dom-dev@chromium.org</owner>
   <summary>
-    While parsing a page, the minimum number of tokens parsed as a chunk. This
-    version is for Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.TokensParsedTotal" units="tokens"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the total number of tokens parsed across all chunks.
+    While parsing a page, the minimum number of tokens parsed as a chunk.
 
     This histogram does not record metrics on machines with low-resolution
     clocks.
@@ -1353,20 +1246,6 @@
   <owner>dom-dev@chromium.org</owner>
   <summary>
     While parsing a page, the total number of tokens parsed across all chunks.
-    This version is for Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.YieldedTimeAverage" units="microseconds"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the average time between parsing of two chunks, in
-    microseconds. Will not be recorded if only one chunk was parsed.
 
     This histogram does not record metrics on machines with low-resolution
     clocks.
@@ -1379,20 +1258,6 @@
   <owner>dom-dev@chromium.org</owner>
   <summary>
     While parsing a page, the average time between parsing of two chunks, in
-    microseconds. Will not be recorded if only one chunk was parsed. This
-    version is for Forced Synchronous HTML Parsing.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
-<histogram name="Blink.HTMLParsing.YieldedTimeMax" units="microseconds"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the maximum time between parsing of two chunks, in
     microseconds. Will not be recorded if only one chunk was parsed.
 
     This histogram does not record metrics on machines with low-resolution
@@ -1414,19 +1279,6 @@
   </summary>
 </histogram>
 
-<histogram name="Blink.HTMLParsing.YieldedTimeMin" units="microseconds"
-    expires_after="2022-06-30">
-  <owner>schenney@chromium.org</owner>
-  <owner>dom-dev@chromium.org</owner>
-  <summary>
-    While parsing a page, the minimum time between parsing of two chunks, in
-    microseconds. Will not be recorded if only one chunk was parsed.
-
-    This histogram does not record metrics on machines with low-resolution
-    clocks.
-  </summary>
-</histogram>
-
 <histogram name="Blink.HTMLParsing.YieldedTimeMin2" units="microseconds"
     expires_after="2022-06-30">
   <owner>schenney@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
index 2f78d36..eb6690f 100644
--- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml
+++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -31,6 +31,7 @@
   <variant name=".BLE"/>
   <variant name=".Classic"/>
   <variant name=".Dual"/>
+  <variant name=".Invalid"/>
 </variants>
 
 <variants name="BlueZDBusMethodName">
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index 640ab65a..1e0e4d3 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -30,20 +30,6 @@
   <variant name=".NoSavedFrames_Loaded"
       summary="Same as NoSavedFrames with the destination tab being loaded
                (frozen or not frozen)"/>
-  <variant name=".NoSavedFrames_Loaded_Frozen"
-      summary="Same as NoSavedFrames with the destination tab being loaded and
-               frozen.">
-    <obsolete>
-      Frozen is no longer a supported state.
-    </obsolete>
-  </variant>
-  <variant name=".NoSavedFrames_Loaded_NotFrozen"
-      summary="Same as NoSavedFrames with the destination tab being loaded and
-               not frozen.">
-    <obsolete>
-      Frozen is no longer a supported state.
-    </obsolete>
-  </variant>
   <variant name=".NoSavedFrames_NotLoaded"
       summary="Same as WithSavedFrames with the destination tab being
                unloaded."/>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 2bc62ee9..700850c3 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -1140,6 +1140,18 @@
   </token>
 </histogram>
 
+<histogram name="ContentSuggestions.Feed.UserSettingsOnStart"
+    enum="FeedUserSettingsOnStart" expires_after="2022-03-01">
+  <owner>carlosk@chromium.org</owner>
+  <owner>harringtond@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <summary>
+    The state of some account settings that affect Feed users. Reported once at
+    startup (to a single bucket), for all users. Note that this histogram uses
+    data cached from the last time the Feed was fetched. Android only.
+  </summary>
+</histogram>
+
 <histogram name="ContentSuggestions.Feed.VisibilityLoggingEnabled"
     enum="Boolean" expires_after="2023-03-01">
   <owner>freedjm@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index e5bd7f4..30f5bc76 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -10760,16 +10760,6 @@
   <affected-histogram name="Media.VideoCapture.MaxFrameDropExceeded"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="VideoDecodeStatsDBOperations" separator=".">
-  <suffix name="Clear" label="Remove all keys"/>
-  <suffix name="Initialize" label="Initialize the DB."/>
-  <suffix name="Read" label="Read an entry from the DB"/>
-  <suffix name="Validate" label="Check for DB entry corruption"/>
-  <suffix name="Write" label="Write an entry to the DB"/>
-  <affected-histogram name="Media.VideoDecodeStatsDB.OpSuccess"/>
-  <affected-histogram name="Media.VideoDecodeStatsDB.OpTiming"/>
-</histogram_suffixes>
-
 <histogram_suffixes name="VideoFrameRateRange" separator=".">
   <suffix name="24fps" label="24 fps"/>
   <suffix name="25fps" label="25 fps"/>
diff --git a/tools/metrics/histograms/metadata/language/histograms.xml b/tools/metrics/histograms/metadata/language/histograms.xml
index 4e2eba9e..e7a4be2 100644
--- a/tools/metrics/histograms/metadata/language/histograms.xml
+++ b/tools/metrics/histograms/metadata/language/histograms.xml
@@ -90,21 +90,6 @@
   </summary>
 </histogram>
 
-<histogram name="LanguageSettings.AppLanguagePrompt.IsAccessibilityEnabled"
-    enum="BooleanEnabled" expires_after="2022-06-30">
-  <owner>perrier@chromium.org</owner>
-  <owner>chrome-language@google.com</owner>
-  <summary>
-    Whether or not accessibility features are enabled when the App Language
-    Prompt should be shown. If accessibility features are enabled the prompt
-    will not be shown. This histogram will continue to log &quot;Enabled&quot;
-    for the user until Chrome is started with accessibility features disabled.
-
-    Reported each time all other conditions for showing the App Language Prompt
-    have been met.
-  </summary>
-</histogram>
-
 <histogram name="LanguageSettings.AppLanguagePrompt.IsOnline"
     enum="BooleanYesNo" expires_after="2022-06-30">
   <owner>perrier@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml b/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
index 7cfd512..96a50af 100644
--- a/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
+++ b/tools/metrics/histograms/metadata/leveldb_proto/histograms.xml
@@ -99,6 +99,8 @@
       summary="Database for video tutorials (deprecated)."/>
   <variant name="VideoTutorialsV2Database"
       summary="Database for video tutorials."/>
+  <variant name="WebrtcVideoStatsDB"
+      summary="Database for Webrtc video stats."/>
 </variants>
 
 <histogram name="LevelDB.ApproximateMemTableMemoryUse.{LevelDBClient}"
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 5d7dd39..71b6773 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -22,6 +22,14 @@
 
 <histograms>
 
+<variants name="DbOperation">
+  <variant name="Clear" summary="Remove all keys from the DB"/>
+  <variant name="Initialize" summary="Initialize the DB."/>
+  <variant name="Read" summary="Read an entry from the DB"/>
+  <variant name="Validate" summary="Check for DB entry corruption"/>
+  <variant name="Write" summary="Write an entry to the DB"/>
+</variants>
+
 <variants name="EmeApi">
   <variant name="CloseSession"/>
   <variant name="GenerateRequest"/>
@@ -4797,31 +4805,31 @@
   </summary>
 </histogram>
 
-<histogram base="true" name="Media.VideoDecodeStatsDB.OpSuccess"
+<histogram name="Media.VideoDecodeStatsDB.OpSuccess.{DbOperation}"
     enum="BooleanSuccess" expires_after="never">
 <!-- expires-never: MediaCapabilities DB health metric. -->
 
-<!-- Name completed by histogram_suffixes name="VideoDecodeStatsDBOperations" -->
-
   <owner>chcunningham@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
-    Indicates whether we were successful performing some database operation. See
-    suffix VideoDecodeStatsDBOperations.
+    Indicates whether we were successful performing the operation to
+    {DbOperation}. Recorded once the operation completes.
   </summary>
+  <token key="DbOperation" variants="DbOperation"/>
 </histogram>
 
-<histogram name="Media.VideoDecodeStatsDB.OpTiming" units="microseconds"
-    expires_after="never">
+<histogram name="Media.VideoDecodeStatsDB.OpTiming.{DbOperation}"
+    units="microseconds" expires_after="never">
 <!-- expires-never: MediaCapabilities DB health metric. -->
 
-<!-- Name completed by histogram_suffixes name="VideoDecodeStatsDBOperations" -->
-
   <owner>chcunningham@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
-    Indicates duration of time performing some database operation.
+    Indicates duration of time performing the operation to {DbOperation}.
+    Recorded once the operation completes or times out. Reported for all users
+    regardless of clock resolution.
   </summary>
+  <token key="DbOperation" variants="DbOperation"/>
 </histogram>
 
 <histogram name="Media.VideoFrameSubmitter" units="ms" expires_after="never">
@@ -5048,6 +5056,33 @@
   </summary>
 </histogram>
 
+<histogram name="Media.WebrtcVideoStatsDB.OpSuccess.{DbOperation}"
+    enum="BooleanSuccess" expires_after="never">
+<!-- expires-never: WebRTC MediaCapabilities DB health metric. -->
+
+  <owner>kron@chromium.org</owner>
+  <owner>webrtc-video@google.com</owner>
+  <summary>
+    Indicates whether we were successful performing the operation to
+    {DbOperation}. Recorded once the operation completes.
+  </summary>
+  <token key="DbOperation" variants="DbOperation"/>
+</histogram>
+
+<histogram name="Media.WebrtcVideoStatsDB.OpTiming.{DbOperation}"
+    units="microseconds" expires_after="never">
+<!-- expires-never: WebRTC MediaCapabilities DB health metric. -->
+
+  <owner>kron@chromium.org</owner>
+  <owner>webrtc-video@google.com</owner>
+  <summary>
+    Indicates duration of time performing the operation to {DbOperation}.
+    Recorded once the operation completes or times out. Reported for all users
+    regardless of clock resolution.
+  </summary>
+  <token key="DbOperation" variants="DbOperation"/>
+</histogram>
+
 <histogram name="Media.YouTube.TimeToBufferAv" units="ms" expires_after="M85">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index 81250f5..c7a4362 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -55,7 +55,12 @@
 </histogram>
 
 <histogram name="HeapProfiling.InProcess.SnapshotInterval" units="ms"
-    expires_after="2022-12-02">
+    expires_after="2022-02-02">
+  <obsolete>
+    Replaced by
+    HeapProfiling.InProcess.SnapshotInterval.{Platform}.{RecordingTime} on
+    2022-02-02.
+  </obsolete>
   <owner>joenotcharles@chromium.org</owner>
   <owner>chrome-memory@google.com</owner>
   <summary>
@@ -64,6 +69,31 @@
   </summary>
 </histogram>
 
+<histogram
+    name="HeapProfiling.InProcess.SnapshotInterval.{Platform}.{RecordingTime}"
+    units="ms" expires_after="2022-12-02">
+  <owner>joenotcharles@chromium.org</owner>
+  <owner>chrome-memory@google.com</owner>
+  <summary>
+    The time between heap snapshots on {Platform}. Emitted for each snapshot
+    when the in-process heap profiler is enabled, at the beginning and end of
+    the snapshot interval. *.Scheduled histograms are recorded at the beginning
+    of the interval, when the snapshot is scheduled. *.Taken histograms are
+    recorded at the end of the interval, when the snapshot is taken. Entries in
+    *.Scheduled that don't appear in *.Taken show which snapshot intervals are
+    interrupted before the snapshot is taken.
+  </summary>
+  <token key="Platform">
+    <variant name="Desktop" summary="All desktop platforms"/>
+    <variant name="Mobile" summary="Android and iOS"/>
+  </token>
+  <token key="RecordingTime">
+    <variant name="Scheduled"
+        summary="Recorded when the snapshot is scheduled."/>
+    <variant name="Taken" summary="Recorded when the snapshot is taken."/>
+  </token>
+</histogram>
+
 <histogram name="HeapProfiling.ProfiledProcess.Type"
     enum="HeapProfilingProcessType" expires_after="2021-12-12">
   <owner>erikchen@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index 6d3a869..913dedb 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -1126,36 +1126,6 @@
   </summary>
 </histogram>
 
-<histogram name="Omnibox.ZeroSuggest.Eligible.OnProfileOpen"
-    enum="BooleanSupported" expires_after="2022-01-02">
-  <obsolete>
-    Since Q1 2022
-  </obsolete>
-  <owner>mpearson@chromium.org</owner>
-  <owner>jdonnelly@chromium.org</owner>
-  <summary>
-    Whether the user has settings configured so that the current page URL could
-    be sent to the suggest server to request contextual suggestions. For
-    example, this is only supported for users who have Google as their default
-    search engine (unmodified version of Google), have search suggest enabled,
-    and are signed-in and syncing without a custom passphrase. There are other
-    criteria too. Recorded on profile open. Note that opening an incognito
-    window (if none are currently open under the given profile) counts as
-    opening a new profile.
-
-    Some additional guidelines: unlike Omnibox.ZeroSuggest.Eligible.OnFocus,
-    because this is recorded on profile open, users cannot be declared
-    ineligible because they have an incognito window open (it's impossible to
-    have an incognito window open for a given profile at the time of profile
-    open) and also cannot be declared ineligible because the user is viewing a
-    search results page. (We test this on-profile-open using an arbitrary URL.)
-
-    Recorded regardless of whether contextual or non-contextual zero suggest is
-    currently enabled on the user's platform. However, if zero suggest (in all
-    forms) is entirely disabled, the user will be perpetually ineligible.
-  </summary>
-</histogram>
-
 <histogram name="Omnibox.ZeroSuggestRequests.NonPrefetch"
     enum="OmniboxZeroSuggestRequests" expires_after="2022-06-05">
   <owner>mahmadi@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 5cd9bd0..ed66f3a 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -2514,29 +2514,6 @@
   </token>
 </histogram>
 
-<histogram name="PasswordManager.{Store}TimesPasswordUsed" units="PasswordUses"
-    expires_after="2022-05-31">
-  <obsolete>
-    Removed in M99. This was never reported, but existed as a base name for
-    histograms using suffixes.
-  </obsolete>
-  <owner>kazinova@google.com</owner>
-  <owner>battre@chromium.org</owner>
-  <owner>mamir@chromium.org</owner>
-  <owner>treib@chromium.org</owner>
-  <summary>
-    The number of times each saved password from the {Store} has been used to
-    log in. Split by whether created by the user or generated by Chrome, and
-    further by whether the user used sync with custom passphrase or not.
-    Recorded by iterating over stored passwords once per browser run, soon after
-    startup.
-  </summary>
-  <token key="Store">
-    <variant name="" summary="for profile-scoped store"/>
-    <variant name="AccountStore." summary="for account-scoped store"/>
-  </token>
-</histogram>
-
 <histogram
     name="PasswordManager.{Store}TimesPasswordUsed.{PasswordType}{CustomPassphraseStatus}"
     units="PasswordUses" expires_after="2022-05-31">
@@ -2579,31 +2556,6 @@
   <token key="Scheme" variants="Scheme"/>
 </histogram>
 
-<histogram name="PasswordManager.{Store}{Metric}" units="units"
-    expires_after="2022-04-24">
-  <obsolete>
-    Removed in M99. This was never reported, but existed as a base name for
-    histograms using suffixes.
-  </obsolete>
-  <owner>kazinova@google.com</owner>
-  <owner>vasilii@chromium.org</owner>
-  <owner>mamir@chromium.org</owner>
-  <owner>treib@chromium.org</owner>
-  <owner>battre@chromium.org</owner>
-  <summary>
-    The number of accounts stored {Metric} in the password manager's {Store}.
-    Recorded during browser start-up.
-  </summary>
-  <token key="Store">
-    <variant name="" summary="for profile-scoped store"/>
-    <variant name="AccountStore." summary="for account-scoped store"/>
-  </token>
-  <token key="Metric">
-    <variant name="AccountsPerSiteHiRes" summary="per site"/>
-    <variant name="TotalAccountsHiRes.ByType" summary="across all sites"/>
-  </token>
-</histogram>
-
 <histogram
     name="PasswordManager.{Store}{Metric}.{PasswordType}{CustomPassphraseStatus}"
     units="units" expires_after="2022-04-24">
@@ -2809,28 +2761,6 @@
   </summary>
 </histogram>
 
-<histogram name="PasswordProtection.{TriggerType}.UserPopulation{Moment}"
-    enum="SafeBrowsingUserPopulation" expires_after="M98">
-  <obsolete>
-    Removed in M99 due to lack of use.
-  </obsolete>
-  <owner>drubery@chromium.org</owner>
-  <owner>chrome-safebrowsing-core@chromium.org</owner>
-  <summary>
-    Records the user population for the profile triggering a password protection
-    check, due to {TriggerType}, {Moment}.
-  </summary>
-  <token key="TriggerType">
-    <variant name="OnFocus" summary="focusing on an unfamiliar login page"/>
-    <variant name="PasswordEntry"
-        summary="entering a password on the wrong login page"/>
-  </token>
-  <token key="Moment">
-    <variant name="OnPing" summary="when we decide to contact Safe Browsing"/>
-    <variant name="Start" summary="when the check is triggered"/>
-  </token>
-</histogram>
-
 </histograms>
 
 </histogram-configuration>
diff --git a/tools/metrics/histograms/metadata/power/OWNERS b/tools/metrics/histograms/metadata/power/OWNERS
index e94d940..374edac0 100644
--- a/tools/metrics/histograms/metadata/power/OWNERS
+++ b/tools/metrics/histograms/metadata/power/OWNERS
@@ -2,4 +2,5 @@
 
 # Prefer sending CLs to the owners listed below.
 # Use chromium-metrics-reviews@google.com as a backup.
+olivierli@chromium.org
 tby@chromium.org
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index d466192e..059402d 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -30,7 +30,21 @@
 
   <variant name="" summary="all intervals"/>
   <variant name=".AllTabsHidden"
-      summary="intervals during which Chrome had tabs, but none visible"/>
+      summary="intervals during which Chrome had tabs, but none visible">
+    <obsolete>
+      01/2022: Replaced with AllTabsHidden_VideoCapture, AllTabsHidden_Audio and
+      AllTabsHidden_NoVideoCaptureOrAudio.
+    </obsolete>
+  </variant>
+  <variant name=".AllTabsHidden_Audio"
+      summary="intervals during which Chrome had no visible tab and there was
+               audio but no video capture"/>
+  <variant name=".AllTabsHidden_NoVideoCaptureOrAudio"
+      summary="intervals during which Chrome had no visible tab and there was
+               no audio and no video capture"/>
+  <variant name=".AllTabsHidden_VideoCapture"
+      summary="intervals during which Chrome had no visible tab and there was
+               video capture"/>
   <variant name=".Audio"
       summary="intervals during which Chrome had at least 1 visible tab and
                was audible, but there was no video playback or video capture"/>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml
index fd473382..c2de9ef 100644
--- a/tools/metrics/histograms/metadata/search/histograms.xml
+++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -984,6 +984,9 @@
 
 <histogram name="Search.ContextualSearchSecondTapMlOverrideSeen" enum="Boolean"
     expires_after="M77">
+  <obsolete>
+    Removed as of 01/2022
+  </obsolete>
   <owner>donnd@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index cbfc38c..211d57e3 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -211,7 +211,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.AboutThisSiteStatus"
-    enum="AboutThisSiteStatus" expires_after="M101">
+    enum="AboutThisSiteStatus" expires_after="M104">
   <owner>dullweber@chromium.org</owner>
   <owner>olesiamarukhno@chromium.org</owner>
   <summary>
@@ -231,7 +231,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.TimeOpen.AboutThisSite{WasShown}" units="ms"
-    expires_after="M101">
+    expires_after="M104">
   <owner>olesiamarukhno@google.com</owner>
   <owner>dullweber@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml
index d0e50ca8..e25b2e7 100644
--- a/tools/metrics/histograms/metadata/sharing/histograms.xml
+++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -559,7 +559,7 @@
 </histogram>
 
 <histogram name="Sharing.SharingHubAndroid.{DetailedContentType}.{ShareStatus}"
-    enum="LinkToggleState" expires_after="M101">
+    enum="LinkToggleState" expires_after="M105">
   <owner>sophey@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index dfa7869..8707ab0 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -495,6 +495,22 @@
   </summary>
 </histogram>
 
+<histogram name="WebApp.Preinstalled.AppDuplicationFixApplied" units="apps"
+    expires_after="2022-07-27">
+  <owner>alancutter@chromium.org</owner>
+  <owner>desktop-pwas-team@google.com</owner>
+  <summary>
+    Chrome apps migrated to preinstalled web apps encountered an issue where
+    apps became duplicated, see https://crbug.com/1266234.
+
+    The PreinstalledWebAppDuplicationFixer was added to fix users that
+    encountered duplicate apps. See https://crbug.com/1290716. This metric
+    records how many app duplications got fixed.
+
+    This gets recorded at start up after Chrome apps have loaded.
+  </summary>
+</histogram>
+
 <histogram name="WebApp.Preinstalled.AppToReplaceStillDefaultInstalledCount"
     units="apps" expires_after="2022-04-17">
   <owner>alancutter@chromium.org</owner>
diff --git a/tools/metrics/histograms/pretty_print.py b/tools/metrics/histograms/pretty_print.py
index b04c3183..738cb44 100755
--- a/tools/metrics/histograms/pretty_print.py
+++ b/tools/metrics/histograms/pretty_print.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright 2013 The Chromium Authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index c0ed65d2..9377db4 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -12060,6 +12060,13 @@
       The length of time, in ms, between when the notification was triggered and
       when it was closed.
     </summary>
+    <aggregation>
+      <history>
+        <statistics>
+          <quantiles type="std-percentiles"/>
+        </statistics>
+      </history>
+    </aggregation>
   </metric>
   <metric name="TimeUntilFirstClick">
     <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 374b770d..4a0d82ca 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "win": {
-            "hash": "6c0f92df430b8793a010905f73a4d1e7219d2fe7",
-            "remote_path": "perfetto_binaries/trace_processor_shell/win/b8b535d59e6d3882a55fcf4510c91601333c5164/trace_processor_shell.exe"
+            "hash": "b79f905e883f9a3bb93aa601c6c82a29f235fa74",
+            "remote_path": "perfetto_binaries/trace_processor_shell/win/8d95cd174a866457acd2ef57eae1ee43c6799d96/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
             "remote_path": "perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "mac": {
-            "hash": "1f298d105f2b7ac6bc376cfb74430f839ca6d625",
-            "remote_path": "perfetto_binaries/trace_processor_shell/mac/b8b535d59e6d3882a55fcf4510c91601333c5164/trace_processor_shell"
+            "hash": "c5cdc3dd4386ea2979b7fd2c7a6e03061d346097",
+            "remote_path": "perfetto_binaries/trace_processor_shell/mac/8d95cd174a866457acd2ef57eae1ee43c6799d96/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "c0397e87456ad6c6a7aa0133e5b81c97adbab4ab",
             "remote_path": "perfetto_binaries/trace_processor_shell/mac_arm64/cefb3e0ec3a0580c996f801e854fe02963c03d5c/trace_processor_shell"
         },
         "linux": {
-            "hash": "9ed307b2d52a0af8d2e30ff51e34cdcd1a224f26",
-            "remote_path": "perfetto_binaries/trace_processor_shell/linux/b8b535d59e6d3882a55fcf4510c91601333c5164/trace_processor_shell"
+            "hash": "e77b1decbe72adff8b2fba5322e941d478833c9b",
+            "remote_path": "perfetto_binaries/trace_processor_shell/linux/8d95cd174a866457acd2ef57eae1ee43c6799d96/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index e4c15491..b188564b 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -374,6 +374,24 @@
 crbug.com/1211795 [ mac ] system_health.common_desktop/browse:tools:autocad:2021 [ Skip ]
 crbug.com/1277966 [ win-laptop ] system_health.common_desktop/browse:tools:maps:2019 [ Skip ]
 
+# These stories need to be re-recorded. See crbug.com/1261175 and crbug.com/1291621 for context.
+crbug.com/1291621 [ desktop ] system_health.common_desktop/load:tools:chat:2020 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.common_desktop/load:tools:gmail:2019 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.common_desktop/browse:tools:sheets:2019 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.common_desktop/load:tools:docs:2019 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.common_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/1291621 [ mobile ] system_health.common_mobile/load:tools:gmail:2019 [ Skip ]
+crbug.com/1291621 [ mobile ] system_health.common_mobile/load:tools:docs:2019 [ Skip ]
+crbug.com/1291621 [ mobile ] system_health.common_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.memory_desktop/load:tools:chat:2020 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.memory_desktop/load:tools:gmail:2019 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.memory_desktop/browse:tools:sheets:2019 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.memory_desktop/load:tools:docs:2019 [ Skip ]
+crbug.com/1291621 [ desktop ] system_health.memory_desktop/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+crbug.com/1291621 [ mobile ] system_health.memory_mobile/load:tools:gmail:2019 [ Skip ]
+crbug.com/1291621 [ mobile ] system_health.memory_mobile/load:tools:docs:2019 [ Skip ]
+crbug.com/1291621 [ mobile ] system_health.memory_mobile/browse:social:tumblr_infinite_scroll:2018 [ Skip ]
+
 # Benchmark: system_health.common_mobile
 crbug.com/1007355 [ android-go android-webview ] system_health.common_mobile/load:media:imgur:2018 [ Skip ]
 crbug.com/1064650 [ android-go ] system_health.common_mobile/browse:media:imgur:2019 [ Skip ]
diff --git a/tools/perf/page_sets/system_health/browsing_stories.py b/tools/perf/page_sets/system_health/browsing_stories.py
index aea6640..76a865c9 100644
--- a/tools/perf/page_sets/system_health/browsing_stories.py
+++ b/tools/perf/page_sets/system_health/browsing_stories.py
@@ -1873,17 +1873,8 @@
   '''
 
   def __init__(self, story_set, take_memory_measurement):
-    # TODO(crbug.com/1256844): Disable the ForceSynchronousHTMLParsing and
-    # LoaderDataPipeTuning experiments, because they cause failures and
-    # flakiness for this story as-recorded in 2019.
-    extra_browser_args = [
-        '--disable-features=ForceSynchronousHTMLParsing,LoaderDataPipeTuning'
-    ]
-
-    super(GoogleSheetsDesktopStory,
-          self).__init__(story_set,
-                         take_memory_measurement,
-                         extra_browser_args=extra_browser_args)
+    super(GoogleSheetsDesktopStory, self).__init__(story_set,
+                                                   take_memory_measurement)
     self.script_to_evaluate_on_commit = js_template.Render(
         '''{{@events_reported_by_page}}
         {{@performance_mark}}
@@ -2130,15 +2121,7 @@
   ]
 
   def __init__(self, story_set, take_memory_measurement):
-    # TODO(crbug.com/1256844): Disable the ForceSynchronousHTMLParsing and
-    # LoaderDataPipeTuning experiments, because they cause failures and
-    # flakiness for this story as-recorded in 2018.
-    extra_browser_args = [
-        '--disable-features=ForceSynchronousHTMLParsing,LoaderDataPipeTuning'
-    ]
-    super(TumblrStory2018, self).__init__(story_set,
-                                          take_memory_measurement,
-                                          extra_browser_args=extra_browser_args)
+    super(TumblrStory2018, self).__init__(story_set, take_memory_measurement)
 
   def _Login(self, action_runner):
     tumblr_login.LoginDesktopAccount(action_runner, 'tumblr')
diff --git a/tools/perf/page_sets/system_health/loading_stories.py b/tools/perf/page_sets/system_health/loading_stories.py
index 59ee12b..64baf9d3 100644
--- a/tools/perf/page_sets/system_health/loading_stories.py
+++ b/tools/perf/page_sets/system_health/loading_stories.py
@@ -461,13 +461,6 @@
       'https://docs.google.com/document/d/1GvzDP-tTLmJ0myRhUAfTYWs3ZUFilUICg8psNHyccwQ/edit?usp=sharing')
   TAGS = [story_tags.YEAR_2019]
 
-  # TODO(crbug.com/1256844): Disable the ForceSynchronousHTMLParsing and
-  # LoaderDataPipeTuning experiments, because they cause failures and
-  # flakiness for this story as-recorded in 2019.
-  EXTRA_BROWSER_ARGUMENTS = [
-      '--disable-features=ForceSynchronousHTMLParsing,LoaderDataPipeTuning'
-  ]
-
 
 class _LoadGmailBaseStory(_LoadingStory):
   NAME = 'load:tools:gmail'
@@ -496,13 +489,6 @@
   TAGS = [story_tags.HEALTH_CHECK, story_tags.YEAR_2019]
   SKIP_LOGIN = False
 
-  # TODO(crbug.com/1256844): Disable the ForceSynchronousHTMLParsing and
-  # LoaderDataPipeTuning experiments, because they cause failures and
-  # flakiness for this story as-recorded in 2019.
-  EXTRA_BROWSER_ARGUMENTS = [
-      '--disable-features=ForceSynchronousHTMLParsing,LoaderDataPipeTuning'
-  ]
-
   def _Login(self, action_runner):
     google_login.NewLoginGoogleAccount(action_runner, 'googletest')
 
@@ -526,13 +512,6 @@
   SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
   SKIP_LOGIN = False
 
-  # TODO(crbug.com/1256844): Disable the ForceSynchronousHTMLParsing and
-  # LoaderDataPipeTuning experiments, because they cause failures and
-  # flakiness for this story as-recorded in 2020.
-  EXTRA_BROWSER_ARGUMENTS = [
-      '--disable-features=ForceSynchronousHTMLParsing,LoaderDataPipeTuning'
-  ]
-
   def _Login(self, action_runner):
     google_login.NewLoginGoogleAccount(action_runner, 'chatfeature')
     action_runner.tab.WaitForDocumentReadyStateToBeComplete()
diff --git a/tools/privacy_budget/font_indexer/font_indexer.cc b/tools/privacy_budget/font_indexer/font_indexer.cc
index 5e59a25..5b09e8f3 100644
--- a/tools/privacy_budget/font_indexer/font_indexer.cc
+++ b/tools/privacy_budget/font_indexer/font_indexer.cc
@@ -100,7 +100,7 @@
 void FontIndexer::FontListHasLoaded(std::unique_ptr<base::ListValue> list) {
   std::cout << kOutputHeader << std::endl;
 
-  base::Value::ConstListView list_view = list->GetList();
+  base::Value::ConstListView list_view = list->GetListDeprecated();
   for (const auto& i : list_view) {
     DCHECK(i.is_list());
     base::Value::ConstListView font = i.GetList();
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 8d11c739..6c024e3 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -355,5 +355,5 @@
  <item id="safe_browsing_extension_telemetry" added_in_milestone="98" content_hash_code="07998e68" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_uploader.cc" />
  <item id="fast_pair_image_decoder" added_in_milestone="100" content_hash_code="04d764bc" os_list="chromeos" file_path="ash/quick_pair/repository/fast_pair/fast_pair_image_decoder_impl.cc" />
  <item id="fast_pair_device_metadata_fetcher" added_in_milestone="100" content_hash_code="0655adc6" os_list="chromeos" file_path="ash/quick_pair/repository/fast_pair/device_metadata_fetcher.cc" />
- <item id="wallpaper_google_photos_photos" added_in_milestone="100" content_hash_code="00ccbbb4" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
+ <item id="wallpaper_google_photos_photos" added_in_milestone="100" content_hash_code="02e5769a" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
 </annotations>
diff --git a/tools/valgrind/asan/asan_symbolize.py b/tools/valgrind/asan/asan_symbolize.py
index 7f999b82..1d4532255 100755
--- a/tools/valgrind/asan/asan_symbolize.py
+++ b/tools/valgrind/asan/asan_symbolize.py
@@ -212,6 +212,29 @@
     return binary_path
 
 
+class CheckUTF8:
+  # This wraps stream and show warnings if stream gets invalid data as utf-8.
+  def __init__(self, stream):
+    self._stream = stream
+
+  def __iter__(self):
+    return self
+
+  def __next__(self):
+
+    l = self._stream.buffer.readline()
+
+    if not l:
+      raise StopIteration
+
+    try:
+      return l.decode()
+    except UnicodeDecodeError:
+      print("WARNING: asan_symbolize.py failed to decode %s (base64 encoded)" %
+            base64.b64encode(l).decode())
+      return ""
+
+
 def main():
   parser = argparse.ArgumentParser(description='Symbolize sanitizer reports.')
   parser.add_argument('--test-summary-json-file',
@@ -253,7 +276,10 @@
       symbolize_snippets_in_json(args.test_summary_json_file, loop)
     else:
       # Process stdin.
-      asan_symbolize.logfile = sys.stdin
+      if sys.version_info.major > 2:
+        asan_symbolize.logfile = CheckUTF8(sys.stdin)
+      else:
+        asan_symbolize.logfile = sys.stdin
       loop.process_logfile()
 
 
diff --git a/ui/accelerated_widget_mac/window_resize_helper_mac.cc b/ui/accelerated_widget_mac/window_resize_helper_mac.cc
index cbd8f69..fddd5e4f 100644
--- a/ui/accelerated_widget_mac/window_resize_helper_mac.cc
+++ b/ui/accelerated_widget_mac/window_resize_helper_mac.cc
@@ -15,6 +15,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_restrictions.h"
+#include "base/time/time.h"
 
 namespace ui {
 namespace {
diff --git a/ui/accessibility/extensions/highcontrast/background.js b/ui/accessibility/extensions/highcontrast/background.js
index 7d443aa..00ff9669 100644
--- a/ui/accessibility/extensions/highcontrast/background.js
+++ b/ui/accessibility/extensions/highcontrast/background.js
@@ -2,88 +2,114 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-Storage.initialize();
-
-function forAllTabs(tabCallback) {
-  chrome.windows.getAll({'populate': true}, function(windows) {
-    for (const window of windows) {
-      for (const tab of window.tabs) {
-        if (isDisallowedUrl(tab.url)) {
-          continue;
-        }
-        tabCallback(tab);
-      }
-    }
-  });
-}
-
-function injectContentScripts() {
-  forAllTabs(tab => chrome.tabs.executeScript(
-      tab.id,
-      {file: 'highcontrast.js', allFrames: true}));
-}
-
-function updateTabs() {
-  forAllTabs(tab => {
-    const msg = {
-      'enabled': Storage.enabled,
-      'scheme': Storage.getSiteScheme(siteFromUrl(tab.url))
-    };
-    chrome.tabs.sendRequest(tab.id, msg);
-  });
-}
-
-function toggleEnabled() {
-  Storage.enabled = !Storage.enabled;
-  updateTabs();
-}
-
-function toggleSite(url) {
-  var site = siteFromUrl(url);
-  var scheme = Storage.getSiteScheme(site);
-  if (scheme > 0) {
-    scheme = 0;
-  } else if (Storage.scheme > 0) {
-    scheme = Storage.scheme;
-  } else {
-    scheme = Storage.SCHEME.defaultValue;
+class Background {
+  constructor() {
+    this.init_();
   }
-  Storage.setSiteScheme(site, scheme);
-  updateTabs();
-}
 
-function init() {
-  injectContentScripts();
-  updateTabs();
-
-  chrome.extension.onRequest.addListener(
-      function(request, sender, sendResponse) {
-        if (request['toggle_global']) {
-          toggleEnabled();
-        }
-        if (request['toggle_site']) {
-          toggleSite(sender.tab ? sender.tab.url : 'www.example.com');
-        }
-        if (request['init']) {
-          var scheme = Storage.scheme;
-          if (sender.tab) {
-            scheme = Storage.getSiteScheme(siteFromUrl(sender.tab.url));
+  /**
+   * @param {function(chrome.tabs.Tab)} tabCallback A function that performs
+   *     some action on each tab.
+   * @private
+   */
+  forAllTabs_(tabCallback) {
+    chrome.windows.getAll({'populate': true}, function(windows) {
+      for (const window of windows) {
+        for (const tab of window.tabs) {
+          if (isDisallowedUrl(tab.url)) {
+            continue;
           }
-          var msg = {
-            'enabled': Storage.enabled,
-            'scheme': scheme
-          };
-          sendResponse(msg);
+          tabCallback(tab);
         }
-      });
+      }
+    });
+  }
 
-  chrome.storage.onChanged.addListener(function() {
-    updateTabs();
-  });
+  /** @public */
+  injectContentScripts() {
+    this.forAllTabs_(tab => chrome.tabs.executeScript(
+        tab.id,
+        {file: 'highcontrast.js', allFrames: true}));
+  }
 
-  if (navigator.appVersion.indexOf('Mac') != -1) {
-    chrome.browserAction.setTitle({'title': 'High Contrast (Cmd+Shift+F11)'});
+  /** @private */
+  updateTabs_() {
+    this.forAllTabs_(tab => {
+      const msg = {
+        'enabled': Storage.enabled,
+        'scheme': Storage.getSiteScheme(siteFromUrl(tab.url))
+      };
+      chrome.tabs.sendRequest(tab.id, msg);
+    });
+  }
+
+  /** @private */
+  toggleEnabled_() {
+    Storage.enabled = !Storage.enabled;
+    this.updateTabs_();
+  }
+
+  /**
+   * @param {string} url
+   * @private
+   */
+  toggleSite_(url) {
+    var site = siteFromUrl(url);
+    var scheme = Storage.getSiteScheme(site);
+    if (scheme > 0) {
+      scheme = 0;
+    } else if (Storage.scheme > 0) {
+      scheme = Storage.scheme;
+    } else {
+      scheme = Storage.SCHEME.defaultValue;
+    }
+    Storage.setSiteScheme(site, scheme);
+    this.updateTabs_();
+  }
+
+  /**
+   * @param {*} request
+   * @param {chrome.runtime.MessageSender} sender
+   * @param {function} sendResponse
+   * @private
+   */
+  handleRequest_(request, sender, sendResponse) {
+    if (request['updateTabs']) {
+      this.updateTabs_();
+    }
+    if (request['toggle_global']) {
+      this.toggleEnabled_();
+    }
+    if (request['toggle_site']) {
+      this.toggleSite_(sender.tab ? sender.tab.url : 'www.example.com');
+    }
+    if (request['init']) {
+      var scheme = Storage.scheme;
+      if (sender.tab) {
+        scheme = Storage.getSiteScheme(siteFromUrl(sender.tab.url));
+      }
+      var msg = {
+        'enabled': Storage.enabled,
+        'scheme': scheme
+      };
+      sendResponse(msg);
+    }
+  }
+
+  /** @private */
+  init_() {
+    this.injectContentScripts();
+    this.updateTabs_();
+
+    chrome.extension.onRequest.addListener(this.handleRequest_.bind(this));
+
+    chrome.storage.onChanged.addListener(this.updateTabs_.bind(this));
+
+    if (navigator.appVersion.indexOf('Mac') != -1) {
+      chrome.browserAction.setTitle({'title': 'High Contrast (Cmd+Shift+F11)'});
+    }
   }
 }
 
-init();
+Storage.initialize();
+const background = new Background();
diff --git a/ui/accessibility/extensions/highcontrast/popup.js b/ui/accessibility/extensions/highcontrast/popup.js
index 6fff319..abcd4ad 100644
--- a/ui/accessibility/extensions/highcontrast/popup.js
+++ b/ui/accessibility/extensions/highcontrast/popup.js
@@ -57,7 +57,7 @@
     } else {
       document.documentElement.setAttribute('hc', 'a0');
     }
-    chrome.extension.getBackgroundPage().updateTabs();
+    chrome.extension.sendRequest({updateTabs: true});
   }
 
   /** @param {number} value */
diff --git a/ui/accessibility/platform/BUILD.gn b/ui/accessibility/platform/BUILD.gn
index a7fb808..3952198 100644
--- a/ui/accessibility/platform/BUILD.gn
+++ b/ui/accessibility/platform/BUILD.gn
@@ -177,6 +177,8 @@
         "inspect/ax_inspect_utils_mac.mm",
         "inspect/ax_transform_mac.h",
         "inspect/ax_transform_mac.mm",
+        "inspect/ax_tree_formatter_mac.h",
+        "inspect/ax_tree_formatter_mac.mm",
         "inspect/ax_tree_indexer_mac.h",
       ]
 
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.h b/ui/accessibility/platform/ax_platform_node_cocoa.h
index ae6b92f..1d373a88 100644
--- a/ui/accessibility/platform/ax_platform_node_cocoa.h
+++ b/ui/accessibility/platform/ax_platform_node_cocoa.h
@@ -16,6 +16,7 @@
 namespace ui {
 
 class AXPlatformNodeBase;
+class AXPlatformNodeDelegate;
 
 struct AXAnnouncementSpec {
   AXAnnouncementSpec();
@@ -49,6 +50,7 @@
 
 @property(nonatomic, readonly) NSRect boundsInScreen;
 @property(nonatomic, readonly) ui::AXPlatformNodeBase* node;
+@property(nonatomic, readonly) ui::AXPlatformNodeDelegate* nodeDelegate;
 
 // Returns the data necessary to queue an NSAccessibility announcement if
 // |eventType| should be announced, or nullptr otherwise.
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.mm b/ui/accessibility/platform/ax_platform_node_cocoa.mm
index a86c053..3fcfc92 100644
--- a/ui/accessibility/platform/ax_platform_node_cocoa.mm
+++ b/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -433,6 +433,10 @@
 
 @synthesize node = _node;
 
+- (ui::AXPlatformNodeDelegate*)nodeDelegate {
+  return _node ? _node->GetDelegate() : nil;
+}
+
 - (BOOL)instanceActive {
   return _node != nullptr;
 }
diff --git a/ui/accessibility/platform/inspect/ax_tree_formatter_base.cc b/ui/accessibility/platform/inspect/ax_tree_formatter_base.cc
index 949ad46..6773c39e 100644
--- a/ui/accessibility/platform/inspect/ax_tree_formatter_base.cc
+++ b/ui/accessibility/platform/inspect/ax_tree_formatter_base.cc
@@ -125,8 +125,8 @@
     return;
 
   const base::Value* children = dict.FindListPath(kChildrenDictAttr);
-  if (children && !children->GetList().empty()) {
-    for (const auto& child_dict : children->GetList()) {
+  if (children && !children->GetListDeprecated().empty()) {
+    for (const auto& child_dict : children->GetListDeprecated()) {
       RecursiveFormatTree(child_dict, contents, depth + 1);
     }
   }
diff --git a/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h
new file mode 100644
index 0000000..f011ed0
--- /dev/null
+++ b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.h
@@ -0,0 +1,74 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TREE_FORMATTER_MAC_H_
+#define UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TREE_FORMATTER_MAC_H_
+
+#include "ui/accessibility/platform/inspect/ax_call_statement_invoker_mac.h"
+#include "ui/accessibility/platform/inspect/ax_tree_formatter_base.h"
+
+namespace ui {
+
+class AX_EXPORT AXTreeFormatterMac : public AXTreeFormatterBase {
+ public:
+  AXTreeFormatterMac();
+  ~AXTreeFormatterMac() override;
+
+  // AXTreeFormatter
+  base::Value BuildTree(AXPlatformNodeDelegate* root) const override;
+  base::Value BuildTreeForSelector(
+      const AXTreeSelector& selector) const override;
+
+  base::Value BuildNode(AXPlatformNodeDelegate* node) const override;
+
+  std::string EvaluateScript(const AXTreeSelector& selector,
+                             const AXInspectScenario& scenario) const override;
+  std::string EvaluateScript(
+      AXPlatformNodeDelegate* root,
+      const std::vector<AXScriptInstruction>& instructions,
+      size_t start_index,
+      size_t end_index) const override;
+  std::string EvaluateScript(
+      id platform_root,
+      const std::vector<AXScriptInstruction>& instructions,
+      size_t start_index,
+      size_t end_index) const;
+
+  // AXTreeFormatterMac
+  base::Value BuildNode(const id node) const;
+
+ protected:
+  void AddDefaultFilters(
+      std::vector<AXPropertyFilter>* property_filters) override;
+
+ private:
+  base::Value BuildTree(const id root) const;
+  base::Value BuildTreeForAXUIElement(AXUIElementRef node) const;
+
+  void RecursiveBuildTree(const id node,
+                          const NSRect& root_rect,
+                          const AXTreeIndexerMac* indexer,
+                          base::Value* dict) const;
+
+  void AddProperties(const id node,
+                     const NSRect& root_rect,
+                     const AXTreeIndexerMac* indexer,
+                     base::Value* dict) const;
+
+  // Invokes an attribute by a property node.
+  AXOptionalNSObject InvokeAttributeFor(
+      const NSAccessibilityElement* cocoa_node,
+      const AXPropertyNode& property_node,
+      const AXTreeIndexerMac* indexer) const;
+
+  base::Value PopulateLocalPosition(const id node,
+                                    const NSRect& root_rect) const;
+
+  std::string ProcessTreeForOutput(
+      const base::DictionaryValue& node) const override;
+};
+
+}  // namespace ui
+
+#endif  // UI_ACCESSIBILITY_PLATFORM_INSPECT_AX_TREE_FORMATTER_MAC_H_
diff --git a/content/browser/accessibility/accessibility_tree_formatter_mac.mm b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm
similarity index 70%
rename from content/browser/accessibility/accessibility_tree_formatter_mac.mm
rename to ui/accessibility/platform/inspect/ax_tree_formatter_mac.mm
index 68196c8..ccd6897 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_mac.mm
+++ b/ui/accessibility/platform/inspect/ax_tree_formatter_mac.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 "content/browser/accessibility/accessibility_tree_formatter_mac.h"
+#include "ui/accessibility/platform/inspect/ax_tree_formatter_mac.h"
 
 #include "base/files/file_path.h"
 #include "base/strings/string_number_conversions.h"
@@ -10,11 +10,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
-#include "content/browser/accessibility/accessibility_tree_formatter_blink.h"
-#include "content/browser/accessibility/browser_accessibility_cocoa.h"
-#include "content/browser/accessibility/browser_accessibility_mac.h"
-#include "content/browser/accessibility/browser_accessibility_manager.h"
-#include "content/public/browser/ax_inspect_factory.h"
+#include "ui/accessibility/platform/ax_platform_node_cocoa.h"
 #include "ui/accessibility/platform/inspect/ax_inspect_scenario.h"
 #include "ui/accessibility/platform/inspect/ax_inspect_utils.h"
 #include "ui/accessibility/platform/inspect/ax_inspect_utils_mac.h"
@@ -31,24 +27,8 @@
 using base::SysNSStringToUTF8;
 using base::SysNSStringToUTF16;
 using std::string;
-using ui::AXPositionOf;
-using ui::AXPropertyFilter;
-using ui::AXPropertyNode;
-using ui::AXNSObjectToBaseValue;
-using ui::AXNilToBaseValue;
-using ui::AXNSPointToBaseValue;
-using ui::AXTreeIndexerMac;
-using ui::AXAttributeNamesOf;
-using ui::AXAttributeValueOf;
-using ui::AXCallStatementInvoker;
-using ui::AXSizeOf;
-using ui::AXFormatValue;
-using ui::AXMakeConst;
-using ui::AXMakeOrderedKey;
-using ui::AXMakeSetKey;
-using ui::AXOptionalNSObject;
 
-namespace content {
+namespace ui {
 
 namespace {
 
@@ -59,11 +39,11 @@
 
 }  // namespace
 
-AccessibilityTreeFormatterMac::AccessibilityTreeFormatterMac() = default;
+AXTreeFormatterMac::AXTreeFormatterMac() = default;
 
-AccessibilityTreeFormatterMac::~AccessibilityTreeFormatterMac() = default;
+AXTreeFormatterMac::~AXTreeFormatterMac() = default;
 
-void AccessibilityTreeFormatterMac::AddDefaultFilters(
+void AXTreeFormatterMac::AddDefaultFilters(
     std::vector<AXPropertyFilter>* property_filters) {
   static NSArray* default_attributes = [@[
     @"AXAutocompleteValue=*", @"AXDescription=*", @"AXRole=*", @"AXTitle=*",
@@ -79,30 +59,27 @@
   }
 }
 
-base::Value AccessibilityTreeFormatterMac::BuildTree(
-    ui::AXPlatformNodeDelegate* root) const {
+base::Value AXTreeFormatterMac::BuildTree(AXPlatformNodeDelegate* root) const {
   DCHECK(root);
-  BrowserAccessibility* internal_root =
-      BrowserAccessibility::FromAXPlatformNodeDelegate(root);
-  return BuildTree(ToBrowserAccessibilityCocoa(internal_root));
+  return BuildTree(root->GetNativeViewAccessible());
 }
 
-base::Value AccessibilityTreeFormatterMac::BuildTreeForSelector(
+base::Value AXTreeFormatterMac::BuildTreeForSelector(
     const AXTreeSelector& selector) const {
   AXUIElementRef node = nil;
-  std::tie(node, std::ignore) = ui::FindAXUIElement(selector);
+  std::tie(node, std::ignore) = FindAXUIElement(selector);
   if (node == nil) {
     return base::Value(base::Value::Type::DICTIONARY);
   }
   return BuildTreeForAXUIElement(node);
 }
 
-base::Value AccessibilityTreeFormatterMac::BuildTreeForAXUIElement(
+base::Value AXTreeFormatterMac::BuildTreeForAXUIElement(
     AXUIElementRef node) const {
   return BuildTree(static_cast<id>(node));
 }
 
-base::Value AccessibilityTreeFormatterMac::BuildTree(const id root) const {
+base::Value AXTreeFormatterMac::BuildTree(const id root) const {
   DCHECK(root);
 
   AXTreeIndexerMac indexer(root);
@@ -117,11 +94,11 @@
   return dict;
 }
 
-std::string AccessibilityTreeFormatterMac::EvaluateScript(
+std::string AXTreeFormatterMac::EvaluateScript(
     const AXTreeSelector& selector,
-    const ui::AXInspectScenario& scenario) const {
+    const AXInspectScenario& scenario) const {
   AXUIElementRef root = nil;
-  std::tie(root, std::ignore) = ui::FindAXUIElement(selector);
+  std::tie(root, std::ignore) = FindAXUIElement(selector);
   if (!root)
     return "";
 
@@ -132,20 +109,18 @@
   return result;
 }
 
-std::string AccessibilityTreeFormatterMac::EvaluateScript(
-    ui::AXPlatformNodeDelegate* root,
-    const std::vector<ui::AXScriptInstruction>& instructions,
+std::string AXTreeFormatterMac::EvaluateScript(
+    AXPlatformNodeDelegate* root,
+    const std::vector<AXScriptInstruction>& instructions,
     size_t start_index,
     size_t end_index) const {
-  BrowserAccessibilityCocoa* platform_root = ToBrowserAccessibilityCocoa(
-      BrowserAccessibility::FromAXPlatformNodeDelegate(root));
-
-  return EvaluateScript(platform_root, instructions, start_index, end_index);
+  return EvaluateScript(root->GetNativeViewAccessible(), instructions,
+                        start_index, end_index);
 }
 
-std::string AccessibilityTreeFormatterMac::EvaluateScript(
+std::string AXTreeFormatterMac::EvaluateScript(
     id platform_root,
-    const std::vector<ui::AXScriptInstruction>& instructions,
+    const std::vector<AXScriptInstruction>& instructions,
     size_t start_index,
     size_t end_index) const {
   base::Value scripts(base::Value::Type::LIST);
@@ -186,15 +161,12 @@
   return contents;
 }
 
-base::Value AccessibilityTreeFormatterMac::BuildNode(
-    ui::AXPlatformNodeDelegate* node) const {
+base::Value AXTreeFormatterMac::BuildNode(AXPlatformNodeDelegate* node) const {
   DCHECK(node);
-  BrowserAccessibility* internal_node =
-      BrowserAccessibility::FromAXPlatformNodeDelegate(node);
-  return BuildNode(ToBrowserAccessibilityCocoa(internal_node));
+  return BuildNode(node->GetNativeViewAccessible());
 }
 
-base::Value AccessibilityTreeFormatterMac::BuildNode(const id node) const {
+base::Value AXTreeFormatterMac::BuildNode(const id node) const {
   DCHECK(node);
 
   AXTreeIndexerMac indexer(node);
@@ -208,15 +180,12 @@
   return dict;
 }
 
-void AccessibilityTreeFormatterMac::RecursiveBuildTree(
-    const id node,
-    const NSRect& root_rect,
-    const AXTreeIndexerMac* indexer,
-    base::Value* dict) const {
-  BrowserAccessibility* platform_node =
-      ui::IsNSAccessibilityElement(node)
-          ? [static_cast<BrowserAccessibilityCocoa*>(node) owner]
-          : nullptr;
+void AXTreeFormatterMac::RecursiveBuildTree(const id node,
+                                            const NSRect& root_rect,
+                                            const AXTreeIndexerMac* indexer,
+                                            base::Value* dict) const {
+  AXPlatformNodeDelegate* platform_node =
+      IsNSAccessibilityElement(node) ? [node nodeDelegate] : nullptr;
 
   if (platform_node && !ShouldDumpNode(*platform_node))
     return;
@@ -225,7 +194,7 @@
   if (platform_node && !ShouldDumpChildren(*platform_node))
     return;
 
-  NSArray* children = ui::AXChildrenOf(node);
+  NSArray* children = AXChildrenOf(node);
   base::Value child_dict_list(base::Value::Type::LIST);
   for (id child in children) {
     base::Value child_dict(base::Value::Type::DICTIONARY);
@@ -235,11 +204,10 @@
   dict->SetPath(kChildrenDictAttr, std::move(child_dict_list));
 }
 
-void AccessibilityTreeFormatterMac::AddProperties(
-    const id node,
-    const NSRect& root_rect,
-    const AXTreeIndexerMac* indexer,
-    base::Value* dict) const {
+void AXTreeFormatterMac::AddProperties(const id node,
+                                       const NSRect& root_rect,
+                                       const AXTreeIndexerMac* indexer,
+                                       base::Value* dict) const {
   // Chromium special attributes.
   dict->SetPath(kLocalPositionDictAttr, PopulateLocalPosition(node, root_rect));
 
@@ -273,7 +241,7 @@
   }
 }
 
-base::Value AccessibilityTreeFormatterMac::PopulateLocalPosition(
+base::Value AXTreeFormatterMac::PopulateLocalPosition(
     const id node,
     const NSRect& root_rect) const {
   // The NSAccessibility position of an object is in global coordinates and
@@ -291,7 +259,7 @@
       static_cast<int>(-node_position.y - node_size.height - root_top)));
 }
 
-std::string AccessibilityTreeFormatterMac::ProcessTreeForOutput(
+std::string AXTreeFormatterMac::ProcessTreeForOutput(
     const base::DictionaryValue& dict) const {
   std::string error_value;
   if (dict.GetString("error", &error_value))
@@ -338,6 +306,6 @@
   return line;
 }
 
-}  // namespace content
+}  // namespace ui
 
 #pragma clang diagnostic pop
diff --git a/ui/base/webui/web_ui_util.cc b/ui/base/webui/web_ui_util.cc
index a6fcc48..85bf5ae 100644
--- a/ui/base/webui/web_ui_util.cc
+++ b/ui/base/webui/web_ui_util.cc
@@ -72,7 +72,7 @@
 
 WindowOpenDisposition GetDispositionFromClick(const base::ListValue* args,
                                               int start_index) {
-  base::Value::ConstListView list = args->GetList();
+  base::Value::ConstListView list = args->GetListDeprecated();
   double button = list[start_index].GetDouble();
   bool alt_key = list[start_index + 1].GetBool();
   bool ctrl_key = list[start_index + 2].GetBool();
diff --git a/ui/color/chromeos/native_color_mixers_chromeos.cc b/ui/color/chromeos/native_color_mixers_chromeos.cc
index 337703a..a83f7b1 100644
--- a/ui/color/chromeos/native_color_mixers_chromeos.cc
+++ b/ui/color/chromeos/native_color_mixers_chromeos.cc
@@ -24,6 +24,8 @@
         high_elevation
             ? color_utils::AlphaBlend(SK_ColorWHITE, gfx::kGoogleGrey900, 0.08f)
             : gfx::kGoogleGrey900;
+    mixer[kColorAshSystemUIMenuBackground] = {
+        SkColorSetA(gfx::kGoogleGrey900, 0xCC)};
     mixer[kColorNativeColor1] = {gfx::kGoogleBlue400};
     mixer[kColorNativeColor1Shade1] = {color_utils::AlphaBlend(
         gfx::kGoogleBlue600, base_color, high_elevation ? 0.4f : 0.3f)};
@@ -40,6 +42,7 @@
             ? gfx::kGoogleGrey700
             : color_utils::AlphaBlend(gfx::kGoogleGrey200, base_color, 0.3f)};
   } else {
+    mixer[kColorAshSystemUIMenuBackground] = {SkColorSetA(SK_ColorWHITE, 0xCC)};
     mixer[kColorNativeColor1] = {gfx::kGoogleBlue500};
     mixer[kColorNativeColor1Shade1] = {gfx::kGoogleBlue300};
     mixer[kColorNativeColor1Shade2] = {gfx::kGoogleBlue100};
diff --git a/ui/color/color_id.h b/ui/color/color_id.h
index 462e2be..17d5aa00 100644
--- a/ui/color/color_id.h
+++ b/ui/color/color_id.h
@@ -79,7 +79,6 @@
   E_CPONLY(kColorLinkForegroundDisabled) \
   E_CPONLY(kColorLinkForegroundPressed) \
   E_CPONLY(kColorMenuBackground) \
-  E_CPONLY(kColorTouchableMenuBackground) \
   E_CPONLY(kColorMenuBorder) \
   E_CPONLY(kColorMenuDropmarker) \
   E_CPONLY(kColorMenuIcon) \
@@ -178,6 +177,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
 #define PLATFORM_SPECIFIC_COLOR_IDS \
+  E_CPONLY(kColorAshSystemUIMenuBackground) \
   E_CPONLY(kColorNativeColor1) \
   E_CPONLY(kColorNativeColor1Shade1) \
   E_CPONLY(kColorNativeColor1Shade2) \
diff --git a/ui/color/ui_color_mixer.cc b/ui/color/ui_color_mixer.cc
index cfc5231..90b0c84 100644
--- a/ui/color/ui_color_mixer.cc
+++ b/ui/color/ui_color_mixer.cc
@@ -204,7 +204,6 @@
                                                   : gfx::kGoogleBlue300};
   mixer[kColorTooltipBackground] = SetAlpha(kColorPrimaryBackground, 0xCC);
   mixer[kColorTooltipForeground] = SetAlpha(kColorPrimaryForeground, 0xDE);
-  mixer[kColorTouchableMenuBackground] = {kColorMenuBackground};
   mixer[kColorTreeBackground] = {kColorPrimaryBackground};
   mixer[kColorTreeNodeBackgroundSelectedFocused] = {
       kColorItemSelectionBackground};
diff --git a/ui/compositor/compositor_lock.h b/ui/compositor/compositor_lock.h
index 364651d..e6a7456 100644
--- a/ui/compositor/compositor_lock.h
+++ b/ui/compositor/compositor_lock.h
@@ -10,6 +10,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/time/time.h"
 #include "ui/compositor/compositor_export.h"
 
 namespace cc {
diff --git a/ui/display/manager/json_converter.cc b/ui/display/manager/json_converter.cc
index 22161a96..54a670a 100644
--- a/ui/display/manager/json_converter.cc
+++ b/ui/display/manager/json_converter.cc
@@ -139,7 +139,7 @@
   if (!field->is_list())
     return false;
 
-  const base::Value::ConstListView list = field->GetList();
+  const base::Value::ConstListView list = field->GetListDeprecated();
   output->reserve(list.size());
 
   for (const base::Value& list_item : list) {
diff --git a/ui/gfx/android/android_surface_control_compat.h b/ui/gfx/android/android_surface_control_compat.h
index 1b279492..c501e5bc 100644
--- a/ui/gfx/android/android_surface_control_compat.h
+++ b/ui/gfx/android/android_surface_control_compat.h
@@ -15,6 +15,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/ref_counted.h"
 #include "base/task/single_thread_task_runner.h"
+#include "base/time/time.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/gfx_export.h"
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
index cfc70450..083e23c 100644
--- a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
+++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -205,8 +205,7 @@
     } else {
       subsurface->ConfigureAndShowSurface(
           config->bounds_rect, root_config->bounds_rect,
-          root_config->surface_scale_factor,
-          reference_above ? nullptr : root_surface, reference_above);
+          root_config->surface_scale_factor, nullptr, reference_above);
       ApplySurfaceConfigure(frame.get(), surface, config, true);
       reference_above = surface;
       surface->Commit(false);
diff --git a/ui/views/controls/menu/menu_config.cc b/ui/views/controls/menu/menu_config.cc
index 9d2571a..96469312 100644
--- a/ui/views/controls/menu/menu_config.cc
+++ b/ui/views/controls/menu/menu_config.cc
@@ -17,7 +17,7 @@
 MenuConfig::~MenuConfig() = default;
 
 int MenuConfig::CornerRadiusForMenu(const MenuController* controller) const {
-  if (controller && controller->use_touchable_layout())
+  if (controller && controller->use_ash_system_ui_layout())
     return touchable_corner_radius;
   if (controller && (controller->IsCombobox() ||
                      (!win11_style_menus && controller->IsContextMenu())))
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index 2571ad8b..5fdf8d2 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -1985,8 +1985,9 @@
     return true;
   }
 
-  // Return false for points on touchable menu shadows, to search parent menus.
-  if (use_touchable_layout_)
+  // Return false for points on ash system UI menu shadows, to search parent
+  // menus.
+  if (use_ash_system_ui_layout_)
     return false;
 
   // While the mouse isn't over a menu item or the scroll buttons of menu, it
diff --git a/ui/views/controls/menu/menu_controller.h b/ui/views/controls/menu/menu_controller.h
index 9d4dbbb4..ef5fe71 100644
--- a/ui/views/controls/menu/menu_controller.h
+++ b/ui/views/controls/menu/menu_controller.h
@@ -226,10 +226,10 @@
   // Only used for testing.
   static void TurnOffMenuSelectionHoldForTest();
 
-  void set_use_touchable_layout(bool use_touchable_layout) {
-    use_touchable_layout_ = use_touchable_layout;
+  void set_use_ash_system_ui_layout(bool value) {
+    use_ash_system_ui_layout_ = value;
   }
-  bool use_touchable_layout() const { return use_touchable_layout_; }
+  bool use_ash_system_ui_layout() const { return use_ash_system_ui_layout_; }
 
   // Notifies |this| that |menu_item| is being destroyed.
   void OnMenuItemDestroying(MenuItemView* menu_item);
@@ -787,8 +787,8 @@
   // Set to true if the menu item was selected by touch.
   bool item_selected_by_touch_ = false;
 
-  // Whether to use the touchable layout.
-  bool use_touchable_layout_ = false;
+  // Whether to use the ash system UI specific layout.
+  bool use_ash_system_ui_layout_ = false;
 
   // During mouse event handling, this is the RootView to forward mouse events
   // to. We need this, because if we forward one event to it (e.g., mouse
diff --git a/ui/views/controls/menu/menu_controller_unittest.cc b/ui/views/controls/menu/menu_controller_unittest.cc
index 7744da0..56d601e 100644
--- a/ui/views/controls/menu/menu_controller_unittest.cc
+++ b/ui/views/controls/menu/menu_controller_unittest.cc
@@ -2418,7 +2418,7 @@
 
 // Test that submenus are displayed within the screen bounds on smaller screens.
 TEST_P(MenuControllerTest, TestSubmenuFitsOnScreen) {
-  menu_controller()->set_use_touchable_layout(true);
+  menu_controller()->set_use_ash_system_ui_layout(true);
   MenuItemView* sub_item = menu_item()->GetSubmenu()->GetMenuItemAt(0);
   sub_item->AppendMenuItem(11, u"Subitem.One");
 
diff --git a/ui/views/controls/menu/menu_item_view.cc b/ui/views/controls/menu/menu_item_view.cc
index 20f678d..21b630c 100644
--- a/ui/views/controls/menu/menu_item_view.cc
+++ b/ui/views/controls/menu/menu_item_view.cc
@@ -743,7 +743,8 @@
       if (config.icons_in_label || type_ == Type::kCheckbox ||
           type_ == Type::kRadio)
         x = label_start_;
-      if (GetMenuController() && GetMenuController()->use_touchable_layout())
+      if (GetMenuController() &&
+          GetMenuController()->use_ash_system_ui_layout())
         x = config.touchable_item_horizontal_padding;
 
       int y =
@@ -753,7 +754,8 @@
 
     if (radio_check_image_view_) {
       int x = config.item_horizontal_padding;
-      if (GetMenuController() && GetMenuController()->use_touchable_layout())
+      if (GetMenuController() &&
+          GetMenuController()->use_ash_system_ui_layout())
         x = config.touchable_item_horizontal_padding;
       int y =
           (height() + GetTopMargin() - GetBottomMargin() - kMenuCheckSize) / 2;
@@ -842,16 +844,17 @@
   if (has_icons_)
     icon_area_width_ = std::max(icon_area_width_, GetMaxIconViewWidth());
 
-  const bool use_touchable_layout =
-      GetMenuController() && GetMenuController()->use_touchable_layout();
+  const bool use_ash_system_ui_layout =
+      GetMenuController() && GetMenuController()->use_ash_system_ui_layout();
   label_start_ =
-      (use_touchable_layout ? config.touchable_item_horizontal_padding
-                            : config.item_horizontal_padding) +
+      (use_ash_system_ui_layout ? config.touchable_item_horizontal_padding
+                                : config.item_horizontal_padding) +
       icon_area_width_;
 
   const bool use_padding = config.always_use_icon_to_label_padding ||
                            (!config.icons_in_label && has_icons_) ||
-                           HasChecksOrRadioButtons() || use_touchable_layout;
+                           HasChecksOrRadioButtons() ||
+                           use_ash_system_ui_layout;
   int padding = use_padding ? LayoutProvider::Get()->GetDistanceMetric(
                                   DISTANCE_RELATED_LABEL_HORIZONTAL)
                             : 0;
@@ -941,7 +944,7 @@
       return *font_list;
     }
   }
-  if (GetMenuController() && GetMenuController()->use_touchable_layout())
+  if (GetMenuController() && GetMenuController()->use_ash_system_ui_layout())
     return style::GetFont(style::CONTEXT_TOUCH_MENU, style::STYLE_PRIMARY);
   return MenuConfig::instance().font_list;
 }
@@ -1152,7 +1155,7 @@
 
 SkColor MenuItemView::GetTextColor(bool minor, bool paint_as_selected) const {
   style::TextContext context =
-      GetMenuController() && GetMenuController()->use_touchable_layout()
+      GetMenuController() && GetMenuController()->use_ash_system_ui_layout()
           ? style::CONTEXT_TOUCH_MENU
           : style::CONTEXT_MENU;
 
@@ -1271,7 +1274,7 @@
 
   const gfx::FontList& font_list = GetFontList();
 
-  if (GetMenuController() && GetMenuController()->use_touchable_layout()) {
+  if (GetMenuController() && GetMenuController()->use_ash_system_ui_layout()) {
     dimensions.height = menu_config.touchable_menu_height;
 
     // For container MenuItemViews, the width components should only include the
@@ -1372,7 +1375,7 @@
   const MenuConfig& config = MenuConfig::instance();
 
   // Touchable items with icons do not respect |label_start_|.
-  if (GetMenuController() && GetMenuController()->use_touchable_layout() &&
+  if (GetMenuController() && GetMenuController()->use_ash_system_ui_layout() &&
       icon_view_) {
     return 2 * config.touchable_item_horizontal_padding +
            icon_view_->GetPreferredSize().width();
diff --git a/ui/views/controls/menu/menu_item_view_unittest.cc b/ui/views/controls/menu/menu_item_view_unittest.cc
index a408129..2df7dac 100644
--- a/ui/views/controls/menu/menu_item_view_unittest.cc
+++ b/ui/views/controls/menu/menu_item_view_unittest.cc
@@ -214,7 +214,7 @@
     menu_delegate_ = std::make_unique<test::TestMenuDelegate>();
     menu_item_view_ = new TestMenuItemView(menu_delegate_.get());
     menu_runner_ = std::make_unique<MenuRunner>(
-        menu_item_view_, MenuRunner::USE_TOUCHABLE_LAYOUT);
+        menu_item_view_, MenuRunner::USE_ASH_SYS_UI_LAYOUT);
     menu_runner_->RunMenuAt(widget_.get(), nullptr, gfx::Rect(),
                             MenuAnchorPosition::kTopLeft,
                             ui::MENU_SOURCE_KEYBOARD);
diff --git a/ui/views/controls/menu/menu_runner.h b/ui/views/controls/menu/menu_runner.h
index da729091..17c074c 100644
--- a/ui/views/controls/menu/menu_runner.h
+++ b/ui/views/controls/menu/menu_runner.h
@@ -97,15 +97,13 @@
     // finger after the context menu of the item is opened.
     SEND_GESTURE_EVENTS_TO_OWNER = 1 << 7,
 
-    // Whether to use the touchable layout for this context menu. This will be
-    // set by context menu inside system UI only (e.g, the context menu while
-    // right clicking the wallpaper of a ChromeBook). Thus, this can be used to
-    // differentiate the context menu inside system UI from others. It is useful
-    // if we want to customize some attributes of the context menu inside system
-    // UI, e.g, colors.
-    // TODO(minch): Rename this to USE_ASH_SYS_UI_LAYOUT. Rename related
-    // functions/variables as well.
-    USE_TOUCHABLE_LAYOUT = 1 << 8,
+    // Applying the system UI specific layout to the context menu. This should
+    // be set for the context menu inside system UI only (e.g, the context menu
+    // while right clicking the wallpaper of a ChromeBook). Thus, this can be
+    // used to differentiate the context menu inside system UI from others. It
+    // is useful if we want to customize some attributes of the context menu
+    // inside system UI, e.g, colors.
+    USE_ASH_SYS_UI_LAYOUT = 1 << 8,
 
     // Similar to COMBOBOX, but does not capture the mouse and lets some keys
     // propagate back to the parent so the combobox content can be edited even
diff --git a/ui/views/controls/menu/menu_runner_impl.cc b/ui/views/controls/menu/menu_runner_impl.cc
index f16a6ba..4311a51 100644
--- a/ui/views/controls/menu/menu_runner_impl.cc
+++ b/ui/views/controls/menu/menu_runner_impl.cc
@@ -174,8 +174,8 @@
     controller->set_combobox_type(ComboboxType::kNone);
   controller->set_send_gesture_events_to_owner(
       (run_types & MenuRunner::SEND_GESTURE_EVENTS_TO_OWNER) != 0);
-  controller->set_use_touchable_layout(
-      (run_types & MenuRunner::USE_TOUCHABLE_LAYOUT) != 0);
+  controller->set_use_ash_system_ui_layout(
+      (run_types & MenuRunner::USE_ASH_SYS_UI_LAYOUT) != 0);
   controller_ = controller->AsWeakPtr();
   menu_->set_controller(controller_.get());
   menu_->PrepareForRun(owns_controller_, has_mnemonics,
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc
index 82b42c49..25317d33 100644
--- a/ui/views/controls/menu/menu_scroll_view_container.cc
+++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -392,15 +392,19 @@
   const MenuConfig& menu_config = MenuConfig::instance();
   const int border_radius = menu_config.CornerRadiusForMenu(
       content_view_->GetMenuItem()->GetMenuController());
-  const bool use_touchable_layout =
-      content_view_->GetMenuItem()->GetMenuController()->use_touchable_layout();
-  ui::ColorId id = use_touchable_layout ? ui::kColorTouchableMenuBackground
-                                        : ui::kColorMenuBackground;
+  ui::ColorId id = ui::kColorMenuBackground;
+  const bool use_ash_system_ui_layout = content_view_->GetMenuItem()
+                                            ->GetMenuController()
+                                            ->use_ash_system_ui_layout();
+#if BUILDFLAG(IS_CHROMEOS)
+  if (use_ash_system_ui_layout)
+    id = ui::kColorAshSystemUIMenuBackground;
+#endif
   const SkColor color =
       GetWidget() ? GetColorProvider()->GetColor(id) : gfx::kPlaceholderColor;
   auto bubble_border = std::make_unique<BubbleBorder>(
       arrow_, BubbleBorder::STANDARD_SHADOW, color);
-  if (use_touchable_layout || border_radius > 0) {
+  if (use_ash_system_ui_layout || border_radius > 0) {
     bubble_border->SetCornerRadius(border_radius);
     bubble_border->set_md_shadow_elevation(
         menu_config.touchable_menu_shadow_elevation);
diff --git a/ui/views/controls/menu/submenu_view.cc b/ui/views/controls/menu/submenu_view.cc
index 253b9c44..680a660 100644
--- a/ui/views/controls/menu/submenu_view.cc
+++ b/ui/views/controls/menu/submenu_view.cc
@@ -187,7 +187,7 @@
                minimum_preferred_width_ - 2 * insets.width()));
 
   if (parent_menu_item_->GetMenuController() &&
-      parent_menu_item_->GetMenuController()->use_touchable_layout()) {
+      parent_menu_item_->GetMenuController()->use_ash_system_ui_layout()) {
     width = std::max(touchable_minimum_width, width);
   }
 
diff --git a/ui/web_dialogs/web_dialog_ui.cc b/ui/web_dialogs/web_dialog_ui.cc
index ce7d541..d7f8b3e 100644
--- a/ui/web_dialogs/web_dialog_ui.cc
+++ b/ui/web_dialogs/web_dialog_ui.cc
@@ -104,9 +104,9 @@
   WebDialogDelegate* delegate = GetDelegate(web_ui_->GetWebContents());
   if (delegate) {
     std::string json_retval;
-    if (args && !args->GetList().empty()) {
-      if (args->GetList()[0].is_string())
-        json_retval = args->GetList()[0].GetString();
+    if (args && !args->GetListDeprecated().empty()) {
+      if (args->GetListDeprecated()[0].is_string())
+        json_retval = args->GetListDeprecated()[0].GetString();
       else
         NOTREACHED() << "Could not read JSON argument";
     }
diff --git a/ui/webui/resources/cr_components/BUILD.gn b/ui/webui/resources/cr_components/BUILD.gn
index ef5a94c1..f1953c45 100644
--- a/ui/webui/resources/cr_components/BUILD.gn
+++ b/ui/webui/resources/cr_components/BUILD.gn
@@ -136,6 +136,7 @@
       "chromeos/bluetooth/bluetooth_pairing_request_code_page.js",
       "chromeos/bluetooth/bluetooth_pairing_confirm_code_page.js",
       "chromeos/bluetooth/bluetooth_pairing_device_item.js",
+      "chromeos/bluetooth/bluetooth_battery_icon_percentage.js",
       "chromeos/bluetooth/bluetooth_device_battery_info.js",
       "chromeos/bluetooth/bluetooth_pairing_ui.js",
       "chromeos/cellular_setup/activation_code_page.m.js",
diff --git a/ui/webui/resources/cr_components/app_management/more_permissions_item.html b/ui/webui/resources/cr_components/app_management/more_permissions_item.html
index 4c05db9..c6b9f26 100644
--- a/ui/webui/resources/cr_components/app_management/more_permissions_item.html
+++ b/ui/webui/resources/cr_components/app_management/more_permissions_item.html
@@ -1,4 +1,4 @@
-<style include="app-management-cros-shared-css">
+<style include="app-management-shared-css">
   :host {
     align-items: center;
     cursor: pointer;
diff --git a/ui/webui/resources/cr_components/app_management/permission_item.html b/ui/webui/resources/cr_components/app_management/permission_item.html
index 2c68cd00..e786762 100644
--- a/ui/webui/resources/cr_components/app_management/permission_item.html
+++ b/ui/webui/resources/cr_components/app_management/permission_item.html
@@ -21,6 +21,8 @@
       icon="[[icon]]"
       label="[[permissionLabel]]"
       managed="[[isManaged_(app, permissionType)]]"
-      value="[[getValue_(app, permissionType)]]">
+      value="[[getValue_(app, permissionType)]]"
+      aria-description="Click to toggle [[permissionLabel]] permissions."
+      i18n-aria-descrirption="Label for toggle button to change [[permissionLabel]] permissions.">
   </app-management-toggle-row>
 </template>
diff --git a/ui/webui/resources/cr_components/app_management/toggle_row.html b/ui/webui/resources/cr_components/app_management/toggle_row.html
index 8bf549d8..a08ca34 100644
--- a/ui/webui/resources/cr_components/app_management/toggle_row.html
+++ b/ui/webui/resources/cr_components/app_management/toggle_row.html
@@ -39,6 +39,9 @@
   <cr-toggle id="toggle"
       checked="[[value]]"
       disabled$="[[managed]]"
-      aria-label$="[[label]]">
+      role="button"
+      tabindex="0"
+      aria-pressed="[[value]]"
+      aria-label="[[label]]">
   </cr-toggle>
 </div>
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn b/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
index 62106b6e..873204a 100644
--- a/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/bluetooth/BUILD.gn
@@ -11,6 +11,7 @@
   is_polymer3 = true
   deps = [
     ":bluetooth_base_page",
+    ":bluetooth_battery_icon_percentage",
     ":bluetooth_device_battery_info",
     ":bluetooth_dialog",
     ":bluetooth_icon",
@@ -137,6 +138,14 @@
   ]
 }
 
+js_library("bluetooth_battery_icon_percentage") {
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+    "//ui/webui/resources/cr_components/chromeos/bluetooth:bluetooth_utils",
+    "//ui/webui/resources/js:i18n_behavior.m",
+  ]
+}
+
 js_library("bluetooth_device_battery_info") {
   deps = [
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
@@ -170,6 +179,7 @@
     "bluetooth_pairing_device_item.js",
     "bluetooth_pairing_ui.js",
     "bluetooth_base_page.js",
+    "bluetooth_battery_icon_percentage.js",
     "bluetooth_device_battery_info.js",
     "bluetooth_spinner_page.js",
   ]
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.html b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.html
new file mode 100644
index 0000000..5966806d
--- /dev/null
+++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.html
@@ -0,0 +1,30 @@
+<style include="cr-shared-style">
+  :host([is-low-battery_]) #container {
+    --iron-icon-fill-color: var(--cros-icon-color-alert);
+    color: var(--cros-text-color-alert);
+  }
+
+  :host([is-multiple-battery_]) #container {
+    padding-end: 6px;
+  }
+
+  :host(:not([is-low-battery_])) #container {
+    --iron-icon-fill-color: var(--cros-icon-color-secondary);
+    color: var(--cros-icon-color-secondary);
+  }
+
+  .battery-icon {
+    --iron-icon-height: 16px;
+    --iron-icon-width: 16px;
+    margin-inline-end: -2px;
+    padding-bottom: 2px;
+  }
+</style>
+<span id="container">
+  <iron-icon id="batteryIcon" class="battery-icon"
+      icon="[[getBatteryIcon_(device, batteryType)]]">
+  </iron-icon>
+  <span id="batteryPercentage">
+    [[getBatteryPercentageString_(device, batteryType)]]
+  </span>
+</span>
\ No newline at end of file
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js
new file mode 100644
index 0000000..703d39e
--- /dev/null
+++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_battery_icon_percentage.js
@@ -0,0 +1,205 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview
+ * View displaying a dynamically colored/sized battery icon and
+ * corresponding battery percentage string for a given device and battery
+ * type.
+ */
+
+import '../../../cr_elements/shared_style_css.m.js';
+import './bluetooth_icons.js';
+
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js';
+import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assert} from 'chrome://resources/js/assert.m.js';
+
+import {BatteryType} from './bluetooth_types.js';
+import {getBatteryPercentage, hasAnyDetailedBatteryInfo} from './bluetooth_utils.js';
+
+/**
+ * The threshold percentage where any battery percentage lower is considered
+ * 'low battery'.
+ * @type {number}
+ */
+const LOW_BATTERY_THRESHOLD_PERCENTAGE = 25;
+
+/**
+ * Ranges for each battery icon, where the value of the first index is the
+ * minimum battery percentage in the range (inclusive), and the second index is
+ * the maximum battery percentage in the range (inclusive).
+ * @type {Array<Array<number>>}
+ */
+const BATTERY_ICONS_RANGES = [
+  [0, 7], [8, 14], [15, 21], [22, 28], [29, 35], [36, 42], [43, 49], [50, 56],
+  [57, 63], [64, 70], [71, 77], [78, 85], [86, 92], [93, 100]
+];
+
+/**
+ * @constructor
+ * @extends {PolymerElement}
+ * @implements {I18nBehaviorInterface}
+ */
+const BluetoothBatteryIconPercentageElementBase =
+    mixinBehaviors([I18nBehavior], PolymerElement);
+
+/** @polymer */
+export class BluetoothBatteryIconPercentageElement extends
+    BluetoothBatteryIconPercentageElementBase {
+  static get is() {
+    return 'bluetooth-battery-icon-percentage';
+  }
+
+  static get template() {
+    return html`{__html_template__}`;
+  }
+
+  static get properties() {
+    return {
+      /**
+       * @type {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
+       */
+      device: {
+        type: Object,
+      },
+
+      /**
+       * The BatteryType of this component.
+       *
+       * @type {!BatteryType}
+       */
+      batteryType: {
+        type: Object,
+      },
+
+      /**
+       * Boolean used to reflect whether the percentage should be labeled
+       * with the battery type, e.g. (Left).
+       *
+       * @type {!boolean}
+       */
+      isTypeLabeled: {type: Boolean, default: false},
+
+      /** @protected {boolean} */
+      isLowBattery_: {
+        reflectToAttribute: true,
+        type: Boolean,
+        computed: 'computeIsLowBattery_(device, batteryType)',
+      },
+
+      /** @protected {boolean} */
+      isMultipleBattery_: {
+        reflectToAttribute: true,
+        type: Boolean,
+        computed: 'computeIsMultipleBattery_(batteryType)',
+      },
+    };
+  }
+
+  /**
+   * @param {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
+   *     device
+   * @param {!BatteryType} batteryType
+   * @return {boolean}
+   * @private
+   */
+  computeIsLowBattery_(device, batteryType) {
+    const batteryPercentage = getBatteryPercentage(device, batteryType);
+    if (batteryPercentage === undefined) {
+      return false;
+    }
+    return batteryPercentage < LOW_BATTERY_THRESHOLD_PERCENTAGE;
+  }
+
+  /**
+   * @param {!BatteryType} batteryType
+   * @return {boolean}
+   * @private
+   */
+  computeIsMultipleBattery_(batteryType) {
+    switch (batteryType) {
+      case BatteryType.LEFT_BUD:
+      case BatteryType.CASE:
+      case BatteryType.RIGHT_BUD:
+        return true;
+      case BatteryType.DEFAULT:
+      default:
+        return false;
+    }
+  }
+
+  /**
+   * @param {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
+   *     device
+   * @param {!BatteryType} batteryType
+   * @return {string}
+   * @private
+   */
+  getBatteryPercentageString_(device, batteryType) {
+    const batteryPercentage = getBatteryPercentage(device, batteryType);
+    if (batteryPercentage === undefined) {
+      return '';
+    }
+
+    // If unlabeled, don't add the battery type to the percentage string.
+    if (!this.isTypeLabeled) {
+      return this.i18n(
+          'bluetoothPairedDeviceItemBatteryPercentage', batteryPercentage);
+    }
+
+    switch (batteryType) {
+      case BatteryType.DEFAULT:
+        return this.i18n(
+            'bluetoothPairedDeviceItemBatteryPercentage', batteryPercentage);
+      case BatteryType.LEFT_BUD:
+        return this.i18n(
+            'bluetoothPairedDeviceItemLeftBudTrueWirelessBatteryPercentage',
+            batteryPercentage);
+      case BatteryType.CASE:
+        return this.i18n(
+            'bluetoothPairedDeviceItemCaseTrueWirelessBatteryPercentage',
+            batteryPercentage);
+      case BatteryType.RIGHT_BUD:
+        return this.i18n(
+            'bluetoothPairedDeviceItemRightBudTrueWirelessBatteryPercentage',
+            batteryPercentage);
+    }
+
+    return '';
+  }
+
+  /**
+   * @param {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
+   *     device
+   * @param {!BatteryType} batteryType
+   * @return {string}
+   * @private
+   */
+  getBatteryIcon_(device, batteryType) {
+    const batteryPercentage = getBatteryPercentage(device, batteryType);
+    if (batteryPercentage === undefined) {
+      return '';
+    }
+
+    // Range should always find a value because this element should not be
+    // showing if batteryPercentage is out of bounds.
+    const range = BATTERY_ICONS_RANGES.find(range => {
+      return range[0] <= batteryPercentage && batteryPercentage <= range[1];
+    });
+    assert(
+        !!range && range.length === 2, 'Battery percentage range is invalid');
+
+    return 'bluetooth:battery-' + range[0] + '-' + range[1];
+  }
+
+  /** @return {boolean} */
+  getIsLowBatteryForTest() {
+    return this.isLowBattery_;
+  }
+}
+
+customElements.define(
+    BluetoothBatteryIconPercentageElement.is,
+    BluetoothBatteryIconPercentageElement);
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.html b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.html
index 927bce40..0b7b5b4c 100644
--- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.html
+++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.html
@@ -1,102 +1,44 @@
 <style include="cr-shared-style">
-  :host([is-default-low-battery_]) #defaultBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-alert);
-    color: var(--cros-text-color-alert);
-  }
-
-  :host(:not([is-default-low-battery_])) #defaultBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-secondary);
-    color: var(--cros-icon-color-secondary);
-  }
-
-  :host([is-left-bud-low-battery_]) #leftBudBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-alert);
-    color: var(--cros-text-color-alert);
-  }
-
-  :host(:not([is-left-bud-low-battery_])) #leftBudBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-secondary);
-    color: var(--cros-icon-color-secondary);
-  }
-
-  :host([is-case-low-battery_]) #caseBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-alert);
-    color: var(--cros-text-color-alert);
-  }
-
-  :host(:not([is-case-low-battery_])) #caseBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-secondary);
-    color: var(--cros-icon-color-secondary);
-  }
-
-  :host([is-right-bud-low-battery_]) #rightBudBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-alert);
-    color: var(--cros-text-color-alert);
-  }
-
-  :host(:not([is-right-bud-low-battery_])) #rightBudBatteryContainer {
-    --iron-icon-fill-color: var(--cros-icon-color-secondary);
-    color: var(--cros-icon-color-secondary);
-  }
-
-  .battery-icon {
-    --iron-icon-height: 16px;
-    --iron-icon-width: 16px;
-    margin-inline-end: -2px;
-    padding-bottom: 2px;
-  }
-
-  .multiple-battery {
-    padding-end: 6px;
-  }
 </style>
 <template is="dom-if" if="[[!showMultipleBatteries_]]" restamp>
-  <div id="defaultBatteryContainer">
-    <iron-icon id="defaultBatteryIcon" class="battery-icon"
-        icon="[[getBatteryIcon_(device, BatteryType.DEFAULT)]]">
-    </iron-icon>
-    <span id="defaultBatteryPercentage">
-      [[getBatteryPercentageString_(device, BatteryType.DEFAULT)]]
-    </span>
-  </div>
+  <bluetooth-battery-icon-percentage
+      id="defaultBattery"
+      device="[[device]]"
+      battery-type="[[BatteryType.DEFAULT]]"
+      is-type-labeled>
+  </bluetooth-battery-icon-percentage>
 </template>
 
 <template is="dom-if" if="[[showMultipleBatteries_]]" restamp>
   <div>
     <template is="dom-if"
         if="[[shouldShowBattery_(device, BatteryType.LEFT_BUD)]]" restamp>
-      <span id="leftBudBatteryContainer" class=".multiple-battery">
-        <iron-icon id="leftBudBatteryIcon" class="battery-icon"
-            icon="[[getBatteryIcon_(device, BatteryType.LEFT_BUD)]]">
-        </iron-icon>
-        <span id="leftBudBatteryPercentage">
-          [[getBatteryPercentageString_(device, BatteryType.LEFT_BUD)]]
-        </span>
-      </span>
+      <bluetooth-battery-icon-percentage
+          id="leftBudBattery"
+          device="[[device]]"
+          battery-type="[[BatteryType.LEFT_BUD]]"
+          is-type-labeled>
+      </bluetooth-battery-icon-percentage>
     </template>
 
     <template is="dom-if"
         if="[[shouldShowBattery_(device, BatteryType.CASE)]]" restamp>
-      <span id="caseBatteryContainer" class=".multiple-battery">
-        <iron-icon id="caseBatteryIcon" class="battery-icon"
-            icon="[[getBatteryIcon_(device, BatteryType.CASE)]]">
-        </iron-icon>
-        <span id="caseBatteryPercentage">
-          [[getBatteryPercentageString_(device, BatteryType.CASE)]]
-        </span>
-      </span>
+      <bluetooth-battery-icon-percentage
+          id="caseBattery"
+          device="[[device]]"
+          battery-type="[[BatteryType.CASE]]"
+          is-type-labeled>
+      </bluetooth-battery-icon-percentage>
     </template>
 
     <template is="dom-if"
         if="[[shouldShowBattery_(device, BatteryType.RIGHT_BUD)]]" restamp>
-      <span id="rightBudBatteryContainer" class=".multiple-battery">
-        <iron-icon id="rightBudBatteryIcon" class="battery-icon"
-            icon="[[getBatteryIcon_(device, BatteryType.RIGHT_BUD)]]">
-        </iron-icon>
-        <span id="rightBudBatteryPercentage">
-          [[getBatteryPercentageString_(device, BatteryType.RIGHT_BUD)]]
-        </span>
-      </span>
+      <bluetooth-battery-icon-percentage
+          id="rightBudBattery"
+          device="[[device]]"
+          battery-type="[[BatteryType.RIGHT_BUD]]"
+          is-type-labeled>
+      </bluetooth-battery-icon-percentage>
     </template>
   </div>
 </template>
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.js
index 2ef033c..63117e2 100644
--- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.js
+++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_device_battery_info.js
@@ -8,44 +8,15 @@
  */
 
 import '../../../cr_elements/shared_style_css.m.js';
-import './bluetooth_icons.js';
+import './bluetooth_battery_icon_percentage.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/js/i18n_behavior.m.js';
-import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {assert} from 'chrome://resources/js/assert.m.js';
+import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {BatteryType} from './bluetooth_types.js';
 import {getBatteryPercentage, hasAnyDetailedBatteryInfo} from './bluetooth_utils.js';
 
-/**
- * The threshold percentage where any battery percentage lower is considered
- * 'low battery'.
- * @type {number}
- */
-const LOW_BATTERY_THRESHOLD_PERCENTAGE = 25;
-
-/**
- * Ranges for each battery icon, where the value of the first index is the
- * minimum battery percentage in the range (inclusive), and the second index is
- * the maximum battery percentage in the range (inclusive).
- * @type {Array<Array<number>>}
- */
-const BATTERY_ICONS_RANGES = [
-  [0, 7], [8, 14], [15, 21], [22, 28], [29, 35], [36, 42], [43, 49], [50, 56],
-  [57, 63], [64, 70], [71, 77], [78, 85], [86, 92], [93, 100]
-];
-
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {I18nBehaviorInterface}
- */
-const BluetoothDeviceBatteryInfoElementBase =
-    mixinBehaviors([I18nBehavior], PolymerElement);
-
 /** @polymer */
-export class BluetoothDeviceBatteryInfoElement extends
-    BluetoothDeviceBatteryInfoElementBase {
+export class BluetoothDeviceBatteryInfoElement extends PolymerElement {
   static get is() {
     return 'bluetooth-device-battery-info';
   }
@@ -76,34 +47,6 @@
       },
 
       /** @protected {boolean} */
-      isDefaultLowBattery_: {
-        reflectToAttribute: true,
-        type: Boolean,
-        computed: 'computeIsLowBattery_(device, BatteryType.DEFAULT)',
-      },
-
-      /** @protected {boolean} */
-      isLeftBudLowBattery_: {
-        reflectToAttribute: true,
-        type: Boolean,
-        computed: 'computeIsLowBattery_(device, BatteryType.LEFT_BUD)',
-      },
-
-      /** @protected {boolean} */
-      isRightBudLowBattery_: {
-        reflectToAttribute: true,
-        type: Boolean,
-        computed: 'computeIsLowBattery_(device, BatteryType.RIGHT_BUD)',
-      },
-
-      /** @protected {boolean} */
-      isCaseLowBattery_: {
-        reflectToAttribute: true,
-        type: Boolean,
-        computed: 'computeIsLowBattery_(device, BatteryType.CASE)',
-      },
-
-      /** @protected {boolean} */
       showMultipleBatteries_: {
         type: Boolean,
         computed: 'computeShowMultipleBatteries_(device)',
@@ -114,21 +57,6 @@
   /**
    * @param {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
    *     device
-   * @param {!BatteryType} batteryType
-   * @return {boolean}
-   * @private
-   */
-  computeIsLowBattery_(device, batteryType) {
-    const batteryPercentage = getBatteryPercentage(device, batteryType);
-    if (batteryPercentage === undefined) {
-      return false;
-    }
-    return batteryPercentage < LOW_BATTERY_THRESHOLD_PERCENTAGE;
-  }
-
-  /**
-   * @param {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
-   *     device
    * @return {boolean}
    * @private
    */
@@ -146,84 +74,6 @@
   shouldShowBattery_(device, batteryType) {
     return getBatteryPercentage(device, batteryType) !== undefined;
   }
-
-  /**
-   * @param {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
-   *     device
-   * @param {!BatteryType} batteryType
-   * @return {string}
-   * @private
-   */
-  getBatteryPercentageString_(device, batteryType) {
-    const batteryPercentage = getBatteryPercentage(device, batteryType);
-    if (batteryPercentage === undefined) {
-      return '';
-    }
-
-    switch (batteryType) {
-      case BatteryType.DEFAULT:
-        return this.i18n(
-            'bluetoothPairedDeviceItemBatteryPercentage', batteryPercentage);
-      case BatteryType.LEFT_BUD:
-        return this.i18n(
-            'bluetoothPairedDeviceItemLeftBudTrueWirelessBatteryPercentage',
-            batteryPercentage);
-      case BatteryType.CASE:
-        return this.i18n(
-            'bluetoothPairedDeviceItemCaseTrueWirelessBatteryPercentage',
-            batteryPercentage);
-      case BatteryType.RIGHT_BUD:
-        return this.i18n(
-            'bluetoothPairedDeviceItemRightBudTrueWirelessBatteryPercentage',
-            batteryPercentage);
-    }
-
-    return '';
-  }
-
-  /**
-   * @param {!chromeos.bluetoothConfig.mojom.BluetoothDeviceProperties}
-   *     device
-   * @param {!BatteryType} batteryType
-   * @return {string}
-   * @private
-   */
-  getBatteryIcon_(device, batteryType) {
-    const batteryPercentage = getBatteryPercentage(device, batteryType);
-    if (batteryPercentage === undefined) {
-      return '';
-    }
-
-    // Range should always find a value because this element should not be
-    // showing if batteryPercentage is out of bounds.
-    const range = BATTERY_ICONS_RANGES.find(range => {
-      return range[0] <= batteryPercentage && batteryPercentage <= range[1];
-    });
-    assert(
-        !!range && range.length === 2, 'Battery percentage range is invalid');
-
-    return 'bluetooth:battery-' + range[0] + '-' + range[1];
-  }
-
-  /** @return {boolean} */
-  getIsLowBatteryForTest() {
-    return this.isDefaultLowBattery_;
-  }
-
-  /** @return {boolean} */
-  getIsLeftBudLowBatteryForTest() {
-    return this.isLeftBudLowBattery_;
-  }
-
-  /** @return {boolean} */
-  getIsRightBudLowBatteryForTest() {
-    return this.isRightBudLowBattery_;
-  }
-
-  /** @return {boolean} */
-  getIsCaseLowBatteryForTest() {
-    return this.isCaseLowBattery_;
-  }
 }
 
 customElements.define(
diff --git a/weblayer/browser/browser_impl.cc b/weblayer/browser/browser_impl.cc
index 4816d84..61e36c5 100644
--- a/weblayer/browser/browser_impl.cc
+++ b/weblayer/browser/browser_impl.cc
@@ -356,7 +356,8 @@
 }
 
 bool BrowserImpl::IsRestoringPreviousState() {
-  return browser_persister_ && browser_persister_->is_restore_in_progress();
+  return is_minimal_restore_in_progress_ ||
+         (browser_persister_ && browser_persister_->is_restore_in_progress());
 }
 
 void BrowserImpl::AddObserver(BrowserObserver* observer) {
diff --git a/weblayer/browser/browser_impl.h b/weblayer/browser/browser_impl.h
index 227f99e..755f1b57 100644
--- a/weblayer/browser/browser_impl.h
+++ b/weblayer/browser/browser_impl.h
@@ -61,6 +61,10 @@
   // Called from BrowserPersister when restore has completed.
   void OnRestoreCompleted();
 
+  void set_is_minimal_restore_in_progress(bool value) {
+    is_minimal_restore_in_progress_ = value;
+  }
+
 #if BUILDFLAG(IS_ANDROID)
   bool CompositorHasSurface();
 
@@ -171,6 +175,7 @@
   std::string persistence_id_;
   std::unique_ptr<BrowserPersister> browser_persister_;
   base::OnceClosure visible_security_state_changed_callback_for_tests_;
+  bool is_minimal_restore_in_progress_ = false;
 };
 
 }  // namespace weblayer
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
index 607d7ce..ff80ded1 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
@@ -558,7 +558,12 @@
 
     @Override
     public boolean isRestoringPreviousState() {
-        return BrowserImplJni.get().isRestoringPreviousState(mNativeBrowser);
+        // In the case of minimal restore, the C++ side will return true if actively restoring
+        // minimal state. By returning true if mMinimalPersistenceInfo is non-null,
+        // isRestoringPreviousState() will return true from the the time the fragment is created
+        // until start.
+        return mMinimalPersistenceInfo != null
+                || BrowserImplJni.get().isRestoringPreviousState(mNativeBrowser);
     }
 
     @CalledByNative
@@ -601,6 +606,11 @@
             boolean setActiveResult = setActiveTab(createTab());
             assert setActiveResult;
         }
+        try {
+            onRestoreCompleted();
+        } catch (RemoteException e) {
+            throw new APICallException(e);
+        }
     }
 
     public void onFragmentStart() {
diff --git a/weblayer/browser/persistence/minimal_browser_persister.cc b/weblayer/browser/persistence/minimal_browser_persister.cc
index dbffb8e5..0a5f554 100644
--- a/weblayer/browser/persistence/minimal_browser_persister.cc
+++ b/weblayer/browser/persistence/minimal_browser_persister.cc
@@ -363,7 +363,9 @@
 void RestoreMinimalStateForBrowser(BrowserImpl* browser,
                                    const std::vector<uint8_t>& value) {
   MinimalRestorer restorer(value);
+  browser->set_is_minimal_restore_in_progress(true);
   RestoreBrowserState(browser, restorer.RestoreCommands());
+  browser->set_is_minimal_restore_in_progress(false);
 }
 
 }  // namespace weblayer
diff --git a/weblayer/browser/persistence/minimal_browser_persister_browsertest.cc b/weblayer/browser/persistence/minimal_browser_persister_browsertest.cc
index e4f9e7ce..8066e01 100644
--- a/weblayer/browser/persistence/minimal_browser_persister_browsertest.cc
+++ b/weblayer/browser/persistence/minimal_browser_persister_browsertest.cc
@@ -15,6 +15,7 @@
 #include "weblayer/browser/persistence/minimal_browser_persister.h"
 #include "weblayer/browser/profile_impl.h"
 #include "weblayer/browser/tab_impl.h"
+#include "weblayer/public/browser_observer.h"
 #include "weblayer/public/navigation.h"
 #include "weblayer/public/navigation_controller.h"
 #include "weblayer/public/tab.h"
@@ -25,7 +26,8 @@
 
 namespace weblayer {
 
-class MinimalBrowserPersisterTest : public WebLayerBrowserTest {
+class MinimalBrowserPersisterTest : public WebLayerBrowserTest,
+                                    public BrowserObserver {
  public:
   MinimalBrowserPersisterTest() = default;
   ~MinimalBrowserPersisterTest() override = default;
@@ -58,18 +60,29 @@
         browser_impl()->GetMinimalPersistenceState(
             max_number_of_navigations_per_tab, max_size_in_bytes);
     tab_ = nullptr;
+    got_on_tab_added_ = false;
     browser_ = Browser::Create(GetProfile(), nullptr);
+    browser_->AddObserver(this);
     RestoreMinimalStateForBrowser(browser_impl(), minimal_state);
+    EXPECT_TRUE(got_on_tab_added_);
+    browser_->RemoveObserver(this);
     // There is always at least one tab created (even if restore fails).
     ASSERT_GE(browser_->GetTabs().size(), 1u);
     tab_ = static_cast<TabImpl*>(browser_->GetTabs()[0]);
   }
 
+  // BrowserObserver:
+  void OnTabAdded(Tab* tab) override {
+    got_on_tab_added_ = true;
+    EXPECT_TRUE(browser_->IsRestoringPreviousState());
+  }
+
  protected:
   BrowserImpl* browser_impl() {
     return static_cast<BrowserImpl*>(browser_.get());
   }
 
+  bool got_on_tab_added_ = false;
   std::unique_ptr<Browser> browser_;
   raw_ptr<TabImpl> tab_ = nullptr;
 };
diff --git a/weblayer/browser/site_isolation_browsertest.cc b/weblayer/browser/site_isolation_browsertest.cc
index 89b33aa..e5ba5810 100644
--- a/weblayer/browser/site_isolation_browsertest.cc
+++ b/weblayer/browser/site_isolation_browsertest.cc
@@ -49,7 +49,7 @@
     auto* list =
         prefs->GetList(site_isolation::prefs::kUserTriggeredIsolatedOrigins);
     std::vector<std::string> sites;
-    for (const base::Value& value : list->GetList())
+    for (const base::Value& value : list->GetListDeprecated())
       sites.push_back(value.GetString());
     return sites;
   }
diff --git a/weblayer/browser/webui/net_export_ui.cc b/weblayer/browser/webui/net_export_ui.cc
index 4437d41..90c3111 100644
--- a/weblayer/browser/webui/net_export_ui.cc
+++ b/weblayer/browser/webui/net_export_ui.cc
@@ -72,7 +72,7 @@
   }
 
   void OnStartNetLog(const base::ListValue* list) {
-    base::Value::ConstListView params = list->GetList();
+    base::Value::ConstListView params = list->GetListDeprecated();
 
     // Determine the capture mode.
     if (!params.empty() && params[0].is_string()) {
diff --git a/weblayer/public/browser.h b/weblayer/public/browser.h
index 866994a..b758904 100644
--- a/weblayer/public/browser.h
+++ b/weblayer/public/browser.h
@@ -66,8 +66,7 @@
   virtual std::vector<uint8_t> GetMinimalPersistenceState() = 0;
 
   // Returns true if this Browser is in the process of restoring the previous
-  // state. That is, PersistenceInfo was supplied to the constructor and
-  // the state is asynchronously being loaded.
+  // state.
   virtual bool IsRestoringPreviousState() = 0;
 
   virtual void AddObserver(BrowserObserver* observer) = 0;